161 lines · plain
1# REQUIRES: riscv2## Relax R_RISCV_CALL and R_RISCV_CALL_PLT.3 4# RUN: rm -rf %t && split-file %s %t && cd %t5 6## Without RVC7# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax a.s -o a.32.o8# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax b.s -o b.32.o9# RUN: ld.lld -shared -soname=b.so b.32.o -o b.32.so10# RUN: ld.lld -T lds a.32.o b.32.so -o 3211# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32 | FileCheck %s --check-prefix=NORVC12 13# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax a.s -o a.64.o14# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax b.s -o b.64.o15# RUN: ld.lld -shared -soname=b.so b.64.o -o b.64.so16# RUN: ld.lld -T lds a.64.o b.64.so -o 6417# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64 | FileCheck %s --check-prefix=NORVC18 19## RVC20# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+c,+relax a.s -o a.32c.o21# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+c,+relax b.s -o b.32c.o22# RUN: ld.lld -shared -soname=b.so b.32c.o -o b.32c.so23# RUN: ld.lld -T lds a.32c.o b.32c.so -o 32c24# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32c | FileCheck %s --check-prefixes=RVC,RVC3225 26# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax a.s -o a.64c.o27# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax b.s -o b.64c.o28# RUN: ld.lld -shared -soname=b.so b.64c.o -o b.64c.so29# RUN: ld.lld -T lds a.64c.o b.64c.so -o 64c30# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64c | FileCheck %s --check-prefixes=RVC,RVC6431 32## --no-relax disables relaxation.33# RUN: ld.lld -T lds a.64.o b.64.so --no-relax -o 64.norelax34# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64.norelax | FileCheck %s --check-prefixes=NORELAX35 36# NORVC: 00010000 g .text {{0*}}0000001c _start37# NORVC: 0001001c g .text {{0*}}00000000 _start_end38# NORVC: 00010808 g .mid {{0*}}00000000 mid_end39# NORVC: 00110016 g .high {{0*}}00000000 high_end40 41# NORVC-LABEL: <_start>:42# NORVC-NEXT: 10000: jal zero, {{.*}} <a>43# NORVC-NEXT: jal zero, {{.*}} <a>44# NORVC-NEXT: addi zero, zero, 0x045# NORVC-NEXT: addi zero, zero, 0x046# NORVC-NEXT: 10010: jal ra, {{.*}} <a>47# NORVC-NEXT: jal ra, 0x1042048# NORVC-EMPTY:49 50# NORVC-LABEL: <.mid>:51# NORVC-NEXT: 10800: jal ra, {{.*}} <_start>52# NORVC-NEXT: jal ra, {{.*}} <_start>53# NORVC-EMPTY:54 55# NORVC-LABEL: <.mid2>:56# NORVC-NEXT: 1080c: jal ra, {{.*}} <_start>57# NORVC-EMPTY:58 59# NORVC-LABEL: <.high>:60# NORVC-NEXT: 110006: auipc ra, 0xfff0061# NORVC-NEXT: jalr ra, -0x6(ra)62# NORVC-NEXT: auipc ra, 0xfff0063# NORVC-NEXT: jalr ra, -0xe(ra)64# NORVC-EMPTY:65 66# RVC32: 00010000 g .text 00000016 _start67# RVC32: 00010016 g .text 00000000 _start_end68# RVC32: 00010806 g .mid 00000000 mid_end69# RVC32: 0011000c g .high 00000000 high_end70# RVC64: 0000000000010000 g .text 000000000000001a _start71# RVC64: 000000000001001a g .text 0000000000000000 _start_end72# RVC64: 0000000000010808 g .mid 0000000000000000 mid_end73# RVC64: 0000000000110014 g .high 0000000000000000 high_end74 75# RVC-LABEL: <_start>:76# RVC-NEXT: 10000: c.j {{.*}} <a>77# RVC-NEXT: c.j {{.*}} <a>78# RVC-NEXT: addi zero, zero, 0x079# RVC-NEXT: addi zero, zero, 0x080# RVC-NEXT: addi zero, zero, 0x081# RVC32-NEXT: 10010: c.jal {{.*}} <a>82# RVC32-NEXT: c.jal 0x1042083# RVC64-NEXT: 10010: jal ra, {{.*}} <a>84# RVC64-NEXT: jal ra, 0x1042085# RVC-EMPTY:86# RVC-NEXT: <a>:87# RVC-NEXT: c.jr ra88# RVC-EMPTY:89 90# RVC-LABEL: <.mid>:91# RVC32-NEXT: 10800: c.jal {{.*}} <_start>92# RVC64-NEXT: 10800: jal ra, {{.*}} <_start>93# RVC-NEXT: jal ra, {{.*}} <_start>94# RVC-EMPTY:95 96# RVC-LABEL: <.mid2>:97# RVC32-NEXT: 1080a: jal ra, {{.*}} <_start>98# RVC64-NEXT: 1080c: jal ra, {{.*}} <_start>99# RVC-EMPTY:100 101# RVC-LABEL: <.high>:102# RVC32-NEXT: 110000: jal ra, 0x10000 <_start>103# RVC32-NEXT: auipc ra, 0xfff00104# RVC32-NEXT: jalr ra, -0x4(ra)105# RVC64-NEXT: 110004: auipc ra, 0xfff00106# RVC64-NEXT: jalr ra, -0x4(ra)107# RVC64-NEXT: auipc ra, 0xfff00108# RVC64-NEXT: jalr ra, -0xc(ra)109# RVC-EMPTY:110 111# NORELAX-LABEL: <_start>:112# NORELAX-NEXT: 10000: auipc t1, 0x0113# NORELAX-NEXT: jalr zero, 0x20(t1)114# NORELAX-NEXT: auipc t0, 0x0115# NORELAX-NEXT: jalr zero, 0x18(t0)116# NORELAX-NEXT: 10010: auipc ra, 0x0117# NORELAX-NEXT: jalr ra, 0x10(ra)118# NORELAX-NEXT: auipc ra, 0x0119# NORELAX-NEXT: jalr ra, 0x408(ra)120# NORELAX-EMPTY:121 122#--- a.s123.global _start, _start_end124_start:125 tail a@plt126 jump a, t0127.balign 16128 call a # rv32c: c.jal; rv64c: jal129 call bar # PLT call can be relaxed. rv32c: c.jal; rv64c: jal130 131a:132 ret133.size _start, . - _start134_start_end:135 136.section .mid,"ax",@progbits137 call _start@plt # rv32c: c.jal; rv64c: jal138 call _start@plt139 140.section .mid2,"ax",@progbits141 call _start@plt142 143.section .high,"ax",@progbits144 call _start@plt # relaxable for %t/32c145 call _start@plt # not relaxed146 147#--- b.s148.globl bar149bar:150 ret151 152#--- lds153SECTIONS {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 = .; }160}161