brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 5718d41 Raw
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