brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · 025cbc0 Raw
294 lines · plain
1# REQUIRES: loongarch2# RUN: rm -rf %t && split-file %s %t && cd %t3# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.64.o4# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax c.s -o c.64.o5# RUN: ld.lld --relax -shared -soname=c.64.so c.64.o -o c.64.so6 7## Test the TLSDESC relaxation.8# RUN: ld.lld --relax -shared -z now a.64.o c.64.o -o a.64.so9# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s10# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.so | FileCheck %s --check-prefix=GD6411 12## Transition from TLSDESC to IE/LE. Also check --emit-relocs.13# RUN: ld.lld -e 0 -z now --emit-relocs a.64.o c.64.o -o a.64.le14# RUN: llvm-readobj -r -x .got a.64.le 2>&1 | FileCheck --check-prefix=LE64-RELA %s15# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.le | FileCheck %s --check-prefix=LE6416 17# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.o -o a.64.le.norelax18# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.le.norelax | FileCheck %s --check-prefix=LE64-NORELAX19 20# RUN: ld.lld --relax -e 0 -z now --emit-relocs a.64.o c.64.so -o a.64.ie21# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s22# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.ie | FileCheck %s --check-prefix=IE6423 24# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.so -o a.64.ie.norelax25# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.ie.norelax | FileCheck %s --check-prefix=IE64-NORELAX26 27# GD64-RELA:      .rela.dyn {28# GD64-RELA-NEXT:   0x20460 R_LARCH_TLS_DESC64 - 0x7FF29# GD64-RELA-NEXT:   0x20430 R_LARCH_TLS_DESC64 a 0x030# GD64-RELA-NEXT:   0x20440 R_LARCH_TLS_DESC64 c 0x031# GD64-RELA-NEXT:   0x20450 R_LARCH_TLS_DESC64 d 0x032# GD64-RELA-NEXT: }33# GD64-RELA:      Hex dump of section '.got':34# GD64-RELA-NEXT: 0x00020430 00000000 00000000 00000000 00000000 .35# GD64-RELA-NEXT: 0x00020440 00000000 00000000 00000000 00000000 .36# GD64-RELA-NEXT: 0x00020450 00000000 00000000 00000000 00000000 .37# GD64-RELA-NEXT: 0x00020460 00000000 00000000 00000000 00000000 .38 39# GD64:   .got    00000040 000000000002043040 41## &.got[a]-. = 0x20430 - 0x10318 = 16454<<242# GD64:        10318: pcaddi  $a0, 1645443# GD64-NEXT:          ld.d    $ra, $a0, 044# GD64-NEXT:          jirl    $ra, $ra, 045# GD64-NEXT:          add.d   $a1, $a0, $tp46 47## &.got[b]-. = 0x20430+48 - 0x10328: 0x10 pages, page offset 0x46048## R_LARCH_RELAX does not appear in pairs. No relaxation.49# GD64:        10328: pcalau12i $a0, 1650# GD64-NEXT:          addi.d  $a0, $a0, 112051# GD64-NEXT:          ld.d    $ra, $a0, 052# GD64-NEXT:          jirl    $ra, $ra, 053# GD64-NEXT:          add.d   $a2, $a0, $tp54 55## &.got[c]-. = 0x20430+16 - 0x1033c: 0x10 pages, page offset 0x44056## Without R_LARCH_RELAX relocation. No relaxation.57# GD64:        1033c: pcalau12i $a0, 1658# GD64-NEXT:          addi.d  $t0, $zero, 059# GD64-NEXT:          addi.d  $a0, $a0, 108860# GD64-NEXT:          addi.d  $t0, $t0, 161# GD64-NEXT:          ld.d    $ra, $a0, 062# GD64-NEXT:          addi.d  $t0, $t0, 163# GD64-NEXT:          jirl    $ra, $ra, 064# GD64-NEXT:          add.d   $a3, $a0, $tp65 66## &.got[d]-. = 0x20430+32 - 0x1035c = 16445<<267# GD64:        1035c: pcaddi  $a0, 1644568# GD64-NEXT:          ld.d    $ra, $a0, 069# GD64-NEXT:          jirl    $ra, $ra, 070# GD64-NEXT:          add.d   $a4, $a0, $tp71 72# LE64-RELA: could not find section '.got'73 74## a@tprel = 0x875# LE64:        20158: ori     $a0, $zero, 876# LE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 a77# LE64-NEXT:            R_LARCH_RELAX *ABS*78# LE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 a79# LE64-NEXT:            R_LARCH_RELAX *ABS*80# LE64-NEXT:            R_LARCH_TLS_DESC_LD a81# LE64-NEXT:            R_LARCH_RELAX *ABS*82# LE64-NEXT:            R_LARCH_TLS_DESC_CALL a83# LE64-NEXT:            R_LARCH_RELAX *ABS*84# LE64-NEXT:          add.d   $a1, $a0, $tp85 86## b@tprel = 0x7ff87# LE64:        20160: nop88# LE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 b89# LE64-NEXT:            R_LARCH_RELAX *ABS*90# LE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 b91# LE64-NEXT:          nop92# LE64-NEXT:            R_LARCH_TLS_DESC_LD b93# LE64-NEXT:          ori     $a0, $zero, 204794# LE64-NEXT:            R_LARCH_TLS_DESC_CALL b95# LE64-NEXT:          add.d   $a2, $a0, $tp96 97## c@tprel = 0x80098## Without R_LARCH_RELAX relocation. No relaxation.99# LE64:        20170: nop100# LE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 c101# LE64-NEXT:          addi.d  $t0, $zero, 0102# LE64-NEXT:          nop103# LE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 c104# LE64-NEXT:          addi.d  $t0, $t0, 1105# LE64-NEXT:          nop106# LE64-NEXT:            R_LARCH_TLS_DESC_LD c107# LE64-NEXT:          addi.d  $t0, $t0, 1108# LE64-NEXT:          ori     $a0, $zero, 2048109# LE64-NEXT:            R_LARCH_TLS_DESC_CALL c110# LE64-NEXT:          add.d   $a3, $a0, $tp111 112## d@tprel = 0x1000113# LE64:        20190: lu12i.w $a0, 1114# LE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 d115# LE64-NEXT:            R_LARCH_RELAX *ABS*116# LE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 d117# LE64-NEXT:            R_LARCH_RELAX *ABS*118# LE64-NEXT:            R_LARCH_TLS_DESC_LD d119# LE64-NEXT:          ori     $a0, $a0, 0120# LE64-NEXT:            R_LARCH_TLS_DESC_CALL d121# LE64-NEXT:          add.d   $a4, $a0, $tp122 123## a@tprel = 0x8124# LE64-NORELAX:        20158: nop125# LE64-NORELAX-NEXT:          nop126# LE64-NORELAX-NEXT:          nop127# LE64-NORELAX-NEXT:          ori     $a0, $zero, 8128# LE64-NORELAX-NEXT:          add.d   $a1, $a0, $tp129 130## b@tprel = 0x7ff131# LE64-NORELAX:        2016c: nop132# LE64-NORELAX-NEXT:          nop133# LE64-NORELAX-NEXT:          nop134# LE64-NORELAX-NEXT:          ori     $a0, $zero, 2047135# LE64-NORELAX-NEXT:          add.d   $a2, $a0, $tp136 137## c@tprel = 0x800138## Without R_LARCH_RELAX relocation. No relaxation.139# LE64-NORELAX:        20180: nop140# LE64-NORELAX-NEXT:          addi.d  $t0, $zero, 0141# LE64-NORELAX-NEXT:          nop142# LE64-NORELAX-NEXT:          addi.d  $t0, $t0, 1143# LE64-NORELAX-NEXT:          nop144# LE64-NORELAX-NEXT:          addi.d  $t0, $t0, 1145# LE64-NORELAX-NEXT:          ori     $a0, $zero, 2048146# LE64-NORELAX-NEXT:          add.d   $a3, $a0, $tp147 148## d@tprel = 0x1000149# LE64-NORELAX:        201a0: nop150# LE64-NORELAX-NEXT:          nop151# LE64-NORELAX-NEXT:          lu12i.w $a0, 1152# LE64-NORELAX-NEXT:          ori     $a0, $a0, 0153# LE64-NORELAX-NEXT:          add.d   $a4, $a0, $tp154 155# IE64-RELA:      .rela.dyn {156# IE64-RELA-NEXT:   0x303F0 R_LARCH_TLS_TPREL64 c 0x0157# IE64-RELA-NEXT:   0x303F8 R_LARCH_TLS_TPREL64 d 0x0158# IE64-RELA-NEXT: }159# IE64-RELA:      Hex dump of section '.got':160# IE64-RELA-NEXT: 0x000303f0 00000000 00000000 00000000 00000000 .161 162# IE64:   .got           00000010 00000000000303f0163 164## a and b are optimized to use LE. c and d are optimized to IE.165## a@tprel = 0x8166# IE64:        202c8: ori     $a0, $zero, 8167# IE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 a168# IE64-NEXT:            R_LARCH_RELAX *ABS*169# IE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 a170# IE64-NEXT:            R_LARCH_RELAX *ABS*171# IE64-NEXT:            R_LARCH_TLS_DESC_LD a172# IE64-NEXT:            R_LARCH_RELAX *ABS*173# IE64-NEXT:            R_LARCH_TLS_DESC_CALL a174# IE64-NEXT:            R_LARCH_RELAX *ABS*175# IE64-NEXT:          add.d   $a1, $a0, $tp176 177## b@tprel = 0x7ff178# IE64:        202d0: nop179# IE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 b180# IE64-NEXT:            R_LARCH_RELAX *ABS*181# IE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 b182# IE64-NEXT:          nop183# IE64-NEXT:            R_LARCH_TLS_DESC_LD b184# IE64-NEXT:          ori     $a0, $zero, 2047185# IE64-NEXT:            R_LARCH_TLS_DESC_CALL b186# IE64-NEXT:          add.d   $a2, $a0, $tp187 188## &.got[c]-. = 0x303f0 - 0x202f0: 0x10 pages, page offset 0x3f0189## Without R_LARCH_RELAX relocation. No relaxation.190# IE64:        202e0: nop191# IE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 c192# IE64-NEXT:          addi.d  $t0, $zero, 0193# IE64-NEXT:          nop194# IE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 c195# IE64-NEXT:          addi.d  $t0, $t0, 1196# IE64-NEXT:          pcalau12i $a0, 16197# IE64-NEXT:            R_LARCH_TLS_DESC_LD c198# IE64-NEXT:          addi.d  $t0, $t0, 1199# IE64-NEXT:          ld.d    $a0, $a0, 1008200# IE64-NEXT:            R_LARCH_TLS_DESC_CALL c201# IE64-NEXT:          add.d   $a3, $a0, $tp202 203## &.got[d]-. = 0x303f0+8 - 0x20300: 0x10 pages, page offset 0x3f8204# IE64:        20300: pcalau12i $a0, 16205# IE64-NEXT:            R_LARCH_TLS_DESC_PC_HI20 d206# IE64-NEXT:            R_LARCH_RELAX *ABS*207# IE64-NEXT:            R_LARCH_TLS_DESC_PC_LO12 d208# IE64-NEXT:            R_LARCH_RELAX *ABS*209# IE64-NEXT:            R_LARCH_TLS_DESC_LD d210# IE64-NEXT:          ld.d    $a0, $a0, 1016211# IE64-NEXT:            R_LARCH_TLS_DESC_CALL d212# IE64-NEXT:          add.d   $a4, $a0, $tp213 214# IE64-NORELAX: .got    00000010 0000000000030408215 216## a@tprel = 0x8217# IE64-NORELAX:        202c8: nop218# IE64-NORELAX-NEXT:          nop219# IE64-NORELAX-NEXT:          nop220# IE64-NORELAX-NEXT:          ori     $a0, $zero, 8221# IE64-NORELAX-NEXT:          add.d   $a1, $a0, $tp222 223## b@tprel = 0x7ff224# IE64-NORELAX:        202dc: nop225# IE64-NORELAX-NEXT:          nop226# IE64-NORELAX-NEXT:          nop227# IE64-NORELAX-NEXT:          ori     $a0, $zero, 2047228# IE64-NORELAX-NEXT:          add.d   $a2, $a0, $tp229 230## &.got[c]-. = 0x30408 - 0x20300: 0x10 pages, page offset 0x408231## Without R_LARCH_RELAX relocation. No relaxation.232# IE64-NORELAX:        202f0: nop233# IE64-NORELAX-NEXT:          addi.d  $t0, $zero, 0234# IE64-NORELAX-NEXT:          nop235# IE64-NORELAX-NEXT:          addi.d  $t0, $t0, 1236# IE64-NORELAX-NEXT:          pcalau12i $a0, 16237# IE64-NORELAX-NEXT:          addi.d  $t0, $t0, 1238# IE64-NORELAX-NEXT:          ld.d    $a0, $a0, 1032239# IE64-NORELAX-NEXT:          add.d   $a3, $a0, $tp240 241## &.got[d]-. = 0x30408+8 - 0x20318: 0x10 pages, page offset 0x410242# IE64-NORELAX:        20310: nop243# IE64-NORELAX-NEXT:          nop244# IE64-NORELAX-NEXT:          pcalau12i $a0, 16245# IE64-NORELAX-NEXT:          ld.d    $a0, $a0, 1040246# IE64-NORELAX-NEXT:          add.d   $a4, $a0, $tp247 248#--- a.s249la.tls.desc $a0, a250add.d $a1, $a0, $tp251 252# ADDI.D does not have R_LARCH_RELAX. No relaxation when it is not optimized to IE/LE (--shared).253pcalau12i $a0, %desc_pc_hi20(b)254.reloc .-4, R_LARCH_RELAX, 0255addi.d $a0, $a0, %desc_pc_lo12(b)256ld.d $ra, $a0, %desc_ld(b)257jirl $ra, $ra, %desc_call(b)258add.d $a2, $a0, $tp259 260# TLSDESC to LE. No relaxation.261pcalau12i $a0, %desc_pc_hi20(c)262addi.d $t0, $zero, 0263addi.d $a0, $a0, %desc_pc_lo12(c)264addi.d $t0, $t0, 1265ld.d $ra, $a0, %desc_ld(c)266addi.d $t0, $t0, 1267jirl $ra, $ra, %desc_call(c)268add.d $a3, $a0, $tp269 270# PCALAU12I and ADDI.D have R_LARCH_RELAX. We perform relaxation.271pcalau12i $a0, %desc_pc_hi20(d)272.reloc .-4, R_LARCH_RELAX, 0273addi.d $a0, $a0, %desc_pc_lo12(d)274.reloc .-4, R_LARCH_RELAX, 0275ld.d $ra, $a0, %desc_ld(d)276jirl $ra, $ra, %desc_call(d)277add.d $a4, $a0, $tp278 279.section .tbss,"awT",@nobits280.globl a281.zero 8282a:283.zero 2039  ## Place b at 0x7ff284b:285.zero 1286 287#--- c.s288.section .tbss,"awT",@nobits289.globl c, d290c:291.zero 2048  ## Place d at 0x1000292d:293.zero 4294