215 lines · plain
1# REQUIRES: loongarch2## Test that we can handle --emit-relocs while relaxing.3 4# RUN: llvm-mc --filetype=obj --triple=loongarch32 --mattr=+relax %s -o %t.32.o5# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax --defsym ELF64=1 %s -o %t.64.o6# RUN: ld.lld -Ttext=0x10000 -section-start=.got=0x20000 --emit-relocs %t.32.o -o %t.327# RUN: ld.lld -Ttext=0x10000 -section-start=.got=0x20000 --emit-relocs %t.64.o -o %t.648# RUN: llvm-objdump -dr %t.32 | FileCheck %s --check-prefixes=RELAX,RELAX329# RUN: llvm-objdump -dr %t.64 | FileCheck %s --check-prefixes=RELAX,RELAX6410 11## -r should keep original relocations.12# RUN: ld.lld -r %t.64.o -o %t.64.r13# RUN: llvm-objdump -dr %t.64.r | FileCheck %s --check-prefix=CHECKR14 15## --no-relax should keep original relocations.16# RUN: ld.lld -Ttext=0x10000 -section-start=.got=0x20000 --emit-relocs --no-relax %t.64.o -o %t.64.norelax17# RUN: llvm-objdump -dr %t.64.norelax | FileCheck %s --check-prefix=NORELAX18 19# RELAX: 00010000 <_start>:20# RELAX-NEXT: pcaddi $a0, 021# RELAX-NEXT: R_LARCH_RELAX _start22# RELAX-NEXT: R_LARCH_RELAX *ABS*23# RELAX-NEXT: R_LARCH_PCREL20_S2 _start24# RELAX-NEXT: R_LARCH_RELAX *ABS*25# RELAX-NEXT: pcaddi $a0, -126# RELAX-NEXT: R_LARCH_RELAX _start27# RELAX-NEXT: R_LARCH_RELAX *ABS*28# RELAX-NEXT: R_LARCH_PCREL20_S2 _start29# RELAX-NEXT: R_LARCH_RELAX *ABS*30 31# RELAX64-NEXT: bl -832# RELAX64-NEXT: R_LARCH_B26 _start33# RELAX64-NEXT: R_LARCH_RELAX *ABS*34# RELAX64-NEXT: b -1235# RELAX64-NEXT: R_LARCH_B26 _start36# RELAX64-NEXT: R_LARCH_RELAX *ABS*37 38# RELAX-NEXT: lu12i.w $a0, 039# RELAX-NEXT: R_LARCH_TLS_LE_HI20 a40# RELAX-NEXT: ori $a0, $a0, 041# RELAX-NEXT: R_LARCH_TLS_LE_LO12 a42# RELAX-NEXT: pcaddi $a0, [[#]]43# RELAX-NEXT: R_LARCH_RELAX a44# RELAX-NEXT: R_LARCH_RELAX *ABS*45# RELAX-NEXT: R_LARCH_TLS_GD_PCREL20_S2 a46# RELAX-NEXT: R_LARCH_RELAX *ABS*47# RELAX-NEXT: pcaddi $a0, [[#]]48# RELAX-NEXT: R_LARCH_RELAX a49# RELAX-NEXT: R_LARCH_RELAX *ABS*50# RELAX-NEXT: R_LARCH_TLS_LD_PCREL20_S2 a51# RELAX-NEXT: R_LARCH_RELAX *ABS*52# RELAX-NEXT: addi.{{[dw]}} $a0, $tp, 053# RELAX-NEXT: R_LARCH_RELAX a54# RELAX-NEXT: R_LARCH_RELAX *ABS*55# RELAX-NEXT: R_LARCH_RELAX a56# RELAX-NEXT: R_LARCH_RELAX *ABS*57# RELAX-NEXT: R_LARCH_TLS_LE_LO12_R a58# RELAX-NEXT: R_LARCH_RELAX *ABS*59 60# RELAX32-NEXT: nop61# RELAX32-NEXT: R_LARCH_ALIGN *ABS*+0xc62# RELAX32-NEXT: ret63 64# RELAX64-NEXT: nop65# RELAX64-NEXT: R_LARCH_ALIGN *ABS*+0xc66# RELAX64-NEXT: nop67# RELAX64-NEXT: nop68# RELAX64-NEXT: ret69 70# NORELAX: <_start>:71# NORELAX-NEXT: pcalau12i $a0, 072# NORELAX-NEXT: R_LARCH_PCALA_HI20 _start73# NORELAX-NEXT: R_LARCH_RELAX *ABS*74# NORELAX-NEXT: addi.d $a0, $a0, 075# NORELAX-NEXT: R_LARCH_PCALA_LO12 _start76# NORELAX-NEXT: R_LARCH_RELAX *ABS*77# NORELAX-NEXT: pcalau12i $a0, 1678# NORELAX-NEXT: R_LARCH_GOT_PC_HI20 _start79# NORELAX-NEXT: R_LARCH_RELAX *ABS*80# NORELAX-NEXT: ld.d $a0, $a0, 081# NORELAX-NEXT: R_LARCH_GOT_PC_LO12 _start82# NORELAX-NEXT: R_LARCH_RELAX *ABS*83# NORELAX-NEXT: pcaddu18i $ra, 084# NORELAX-NEXT: R_LARCH_CALL36 _start85# NORELAX-NEXT: R_LARCH_RELAX *ABS*86# NORELAX-NEXT: jirl $ra, $ra, -1687# NORELAX-NEXT: pcaddu18i $a0, 088# NORELAX-NEXT: R_LARCH_CALL36 _start89# NORELAX-NEXT: R_LARCH_RELAX *ABS*90# NORELAX-NEXT: jirl $zero, $a0, -2491# NORELAX-NEXT: lu12i.w $a0, 092# NORELAX-NEXT: R_LARCH_TLS_LE_HI20 a93# NORELAX-NEXT: ori $a0, $a0, 094# NORELAX-NEXT: R_LARCH_TLS_LE_LO12 a95# NORELAX-NEXT: pcalau12i $a0, 1696# NORELAX-NEXT: R_LARCH_TLS_GD_PC_HI20 a97# NORELAX-NEXT: R_LARCH_RELAX *ABS*98# NORELAX-NEXT: addi.d $a0, $a0, 899# NORELAX-NEXT: R_LARCH_GOT_PC_LO12 a100# NORELAX-NEXT: R_LARCH_RELAX *ABS*101# NORELAX-NEXT: pcalau12i $a0, 16102# NORELAX-NEXT: R_LARCH_TLS_LD_PC_HI20 a103# NORELAX-NEXT: R_LARCH_RELAX *ABS*104# NORELAX-NEXT: addi.d $a0, $a0, 8105# NORELAX-NEXT: R_LARCH_GOT_PC_LO12 a106# NORELAX-NEXT: R_LARCH_RELAX *ABS*107# NORELAX-NEXT: lu12i.w $a0, 0108# NORELAX-NEXT: R_LARCH_TLS_LE_HI20_R a109# NORELAX-NEXT: R_LARCH_RELAX *ABS*110# NORELAX-NEXT: add.d $a0, $a0, $tp111# NORELAX-NEXT: R_LARCH_TLS_LE_ADD_R a112# NORELAX-NEXT: R_LARCH_RELAX *ABS*113# NORELAX-NEXT: addi.d $a0, $a0, 0114# NORELAX-NEXT: R_LARCH_TLS_LE_LO12_R a115# NORELAX-NEXT: R_LARCH_RELAX *ABS*116# NORELAX-NEXT: nop117# NORELAX-NEXT: R_LARCH_ALIGN *ABS*+0xc118# NORELAX-NEXT: nop119# NORELAX-NEXT: nop120# NORELAX-NEXT: ret121 122# CHECKR: <_start>:123# CHECKR-NEXT: pcalau12i $a0, 0124# CHECKR-NEXT: R_LARCH_PCALA_HI20 _start125# CHECKR-NEXT: R_LARCH_RELAX *ABS*126# CHECKR-NEXT: addi.d $a0, $a0, 0127# CHECKR-NEXT: R_LARCH_PCALA_LO12 _start128# CHECKR-NEXT: R_LARCH_RELAX *ABS*129# CHECKR-NEXT: pcalau12i $a0, 0130# CHECKR-NEXT: R_LARCH_GOT_PC_HI20 _start131# CHECKR-NEXT: R_LARCH_RELAX *ABS*132# CHECKR-NEXT: ld.d $a0, $a0, 0133# CHECKR-NEXT: R_LARCH_GOT_PC_LO12 _start134# CHECKR-NEXT: R_LARCH_RELAX *ABS*135# CHECKR-NEXT: pcaddu18i $ra, 0136# CHECKR-NEXT: R_LARCH_CALL36 _start137# CHECKR-NEXT: R_LARCH_RELAX *ABS*138# CHECKR-NEXT: jirl $ra, $ra, 0139# CHECKR-NEXT: pcaddu18i $a0, 0140# CHECKR-NEXT: R_LARCH_CALL36 _start141# CHECKR-NEXT: R_LARCH_RELAX *ABS*142# CHECKR-NEXT: jr $a0143# CHECKR-NEXT: lu12i.w $a0, 0144# CHECKR-NEXT: R_LARCH_TLS_LE_HI20 a145# CHECKR-NEXT: ori $a0, $a0, 0146# CHECKR-NEXT: R_LARCH_TLS_LE_LO12 a147# CHECKR-NEXT: pcalau12i $a0, 0148# CHECKR-NEXT: R_LARCH_TLS_GD_PC_HI20 a149# CHECKR-NEXT: R_LARCH_RELAX *ABS*150# CHECKR-NEXT: addi.d $a0, $a0, 0151# CHECKR-NEXT: R_LARCH_GOT_PC_LO12 a152# CHECKR-NEXT: R_LARCH_RELAX *ABS*153# CHECKR-NEXT: pcalau12i $a0, 0154# CHECKR-NEXT: R_LARCH_TLS_LD_PC_HI20 a155# CHECKR-NEXT: R_LARCH_RELAX *ABS*156# CHECKR-NEXT: addi.d $a0, $a0, 0157# CHECKR-NEXT: R_LARCH_GOT_PC_LO12 a158# CHECKR-NEXT: R_LARCH_RELAX *ABS*159# CHECKR-NEXT: lu12i.w $a0, 0160# CHECKR-NEXT: R_LARCH_TLS_LE_HI20_R a161# CHECKR-NEXT: R_LARCH_RELAX *ABS*162# CHECKR-NEXT: add.d $a0, $a0, $tp163# CHECKR-NEXT: R_LARCH_TLS_LE_ADD_R a164# CHECKR-NEXT: R_LARCH_RELAX *ABS*165# CHECKR-NEXT: addi.d $a0, $a0, 0166# CHECKR-NEXT: R_LARCH_TLS_LE_LO12_R a167# CHECKR-NEXT: R_LARCH_RELAX *ABS*168# CHECKR-NEXT: nop169# CHECKR-NEXT: R_LARCH_ALIGN *ABS*+0xc170# CHECKR-NEXT: nop171# CHECKR-NEXT: nop172# CHECKR-NEXT: ret173 174.macro add dst, src1, src2, src3175.ifdef ELF64176 add.d \dst, \src1, \src2, \src3177.else178 add.w \dst, \src1, \src2, \src3179.endif180.endm181 182.macro addi dst, src1, src2183.ifdef ELF64184 addi.d \dst, \src1, \src2185.else186 addi.w \dst, \src1, \src2187.endif188.endm189 190.global _start191_start:192 la.pcrel $a0, _start193 la.got $a0, _start194 195.ifdef ELF64196 call36 _start197 tail36 $a0, _start198.endif199 200 la.tls.le $a0, a # without R_LARCH_RELAX reloaction201 la.tls.gd $a0, a202 la.tls.ld $a0, a203 204 lu12i.w $a0, %le_hi20_r(a)205 add $a0, $a0, $tp, %le_add_r(a)206 addi $a0, $a0, %le_lo12_r(a)207 208 .p2align 4209 ret210 211.section .tbss,"awT",@nobits212.globl a213a:214.zero 4215