137 lines · plain
1# REQUIRES: loongarch2## Relax R_LARCH_CALL36, which involves the macro instructions call36/tail36.3 4# RUN: rm -rf %t && split-file %s %t && cd %t5 6# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.64.o7# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax b.s -o b.64.o8# RUN: ld.lld -shared -soname=b.so b.64.o -o b.64.so9# RUN: ld.lld -T lds a.64.o b.64.so -o 6410# RUN: llvm-objdump -td --no-show-raw-insn 64 | FileCheck %s --check-prefix=RELAX11 12## --no-relax disables relaxation.13# RUN: ld.lld -T lds a.64.o b.64.so --no-relax -o 64.norelax14# RUN: llvm-objdump -td --no-show-raw-insn 64.norelax | FileCheck %s --check-prefix=NORELAX15 16# RELAX: {{0*}}00010000 g .text {{0*}}0000001c _start17# RELAX: {{0*}}0001001c g .text {{0*}}00000000 _start_end18# RELAX: {{0*}}00010808 g .mid {{0*}}00000000 mid_end19# RELAX: {{0*}}10010010 g .high {{0*}}00000000 high_end20 21# RELAX-LABEL: <_start>:22## offset = 0x10018 - 0x10000 = 2423# RELAX-NEXT: 10000: bl 24 <a>24# RELAX-NEXT: b 20 <a>25# RELAX-NEXT: nop26# RELAX-NEXT: nop27## offset = .plt(0x10400)+32 - 0x10010 = 104028# RELAX-NEXT: 10010: bl 1040 <bar+0x10420>29# RELAX-NEXT: b 1036 <bar+0x10420>30# RELAX-EMPTY:31# RELAX-NEXT: <a>:32# RELAX-NEXT: 10018: ret33# RELAX-EMPTY:34 35# RELAX-LABEL: <.mid>:36## offset = 0x10000 - 0x10800 = -204837# RELAX-NEXT: 10800: bl -2048 <_start>38# RELAX-NEXT: b -2052 <_start>39# RELAX-EMPTY:40 41# RELAX-LABEL: <.mid2>:42## offset = 0x10000 - 0x1010000 = -1677721643# RELAX-NEXT: 1010000: bl -16777216 <_start>44# RELAX-NEXT: b -16777220 <_start>45# RELAX-EMPTY:46 47# RELAX-LABEL: <.high>:48## offset = 0x10000 - 0x10010000 = -0x10000000, hi=-1024, lo18=049# RELAX-NEXT: 10010000: pcaddu18i $ra, -102450# RELAX-NEXT: jirl $ra, $ra, 051# RELAX-NEXT: pcaddu18i $t0, -102452# RELAX-NEXT: jirl $zero, $t0, -853# RELAX-EMPTY:54 55 56# NORELAX-LABEL: <_start>:57## offset = 0x10020 - 0x10000 = 0x20, hi=0, lo18=3258# NORELAX-NEXT: 10000: pcaddu18i $ra, 059# NORELAX-NEXT: jirl $ra, $ra, 3260## offset = 0x10020 - 0x10008 = 0x18, hi=0, lo18=2461# NORELAX-NEXT: 10008: pcaddu18i $t0, 062# NORELAX-NEXT: jirl $zero, $t0, 2463## offset = .plt(0x10400)+32 - 0x10010 = 0x410, hi=0, lo18=104064# NORELAX-NEXT: 10010: pcaddu18i $ra, 065# NORELAX-NEXT: jirl $ra, $ra, 104066## offset = .plt(0x10400)+32 - 0x10018 = 0x408, hi=0, lo18=103267# NORELAX-NEXT: 10018: pcaddu18i $t0, 068# NORELAX-NEXT: jirl $zero, $t0, 103269# NORELAX-EMPTY:70# NORELAX-NEXT: <a>:71# NORELAX-NEXT: 10020: ret72# NORELAX-EMPTY:73 74# NORELAX-LABEL: <.mid>:75## offset = 0x10000 - 0x10800 = -0x800, hi=0, lo18=-204876# NORELAX-NEXT: 10800: pcaddu18i $ra, 077# NORELAX-NEXT: jirl $ra, $ra, -204878# NORELAX-NEXT: pcaddu18i $t0, 079# NORELAX-NEXT: jirl $zero, $t0, -205680# NORELAX-EMPTY:81 82# NORELAX-LABEL: <.mid2>:83## offset = 0x10000 - 0x1010000 = -0x1000000, hi=-64, lo18=084# NORELAX-NEXT: 1010000: pcaddu18i $ra, -6485# NORELAX-NEXT: jirl $ra, $ra, 086# NORELAX-NEXT: pcaddu18i $t0, -6487# NORELAX-NEXT: jirl $zero, $t0, -888# NORELAX-EMPTY:89 90# NORELAX-LABEL: <.high>:91## offset = 0x10000 - 0x10010000 = -0x10000000, hi=-1024, lo18=092# NORELAX-NEXT: 10010000: pcaddu18i $ra, -102493# NORELAX-NEXT: jirl $ra, $ra, 094# NORELAX-NEXT: pcaddu18i $t0, -102495# NORELAX-NEXT: jirl $zero, $t0, -896# NORELAX-EMPTY:97 98#--- a.s99.global _start, _start_end100_start:101 call36 a # relaxed. la64: bl102 tail36 $t0, a # relaxed. la64: b103.balign 16104 call36 bar # PLT call36 can be relaxed. la64: bl105 tail36 $t0, bar # PLT tail36 can be relaxed. la64: bl106 107a:108 ret109.size _start, . - _start110_start_end:111 112.section .mid,"ax",@progbits113 call36 _start # relaxed. la64: bl114 tail36 $t0, _start # relaxed. la64: b115 116.section .mid2,"ax",@progbits117 call36 _start # relaxed. la64: bl118 tail36 $t0, _start # relaxed. la64: b119 120.section .high,"ax",@progbits121 call36 _start # exceed range, not relaxed122 tail36 $t0, _start # exceed range, not relaxed123 124#--- b.s125.globl bar126bar:127 ret128 129#--- lds130SECTIONS {131 .text 0x10000 : { *(.text) }132 .plt 0x10400 : { *(.plt) }133 .mid 0x10800 : { *(.mid); mid_end = .; }134 .mid2 0x1010000 : { *(.mid2) }135 .high 0x10010000 : { *(.high); high_end = .; }136}137