Skip to content

Commit f227ae5

Browse files
committed
modify test for call36/tail36.
1 parent f1f995b commit f227ae5

File tree

3 files changed

+259
-0
lines changed

3 files changed

+259
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# REQUIRES: loongarch
2+
# RUN: rm -rf %t && split-file %s %t && cd %t
3+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.o
4+
5+
# RUN: ld.lld -T lds a.o -o a
6+
# RUN: llvm-objdump -d --no-show-raw-insn a | FileCheck %s --check-prefixes=RELAX,RELAX-MID
7+
8+
## Unsure whether this needs a diagnostic. GNU ld allows this.
9+
# RUN: ld.lld -T lds -pie a.o -o a.pie
10+
# RUN: llvm-objdump -d --no-show-raw-insn a.pie | FileCheck %s --check-prefixes=RELAX,RELAX-MID
11+
12+
# RUN: ld.lld -T lds -pie -z notext -z ifunc-noplt a.o -o a.ifunc-noplt
13+
# RUN: llvm-objdump -d --no-show-raw-insn a.ifunc-noplt | FileCheck %s --check-prefixes=RELAX,NORELAX-MID
14+
15+
# RELAX-LABEL: <_start>:
16+
## offset = 0x10000000 - 0x8000000 = 0x8000000(134217728), hi=512, lo18=0
17+
# RELAX-NEXT: 8000000: pcaddu18i $ra, 512
18+
# RELAX-NEXT: jirl $ra, $ra, 0
19+
# RELAX-NEXT: bl 134217720
20+
# RELAX-NEXT: bl -134217728
21+
## offset = 12 - 0x8000010 = -0x8000004(-134217732), hi=512, lo18=-4
22+
# RELAX-NEXT: 8000010: pcaddu18i $ra, -512
23+
# RELAX-NEXT: jirl $ra, $ra, -4
24+
# RELAX-EMPTY:
25+
26+
# RELAX-MID-LABEL: <.mid>:
27+
## offset = 0x8010000 - 0x8008000 = 32768
28+
# RELAX-MID-NEXT: 8008000: bl 32768
29+
# RELAX-MID-NEXT: b 32764
30+
# RELAX-MID-EMPTY:
31+
32+
# NORELAX-MID-LABEL: <.mid>:
33+
# NORELAX-MID-NEXT: 8008000: pcaddu18i $ra, 0
34+
# NORELAX-MID-NEXT: jirl $ra, $ra, 0
35+
# NORELAX-MID-NEXT: pcaddu18i $t0, 0
36+
# NORELAX-MID-NEXT: jr $t0
37+
# NORELAX-MID-EMPTY:
38+
39+
#--- a.s
40+
.global _start, ifunc
41+
_start:
42+
call36 pos # exceed positive range (.text+0x7fffffc), not relaxed
43+
call36 pos # relaxed
44+
call36 neg # relaxed
45+
call36 neg # exceed negative range (.text+16-0x8000000), not relaxed
46+
47+
.section .mid,"ax",@progbits
48+
.balign 16
49+
call36 ifunc@plt # enable ifunc, not relaxed
50+
tail36 $t0, ifunc@plt # enable ifunc, not relaxed
51+
52+
.type ifunc, @gnu_indirect_function
53+
ifunc:
54+
ret
55+
56+
#--- lds
57+
SECTIONS {
58+
.text 0x8000000 : { *(.text) }
59+
.mid 0x8008000 : { *(.mid) }
60+
.iplt 0x8010000 : { *(.iplt) }
61+
}
62+
neg = 12;
63+
pos = 0x10000000;

lld/test/ELF/loongarch-relax-call36.s

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# REQUIRES: loongarch
2+
3+
# RUN: rm -rf %t && split-file %s %t && cd %t
4+
5+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.64.o
6+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax b.s -o b.64.o
7+
# RUN: ld.lld -shared -soname=b.so b.64.o -o b.64.so
8+
# RUN: ld.lld -T lds a.64.o b.64.so -o 64
9+
# RUN: llvm-objdump -td --no-show-raw-insn 64 | FileCheck %s --check-prefix=RELAX
10+
11+
## --no-relax disables relaxation.
12+
# RUN: ld.lld -T lds a.64.o b.64.so --no-relax -o 64.norelax
13+
# RUN: llvm-objdump -td --no-show-raw-insn 64.norelax | FileCheck %s --check-prefix=NORELAX
14+
15+
# RELAX: {{0*}}00010000 g .text {{0*}}0000001c _start
16+
# RELAX: {{0*}}0001001c g .text {{0*}}00000000 _start_end
17+
# RELAX: {{0*}}00010808 g .mid {{0*}}00000000 mid_end
18+
# RELAX: {{0*}}10010010 g .high {{0*}}00000000 high_end
19+
20+
# RELAX-LABEL: <_start>:
21+
## offset = 0x10018 - 0x10000 = 24
22+
# RELAX-NEXT: 10000: bl 24 <a>
23+
# RELAX-NEXT: b 20 <a>
24+
# RELAX-NEXT: nop
25+
# RELAX-NEXT: nop
26+
## offset = .plt(0x10400)+32 - 0x10010 = 1040
27+
# RELAX-NEXT: 10010: bl 1040 <bar+0x10420>
28+
# RELAX-NEXT: b 1036 <bar+0x10420>
29+
# RELAX-EMPTY:
30+
# RELAX-NEXT: <a>:
31+
# RELAX-NEXT: 10018: ret
32+
# RELAX-EMPTY:
33+
34+
# RELAX-LABEL: <.mid>:
35+
## offset = 0x10000 - 0x10800 = -2048
36+
# RELAX-NEXT: 10800: bl -2048 <_start>
37+
# RELAX-NEXT: b -2052 <_start>
38+
# RELAX-EMPTY:
39+
40+
# RELAX-LABEL: <.mid2>:
41+
## offset = 0x10000 - 0x1010000 = -16777216
42+
# RELAX-NEXT: 1010000: bl -16777216 <_start>
43+
# RELAX-NEXT: b -16777220 <_start>
44+
# RELAX-EMPTY:
45+
46+
# RELAX-LABEL: <.high>:
47+
## offset = 0x10000 - 0x10010000 = -0x10000000, hi=-1024, lo18=0
48+
# RELAX-NEXT: 10010000: pcaddu18i $ra, -1024
49+
# RELAX-NEXT: jirl $ra, $ra, 0
50+
# RELAX-NEXT: pcaddu18i $t0, -1024
51+
# RELAX-NEXT: jirl $zero, $t0, -8
52+
# RELAX-EMPTY:
53+
54+
55+
# NORELAX-LABEL: <_start>:
56+
## offset = 0x10020 - 0x10000 = 0x20, hi=0, lo18=32
57+
# NORELAX-NEXT: 10000: pcaddu18i $ra, 0
58+
# NORELAX-NEXT: jirl $ra, $ra, 32
59+
## offset = 0x10020 - 0x10008 = 0x18, hi=0, lo18=24
60+
# NORELAX-NEXT: 10008: pcaddu18i $t0, 0
61+
# NORELAX-NEXT: jirl $zero, $t0, 24
62+
## offset = .plt(0x10400)+32 - 0x10010 = 0x410, hi=0, lo18=1040
63+
# NORELAX-NEXT: 10010: pcaddu18i $ra, 0
64+
# NORELAX-NEXT: jirl $ra, $ra, 1040
65+
## offset = .plt(0x10400)+32 - 0x10018 = 0x408, hi=0, lo18=1032
66+
# NORELAX-NEXT: 10018: pcaddu18i $t0, 0
67+
# NORELAX-NEXT: jirl $zero, $t0, 1032
68+
# NORELAX-EMPTY:
69+
# NORELAX-NEXT: <a>:
70+
# NORELAX-NEXT: 10020: ret
71+
# NORELAX-EMPTY:
72+
73+
# NORELAX-LABEL: <.mid>:
74+
## offset = 0x10000 - 0x10800 = -0x800, hi=0, lo18=-2048
75+
# NORELAX-NEXT: 10800: pcaddu18i $ra, 0
76+
# NORELAX-NEXT: jirl $ra, $ra, -2048
77+
# NORELAX-NEXT: pcaddu18i $t0, 0
78+
# NORELAX-NEXT: jirl $zero, $t0, -2056
79+
# NORELAX-EMPTY:
80+
81+
# NORELAX-LABEL: <.mid2>:
82+
## offset = 0x10000 - 0x1010000 = -0x1000000, hi=-64, lo18=0
83+
# NORELAX-NEXT: 1010000: pcaddu18i $ra, -64
84+
# NORELAX-NEXT: jirl $ra, $ra, 0
85+
# NORELAX-NEXT: pcaddu18i $t0, -64
86+
# NORELAX-NEXT: jirl $zero, $t0, -8
87+
# NORELAX-EMPTY:
88+
89+
# NORELAX-LABEL: <.high>:
90+
## offset = 0x10000 - 0x10010000 = -0x10000000, hi=-1024, lo18=0
91+
# NORELAX-NEXT: 10010000: pcaddu18i $ra, -1024
92+
# NORELAX-NEXT: jirl $ra, $ra, 0
93+
# NORELAX-NEXT: pcaddu18i $t0, -1024
94+
# NORELAX-NEXT: jirl $zero, $t0, -8
95+
# NORELAX-EMPTY:
96+
97+
#--- a.s
98+
.global _start, _start_end
99+
_start:
100+
call36 a # relaxed. la64: bl
101+
tail36 $t0, a@plt # relaxed. la64: b
102+
.balign 16
103+
call36 bar # PLT call36 can be relaxed. la64: bl
104+
tail36 $t0, bar # PLT tail36 can be relaxed. la64: bl
105+
106+
a:
107+
ret
108+
.size _start, . - _start
109+
_start_end:
110+
111+
.section .mid,"ax",@progbits
112+
call36 _start@plt # relaxed. la64: bl
113+
tail36 $t0, _start@plt # relaxed. la64: b
114+
115+
.section .mid2,"ax",@progbits
116+
call36 _start@plt # relaxed. la64: bl
117+
tail36 $t0, _start@plt # relaxed. la64: b
118+
119+
.section .high,"ax",@progbits
120+
call36 _start@plt # exceed range, not relaxed
121+
tail36 $t0,_start@plt # exceed range, not relaxed
122+
123+
#--- b.s
124+
.globl bar
125+
bar:
126+
ret
127+
128+
#--- lds
129+
SECTIONS {
130+
.text 0x10000 : { *(.text) }
131+
.plt 0x10400 : { *(.plt) }
132+
.mid 0x10800 : { *(.mid); mid_end = .; }
133+
.mid2 0x1010000 : { *(.mid2) }
134+
.high 0x10010000 : { *(.high); high_end = .; }
135+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# REQUIRES: loongarch
2+
## Test that we can handle --emit-relocs while relaxing.
3+
## Call36 and tail36 need LA64 basic integer, so they donot have 32-bit version.
4+
5+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.64.o
6+
# RUN: ld.lld -Ttext=0x10000 --emit-relocs %t.64.o -o %t.64
7+
# RUN: llvm-objdump -dr %t.64 | FileCheck %s --check-prefix=RELAX
8+
9+
## -r should keep original relocations.
10+
# RUN: ld.lld -r %t.64.o -o %t.64.r
11+
# RUN: llvm-objdump -dr %t.64.r | FileCheck %s --check-prefix=CHECKR
12+
13+
## --no-relax should keep original relocations.
14+
# RUN: ld.lld -Ttext=0x10000 --emit-relocs --no-relax %t.64.o -o %t.64.norelax
15+
# RUN: llvm-objdump -dr %t.64.norelax | FileCheck %s --check-prefix=NORELAX
16+
17+
# RELAX: 00010000 <_start>:
18+
# RELAX-NEXT: bl 0
19+
# RELAX-NEXT: R_LARCH_B26 _start
20+
# RELAX-NEXT: R_LARCH_RELAX *ABS*
21+
# RELAX-NEXT: b -4
22+
# RELAX-NEXT: R_LARCH_B26 _start
23+
# RELAX-NEXT: R_LARCH_RELAX *ABS*
24+
# RELAX-NEXT: nop
25+
# RELAX-NEXT: R_LARCH_ALIGN *ABS*+0xc
26+
# RELAX-NEXT: nop
27+
# RELAX-NEXT: ret
28+
29+
# CHECKR: <_start>:
30+
# CHECKR-NEXT: pcaddu18i $ra, 0
31+
# CHECKR-NEXT: R_LARCH_CALL36 _start
32+
# CHECKR-NEXT: R_LARCH_RELAX *ABS*
33+
# CHECKR-NEXT: jirl $ra, $ra, 0
34+
# CHECKR-NEXT: pcaddu18i $t0, 0
35+
# CHECKR-NEXT: R_LARCH_CALL36 _start
36+
# CHECKR-NEXT: R_LARCH_RELAX *ABS*
37+
# CHECKR-NEXT: jr $t0
38+
# CHECKR-NEXT: nop
39+
# CHECKR-NEXT: R_LARCH_ALIGN *ABS*+0xc
40+
# CHECKR-NEXT: nop
41+
# CHECKR-NEXT: nop
42+
# CHECKR-NEXT: ret
43+
44+
# NORELAX: <_start>:
45+
# NORELAX-NEXT: pcaddu18i $ra, 0
46+
# NORELAX-NEXT: R_LARCH_CALL36 _start
47+
# NORELAX-NEXT: R_LARCH_RELAX *ABS*
48+
# NORELAX-NEXT: jirl $ra, $ra, 0
49+
# NORELAX-NEXT: pcaddu18i $t0, 0
50+
# NORELAX-NEXT: R_LARCH_CALL36 _start
51+
# NORELAX-NEXT: R_LARCH_RELAX *ABS*
52+
# NORELAX-NEXT: jirl $zero, $t0, -8
53+
# NORELAX-NEXT: ret
54+
# NORELAX-NEXT: R_LARCH_ALIGN *ABS*+0xc
55+
56+
.global _start
57+
_start:
58+
call36 _start
59+
tail36 $t0, _start
60+
.p2align 4
61+
ret

0 commit comments

Comments
 (0)