198 lines · plain
1# REQUIRES: riscv2# RUN: rm -rf %t && split-file %s %t && cd %t3# RUN: llvm-mc -filetype=obj -triple=riscv64 --defsym PAD=0 -mattr=+c,+relax a.s -o a.64.o4# RUN: llvm-mc -filetype=obj -triple=riscv64 --defsym PAD=5000 -mattr=+c,+relax a.s -o aa.64.o5# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax c.s -o c.64.o6# RUN: ld.lld -shared -soname=c.64.so c.64.o -o c.64.so7 8# RUN: ld.lld -shared -z now a.64.o c.64.o -o a.64.so -z separate-code9# RUN: llvm-objdump --no-show-raw-insn -M no-aliases -h -d a.64.so | FileCheck %s --check-prefix=GD6410 11## Test the TLSDESC to LE optimization. Also check --emit-relocs.12# RUN: ld.lld -e 0 -z now a.64.o c.64.o -o a.64.le -z separate-code --emit-relocs13# RUN: llvm-objdump --no-show-raw-insn -M no-aliases -hdr a.64.le | FileCheck %s --check-prefix=LE6414# RUN: ld.lld -e 0 -z now aa.64.o c.64.o -o aa.64.le -z separate-code15# RUN: llvm-objdump --no-show-raw-insn -M no-aliases -h -d aa.64.le | FileCheck %s --check-prefix=LE64A16 17## Test the TLSDESC to IE optimization.18# RUN: ld.lld -e 0 -z now a.64.o c.64.so -o a.64.ie -z separate-code19# RUN: llvm-objdump --no-show-raw-insn -M no-aliases -h -d a.64.ie | FileCheck %s --check-prefix=IE6420 21# GD64: .got 00000018 00000000000020c022# GD64-LABEL: <_start>:23# GD64-NEXT: jal {{.*}} <foo>24# GD64-LABEL: <foo>:25## &.got[c]-. = 0x20c0+8 - 0x1004 = 0x10c426# GD64: 1004: auipc a2, 0x127# GD64-NEXT: c.add a7, a728# GD64-NEXT: ld a3, 0xc4(a2)29# GD64-NEXT: c.add a7, a730# GD64-NEXT: addi a0, a2, 0xc431# GD64-NEXT: c.add a7, a732# GD64-NEXT: jalr t0, 0x0(a3)33# GD64-NEXT: c.add a0, tp34# GD64-NEXT: jal {{.*}} <foo>35## &.got[c]-. = 0x20c0+8 - 0x1020 = 0x10a836# GD64-LABEL: <.Ltlsdesc_hi1>:37# GD64-NEXT: 1020: auipc a4, 0x138# GD64-NEXT: ld a5, 0xa8(a4)39# GD64-NEXT: addi a0, a4, 0xa840# GD64-NEXT: jalr t0, 0x0(a5)41# GD64-NEXT: c.add a0, tp42## &.got[c]-. = 0x20c0+8 - 0x1032 = 0x109643# GD64-LABEL: <.Ltlsdesc_hi2>:44# GD64-NEXT: 1032: auipc a6, 0x145# GD64-NEXT: ld a7, 0x96(a6)46# GD64-NEXT: addi a0, a6, 0x9647# GD64-NEXT: jalr t0, 0x0(a7)48# GD64-NEXT: c.add a0, tp49 50# LE64-LABEL: <_start>:51# LE64-NEXT: jal {{.*}} <foo>52# LE64-LABEL: <foo>:53# LE64-NEXT: c.add a7, a754# LE64-NEXT: R_RISCV_TLSDESC_HI20 b55# LE64-NEXT: R_RISCV_RELAX *ABS*56# LE64-NEXT: c.add a7, a757# LE64-NEXT: R_RISCV_TLSDESC_LOAD_LO12 .Ltlsdesc_hi058# LE64-NEXT: R_RISCV_RELAX *ABS*59# LE64-NEXT: 11008: c.add a7, a760# LE64-NEXT: R_RISCV_TLSDESC_ADD_LO12 .Ltlsdesc_hi061# LE64-NEXT: R_RISCV_RELAX *ABS*62# LE64-NEXT: addi a0, zero, 0x7ff63# LE64-NEXT: R_RISCV_TLSDESC_CALL .Ltlsdesc_hi064# LE64-NEXT: R_RISCV_RELAX *ABS*65# LE64-NEXT: c.add a0, tp66# LE64-NEXT: jal {{.*}} <foo>67# LE64-NEXT: R_RISCV_JAL foo68# LE64-NEXT: R_RISCV_RELAX *ABS*69# LE64-LABEL: <.Ltlsdesc_hi1>:70# LE64-NEXT: addi a0, zero, 0x7ff71# LE64-NEXT: R_RISCV_TLSDESC_HI20 b72# LE64-NEXT: R_RISCV_RELAX *ABS*73# LE64-NEXT: R_RISCV_TLSDESC_LOAD_LO12 .Ltlsdesc_hi174# LE64-NEXT: R_RISCV_TLSDESC_ADD_LO12 .Ltlsdesc_hi175# LE64-NEXT: R_RISCV_TLSDESC_CALL .Ltlsdesc_hi176# LE64-NEXT: c.add a0, tp77# LE64-LABEL: <.Ltlsdesc_hi2>:78# LE64-NEXT: addi zero, zero, 0x079# LE64-NEXT: R_RISCV_TLSDESC_HI20 b80# LE64-NEXT: addi zero, zero, 0x081# LE64-NEXT: R_RISCV_TLSDESC_LOAD_LO12 .Ltlsdesc_hi282# LE64-NEXT: R_RISCV_RELAX *ABS*83# LE64-NEXT: addi zero, zero, 0x084# LE64-NEXT: R_RISCV_TLSDESC_ADD_LO12 .Ltlsdesc_hi285# LE64-NEXT: R_RISCV_RELAX *ABS*86# LE64-NEXT: addi a0, zero, 0x7ff87# LE64-NEXT: R_RISCV_TLSDESC_CALL .Ltlsdesc_hi288# LE64-NEXT: c.add a0, tp89 90# LE64A-LABEL: <_start>:91# LE64A-NEXT: jal {{.*}} <foo>92# LE64A-LABEL: <foo>:93# LE64A-NEXT: c.add a7, a794# LE64A-NEXT: c.add a7, a795# LE64A-NEXT: 11008: lui a0, 0x296# LE64A-NEXT: c.add a7, a797# LE64A-NEXT: addi a0, a0, -0x47998# LE64A-NEXT: c.add a0, tp99# LE64A-NEXT: jal {{.*}} <foo>100# LE64A-LABEL: <.Ltlsdesc_hi1>:101# LE64A-NEXT: lui a0, 0x2102# LE64A-NEXT: addi a0, a0, -0x479103# LE64A-NEXT: c.add a0, tp104# LE64A-LABEL: <.Ltlsdesc_hi2>:105# LE64A-NEXT: addi zero, zero, 0x0106# LE64A-NEXT: addi zero, zero, 0x0107# LE64A-NEXT: lui a0, 0x2108# LE64A-NEXT: addi a0, a0, -0x479109# LE64A-NEXT: c.add a0, tp110 111# IE64: .got 00000010 00000000000120e0112# IE64-LABEL: <_start>:113# IE64-NEXT: jal {{.*}} <foo>114# IE64-LABEL: <foo>:115# IE64-NEXT: c.add a7, a7116# IE64-NEXT: c.add a7, a7117## &.got[c]-. = 0x120e0+8 - 0x11008 = 0x10e0118# IE64-NEXT: 11008: auipc a0, 0x1119# IE64-NEXT: c.add a7, a7120# IE64-NEXT: ld a0, 0xe0(a0)121# IE64-NEXT: c.add a0, tp122# IE64-NEXT: jal {{.*}} <foo>123## &.got[c]-. = 0x120e0+8 - 0x11018 = 0x10d0124# IE64-LABEL: <.Ltlsdesc_hi1>:125# IE64-NEXT: 11018: auipc a0, 0x1126# IE64-NEXT: ld a0, 0xd0(a0)127# IE64-NEXT: c.add a0, tp128## &.got[c]-. = 0x120e0+8 - 0x1102a = 0x10be129# IE64-LABEL: <.Ltlsdesc_hi2>:130# IE64-NEXT: addi zero, zero, 0x0131# IE64-NEXT: addi zero, zero, 0x0132# IE64-NEXT: 1102a: auipc a0, 0x1133# IE64-NEXT: ld a0, 0xbe(a0)134# IE64-NEXT: c.add a0, tp135 136#--- a.s137.globl _start138_start:139.balign 16140 call foo141 142foo:143.Ltlsdesc_hi0:144.option norelax145## All 4 instructions have an R_RISCV_RELAX.146## Check that optimization/relaxation are not affected by irrelevant instructions.147 auipc a2, %tlsdesc_hi(b)148 .reloc .-4, R_RISCV_RELAX, 0149 c.add a7, a7150 ld a3, %tlsdesc_load_lo(.Ltlsdesc_hi0)(a2)151 .reloc .-4, R_RISCV_RELAX, 0152 c.add a7, a7153 addi a0, a2, %tlsdesc_add_lo(.Ltlsdesc_hi0)154 .reloc .-4, R_RISCV_RELAX, 0155 c.add a7, a7156 jalr t0, 0(a3), %tlsdesc_call(.Ltlsdesc_hi0)157 .reloc .-4, R_RISCV_RELAX, 0158 add a0, a0, tp159.option relax160 161 call foo162 163.Ltlsdesc_hi1:164.option norelax165## AUIPC has an R_RISCV_RELAX. We perform relaxation, ignoring whether other166## instructions have R_RISCV_RELAX.167 auipc a4, %tlsdesc_hi(b)168 .reloc .-4, R_RISCV_RELAX, 0169 ld a5, %tlsdesc_load_lo(.Ltlsdesc_hi1)(a4)170 addi a0, a4, %tlsdesc_add_lo(.Ltlsdesc_hi1)171 jalr t0, 0(a5), %tlsdesc_call(.Ltlsdesc_hi1)172 add a0, a0, tp173.option relax174 175.Ltlsdesc_hi2:176.option norelax177## AUIPC does not have R_RISCV_RELAX. No relaxation.178 auipc a6, %tlsdesc_hi(b)179 ld a7, %tlsdesc_load_lo(.Ltlsdesc_hi2)(a6)180 .reloc .-4, R_RISCV_RELAX, 0181 addi a0, a6, %tlsdesc_add_lo(.Ltlsdesc_hi2)182 .reloc .-4, R_RISCV_RELAX, 0183 jalr t0, 0(a7), %tlsdesc_call(.Ltlsdesc_hi2)184 add a0, a0, tp185.option relax186 187.section .tbss188.globl a189.zero 8190a:191.zero 2039+PAD ## Place b at 0x7ff+PAD192 193#--- c.s194.tbss195.globl b196b:197.zero 4198