2 ## Relax R_RISCV_CALL and R_RISCV_CALL_PLT.
4 # RUN: rm -rf %t && split-file %s %t && cd %t
7 # RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax a.s -o a.32.o
8 # RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax b.s -o b.32.o
9 # RUN: ld.lld -shared -soname=b.so b.32.o -o b.32.so
10 # RUN: ld.lld -T lds a.32.o b.32.so -o 32
11 # RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32 | FileCheck %s --check-prefix=NORVC
13 # RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax a.s -o a.64.o
14 # RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax b.s -o b.64.o
15 # RUN: ld.lld -shared -soname=b.so b.64.o -o b.64.so
16 # RUN: ld.lld -T lds a.64.o b.64.so -o 64
17 # RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64 | FileCheck %s --check-prefix=NORVC
20 # RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+c,+relax a.s -o a.32c.o
21 # RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+c,+relax b.s -o b.32c.o
22 # RUN: ld.lld -shared -soname=b.so b.32c.o -o b.32c.so
23 # RUN: ld.lld -T lds a.32c.o b.32c.so -o 32c
24 # RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32c | FileCheck %s --check-prefixes=RVC,RVC32
26 # RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax a.s -o a.64c.o
27 # RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax b.s -o b.64c.o
28 # RUN: ld.lld -shared -soname=b.so b.64c.o -o b.64c.so
29 # RUN: ld.lld -T lds a.64c.o b.64c.so -o 64c
30 # RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64c | FileCheck %s --check-prefixes=RVC,RVC64
32 ## --no-relax disables relaxation.
33 # RUN: ld.lld -T lds a.64.o b.64.so --no-relax -o 64.norelax
34 # RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64.norelax | FileCheck %s --check-prefixes=NORELAX
36 # NORVC: 00010000 g .text {{0*}}0000001c _start
37 # NORVC: 0001001c g .text {{0*}}00000000 _start_end
38 # NORVC: 00010808 g .mid {{0*}}00000000 mid_end
39 # NORVC: 00110016 g .high {{0*}}00000000 high_end
41 # NORVC-LABEL: <_start>:
42 # NORVC-NEXT: 10000: jal zero, {{.*}} <a>
43 # NORVC-NEXT: jal zero, {{.*}} <a>
44 # NORVC-NEXT: addi zero, zero, 0x0
45 # NORVC-NEXT: addi zero, zero, 0x0
46 # NORVC-NEXT: 10010: jal ra, {{.*}} <a>
47 # NORVC-NEXT: jal ra, 0x10420
50 # NORVC-LABEL: <.mid>:
51 # NORVC-NEXT: 10800: jal ra, {{.*}} <_start>
52 # NORVC-NEXT: jal ra, {{.*}} <_start>
55 # NORVC-LABEL: <.mid2>:
56 # NORVC-NEXT: 1080c: jal ra, {{.*}} <_start>
59 # NORVC-LABEL: <.high>:
60 # NORVC-NEXT: 110006: auipc ra, 0xfff00
61 # NORVC-NEXT: jalr ra, -0x6(ra)
62 # NORVC-NEXT: auipc ra, 0xfff00
63 # NORVC-NEXT: jalr ra, -0xe(ra)
66 # RVC32: 00010000 g .text 00000016 _start
67 # RVC32: 00010016 g .text 00000000 _start_end
68 # RVC32: 00010806 g .mid 00000000 mid_end
69 # RVC32: 0011000c g .high 00000000 high_end
70 # RVC64: 0000000000010000 g .text 000000000000001a _start
71 # RVC64: 000000000001001a g .text 0000000000000000 _start_end
72 # RVC64: 0000000000010808 g .mid 0000000000000000 mid_end
73 # RVC64: 0000000000110014 g .high 0000000000000000 high_end
75 # RVC-LABEL: <_start>:
76 # RVC-NEXT: 10000: c.j {{.*}} <a>
77 # RVC-NEXT: c.j {{.*}} <a>
78 # RVC-NEXT: addi zero, zero, 0x0
79 # RVC-NEXT: addi zero, zero, 0x0
80 # RVC-NEXT: addi zero, zero, 0x0
81 # RVC32-NEXT: 10010: c.jal {{.*}} <a>
82 # RVC32-NEXT: c.jal 0x10420
83 # RVC64-NEXT: 10010: jal ra, {{.*}} <a>
84 # RVC64-NEXT: jal ra, 0x10420
91 # RVC32-NEXT: 10800: c.jal {{.*}} <_start>
92 # RVC64-NEXT: 10800: jal ra, {{.*}} <_start>
93 # RVC-NEXT: jal ra, {{.*}} <_start>
97 # RVC32-NEXT: 1080a: jal ra, {{.*}} <_start>
98 # RVC64-NEXT: 1080c: jal ra, {{.*}} <_start>
101 # RVC-LABEL: <.high>:
102 # RVC32-NEXT: 110000: jal ra, 0x10000 <_start>
103 # RVC32-NEXT: auipc ra, 0xfff00
104 # RVC32-NEXT: jalr ra, -0x4(ra)
105 # RVC64-NEXT: 110004: auipc ra, 0xfff00
106 # RVC64-NEXT: jalr ra, -0x4(ra)
107 # RVC64-NEXT: auipc ra, 0xfff00
108 # RVC64-NEXT: jalr ra, -0xc(ra)
111 # NORELAX-LABEL: <_start>:
112 # NORELAX-NEXT: 10000: auipc t1, 0x0
113 # NORELAX-NEXT: jalr zero, 0x20(t1)
114 # NORELAX-NEXT: auipc t0, 0x0
115 # NORELAX-NEXT: jalr zero, 0x18(t0)
116 # NORELAX-NEXT: 10010: auipc ra, 0x0
117 # NORELAX-NEXT: jalr ra, 0x10(ra)
118 # NORELAX-NEXT: auipc ra, 0x0
119 # NORELAX-NEXT: jalr ra, 0x408(ra)
123 .global _start, _start_end
128 call
a # rv32c: c.jal; rv64c: jal
129 call bar
# PLT call can be relaxed. rv32c: c.jal; rv64c: jal
133 .size _start, . - _start
136 .section .mid,"ax",@progbits
137 call _start@plt
# rv32c: c.jal; rv64c: jal
140 .section .mid2,"ax",@progbits
143 .section .high,"ax",@progbits
144 call _start@plt
# relaxable for %t/32c
145 call _start@plt
# not relaxed
154 .text 0x10000 : { *(.text) }
155 .plt 0x10400 : { *(.plt) }
156 .mid 0x10800 : { *(.mid); mid_end = .; }
157 .mid2 mid_end+4 : { *(.mid2) }
158 # 22 is the size of _start in %t/32c (RVC32).
159 .high 0x110000+(_start_end-_start)-22 : { *(.high); high_end = .; }