LoongArch: ld: Add support for tls le relax.
Add tls le relax related testsuites in ld. The new test cases are mainly tested in three aspects: 1. tls le relax function correctness test. 2. tls le relax boundary check test. 3. tls le relax function compatibility test. ld/testsuite/ChangeLog: * ld/testsuite/ld-loongarch-elf/relax.exp: Modify test. * ld/testsuite/ld-loongarch-elf/old-tls-le.s: New test. * ld/testsuite/ld-loongarch-elf/relax-bound-check-tls-le.s: Likewise. * ld/testsuite/ld-loongarch-elf/tls-relax-compatible-check-new.s: Likewise. * ld/testsuite/ld-loongarch-elf/relax-tls-le.s: Likewise. * ld/testsuite/ld-loongarch-elf/tls-relax-compatible-check-old.s: Likewise.
This commit is contained in:
committed by
liuzhensong
parent
40372b03b3
commit
90827b4eef
@@ -0,0 +1,23 @@
|
||||
/* This test case mainly tests whether the original
|
||||
tls le assembly instruction can be linked normally
|
||||
after tls le relax is added to the current ld. */
|
||||
|
||||
.text
|
||||
.globl aa
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type aa, @object
|
||||
.size aa, 4
|
||||
aa:
|
||||
.space 4
|
||||
.text
|
||||
.align 2
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
lu12i.w $r12,%le_hi20(aa)
|
||||
ori $r12,$r12,%le_lo12(aa)
|
||||
add.d $r12,$r12,$r2
|
||||
addi.w $r13,$r0,2 # 0x2
|
||||
stptr.w $r13,$r12,0
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/* This test case mainly tests whether the address of the
|
||||
tls le symbol can be resolved normally when the offset
|
||||
of the symbol is greater than 0x800. (When the symbol
|
||||
offset is greater than 0x800, relax is not performed). */
|
||||
|
||||
.text
|
||||
.globl count1
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type count1, @object
|
||||
.size count1, 4
|
||||
count1:
|
||||
.space 0x400
|
||||
.globl count2
|
||||
.align 2
|
||||
.type count2, @object
|
||||
.size count2, 4
|
||||
count2:
|
||||
.space 0x400
|
||||
.globl count3
|
||||
.align 2
|
||||
.type count3, @object
|
||||
.size count3, 4
|
||||
count3:
|
||||
.space 0x400
|
||||
.globl count4
|
||||
.align 2
|
||||
.type count4, @object
|
||||
.size count4, 4
|
||||
count4:
|
||||
.space 4
|
||||
.text
|
||||
.align 2
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
lu12i.w $r12,%le_hi20_r(count1)
|
||||
add.d $r12,$r12,$r2,%le_add_r(count1)
|
||||
addi.w $r13,$r0,1
|
||||
st.w $r13,$r12,%le_lo12_r(count1)
|
||||
lu12i.w $r12,%le_hi20_r(count2)
|
||||
add.d $r12,$r12,$r2,%le_add_r(count2)
|
||||
addi.w $r13,$r0,2
|
||||
st.w $r13,$r12,%le_lo12_r(count2)
|
||||
lu12i.w $r12,%le_hi20(count3)
|
||||
add.d $r12,$r12,$r2,%le_add_r(count3)
|
||||
addi.w $r13,$r0,3
|
||||
st.w $r13,$r12,%le_lo12_r(count3)
|
||||
lu12i.w $r12,%le_hi20(count4)
|
||||
add.d $r12,$r12,$r2,%le_add_r(count4)
|
||||
addi.w $r13,$r0,4
|
||||
st.w $r13,$r12,%le_lo12_r(count4)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/* This test case mainly tests whether the tls le variable
|
||||
address acquisition can be relax normally.
|
||||
|
||||
before relax: after relax:
|
||||
|
||||
lu12i.w $r12,%le_hi20_r(sym) ====> (instruction deleted).
|
||||
add.d $r12,$r12,$r2,%le_add_r(sym) ====> (instruction deleted).
|
||||
st.w $r13,$r12,%le_lo12_r(sym) ====> st.w $r13,$r2,%le_lo12_r(sym). */
|
||||
|
||||
.text
|
||||
.globl a
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type a, @object
|
||||
.size a, 4
|
||||
a:
|
||||
.space 4
|
||||
.text
|
||||
.align 2
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
lu12i.w $r12,%le_hi20_r(a)
|
||||
add.d $r12,$r12,$r2,%le_add_r(a)
|
||||
addi.w $r13,$r0,1 # 0x1
|
||||
st.w $r13,$r12,%le_lo12_r(a)
|
||||
@@ -33,8 +33,90 @@ if [istarget loongarch64-*-*] {
|
||||
"relax" \
|
||||
] \
|
||||
]
|
||||
set tls_relax_builds [list \
|
||||
[list \
|
||||
"tls_relax_builds" \
|
||||
"" \
|
||||
"" \
|
||||
{relax-tls-le.s} \
|
||||
{} \
|
||||
"relax-tls-le" \
|
||||
] \
|
||||
]
|
||||
set tls_no_relax_builds [list \
|
||||
[list \
|
||||
"tls_no_relax_builds" \
|
||||
"-Wl,--no-relax" \
|
||||
"" \
|
||||
{relax-tls-le.s} \
|
||||
{} \
|
||||
"no-relax-tls-le" \
|
||||
] \
|
||||
]
|
||||
|
||||
set relax_bound_check [list \
|
||||
[list \
|
||||
"relax_bound_check" \
|
||||
"" \
|
||||
"" \
|
||||
{relax-bound-check-tls-le.s} \
|
||||
{} \
|
||||
"relax-bound-check-tls-le" \
|
||||
] \
|
||||
]
|
||||
set no_relax_bound_check [list \
|
||||
[list \
|
||||
"no_relax_bound_check" \
|
||||
"-Wl,--no-relax" \
|
||||
"" \
|
||||
{relax-bound-check-tls-le.s} \
|
||||
{} \
|
||||
"no-relax-bound-check-tls-le" \
|
||||
] \
|
||||
]
|
||||
|
||||
set old_tls_le [list \
|
||||
[list \
|
||||
"old_tls_le" \
|
||||
"" \
|
||||
"" \
|
||||
{old-tls-le.s} \
|
||||
{} \
|
||||
"old-tls-le" \
|
||||
] \
|
||||
]
|
||||
|
||||
set relax_compatible [list \
|
||||
[list \
|
||||
"relax_compatible" \
|
||||
"" \
|
||||
"" \
|
||||
{tls-relax-compatible-check-new.s tls-relax-compatible-check-old.s} \
|
||||
{} \
|
||||
"realx-compatible" \
|
||||
] \
|
||||
]
|
||||
|
||||
set no_relax_compatible [list \
|
||||
[list \
|
||||
"no_relax_compatible" \
|
||||
"-Wl,--no-relax" \
|
||||
"" \
|
||||
{tls-relax-compatible-check-new.s tls-relax-compatible-check-old.s} \
|
||||
{} \
|
||||
"no-realx-compatible" \
|
||||
] \
|
||||
]
|
||||
|
||||
|
||||
run_cc_link_tests $pre_builds
|
||||
run_cc_link_tests $tls_relax_builds
|
||||
run_cc_link_tests $tls_no_relax_builds
|
||||
run_cc_link_tests $relax_bound_check
|
||||
run_cc_link_tests $no_relax_bound_check
|
||||
run_cc_link_tests $old_tls_le
|
||||
run_cc_link_tests $relax_compatible
|
||||
run_cc_link_tests $no_relax_compatible
|
||||
|
||||
if [file exist "tmpdir/relax"] {
|
||||
set objdump_output [run_host_cmd "objdump" "-d tmpdir/relax"]
|
||||
@@ -114,8 +196,75 @@ if [istarget loongarch64-*-*] {
|
||||
"relax-segment-max" \
|
||||
] \
|
||||
]
|
||||
}
|
||||
|
||||
if [file exist "tmpdir/relax-tls-le"] {
|
||||
set objdump_output1 [run_host_cmd "objdump" "-d tmpdir/relax-tls-le"]
|
||||
if { [ regexp ".addi.*st.*" $objdump_output1] } {
|
||||
pass "loongarch relax success"
|
||||
} {
|
||||
fail "loongarch relax fail"
|
||||
}
|
||||
}
|
||||
if [file exist "tmpdir/no-relax-tls-le"] {
|
||||
set objdump_output2 [run_host_cmd "objdump" "-d tmpdir/no-relax-tls-le"]
|
||||
if { [ regexp ".*lu12i.*add.*addi.*st.*" $objdump_output2] } {
|
||||
pass "loongarch no-relax success"
|
||||
} {
|
||||
fail "loongarch no-relax fail"
|
||||
}
|
||||
|
||||
}
|
||||
if [file exist "tmpdir/old-tls-le"] {
|
||||
set objdump_output3 [run_host_cmd "objdump" "-d tmpdir/old-tls-le"]
|
||||
if { [ regexp ".*lu12i.*ori.*add.*addi.*stptr.*" $objdump_output3] } {
|
||||
pass "loongarch old tls le success"
|
||||
} {
|
||||
fail "loongarch old tls le fail"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if [file exist "tmpdir/realx-compatible"] {
|
||||
set objdump_output4 [run_host_cmd "objdump" "-d tmpdir/realx-compatible"]
|
||||
if { [ regexp ".addi.*st.*" $objdump_output4] && \
|
||||
[ regexp ".*lu12i.*ori.*add.*addi.*stptr.*" $objdump_output4] } {
|
||||
pass "loongarch tls le relax compatible check success"
|
||||
} {
|
||||
fail "loongarch tls le relax compatible check fail"
|
||||
}
|
||||
}
|
||||
|
||||
if [file exist "tmpdir/no-realx-compatible"] {
|
||||
set objdump_output4 [run_host_cmd "objdump" "-d tmpdir/realx-compatible"]
|
||||
if { [ regexp ".*lu12i.*add.*addi.*st.*" $objdump_output4] && \
|
||||
[ regexp ".*lu12i.*ori.*add.*addi.*stptr.*" $objdump_output4] } {
|
||||
pass "loongarch tls le no-relax compatible check success"
|
||||
} {
|
||||
fail "loongarch tls le no-relax compatible check fail"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if [file exist "tmpdir/relax-bound-check-tls-le"] {
|
||||
set objdump_output5 [run_host_cmd "objdump" "-d tmpdir/relax-bound-check-tls-le"]
|
||||
if { [ regexp ".*lu12i.*add.*addi.*st.*" $objdump_output5] && \
|
||||
[ regexp ".addi.*st.*" $objdump_output5] } {
|
||||
pass "loongarch no-relax success"
|
||||
} {
|
||||
fail "loongarch no-relax fail"
|
||||
}
|
||||
|
||||
}
|
||||
if [file exist "tmpdir/no-relax-bound-check-tls-le"] {
|
||||
set objdump_output5 [run_host_cmd "objdump" "-d tmpdir/no-relax-bound-check-tls-le"]
|
||||
if { [ regexp ".*addi.*st.*" $objdump_output5] } {
|
||||
pass "loongarch no-relax success"
|
||||
} {
|
||||
fail "loongarch no-relax fail"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
run_ld_link_tests \
|
||||
[list \
|
||||
[list \
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/* This test case mainly carries out ld compatibility test.
|
||||
This test case is the new tls le instruction sequence,
|
||||
which will be linked with tls-relax-compatible-check-old.s.
|
||||
If the link is normal, it indicates that there is no
|
||||
compatibility problem. */
|
||||
|
||||
.text
|
||||
.globl new
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type new, @object
|
||||
.size new, 4
|
||||
new:
|
||||
.space 4
|
||||
.text
|
||||
.align 2
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
.LFB0 = .
|
||||
addi.d $r3,$r3,-16
|
||||
st.d $r1,$r3,8
|
||||
stptr.d $r22,$r3,0
|
||||
addi.d $r22,$r3,16
|
||||
bl %plt(old)
|
||||
lu12i.w $r12,%le_hi20_r(new)
|
||||
add.d $r12,$r12,$r2,%le_add_r(new)
|
||||
addi.w $r13,$r0,2 # 0x2
|
||||
st.w $r13,$r12,%le_lo12_r(new)
|
||||
or $r12,$r0,$r0
|
||||
or $r4,$r12,$r0
|
||||
ld.d $r1,$r3,8
|
||||
ldptr.d $r22,$r3,0
|
||||
addi.d $r3,$r3,16
|
||||
jr $r1
|
||||
@@ -0,0 +1,33 @@
|
||||
/* This test case mainly carries out ld compatibility test.
|
||||
This test case is the old tls le instruction sequence,
|
||||
which will be linked with tls-relax-compatible-check-new.s.
|
||||
If the link is normal, it indicates that there is no
|
||||
compatibility problem. */
|
||||
|
||||
.text
|
||||
.globl older
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type older, @object
|
||||
.size older, 4
|
||||
older:
|
||||
.space 4
|
||||
.text
|
||||
.align 2
|
||||
.globl old
|
||||
.type old, @function
|
||||
old:
|
||||
.LFB0 = .
|
||||
addi.d $r3,$r3,-16
|
||||
st.d $r22,$r3,8
|
||||
addi.d $r22,$r3,16
|
||||
lu12i.w $r12,%le_hi20(older)
|
||||
ori $r12,$r12,%le_lo12(older)
|
||||
add.d $r12,$r12,$r2
|
||||
addi.w $r13,$r0,1 # 0x1
|
||||
stptr.w $r13,$r12,0
|
||||
nop
|
||||
or $r4,$r12,$r0
|
||||
ld.d $r22,$r3,8
|
||||
addi.d $r3,$r3,16
|
||||
jr $r1
|
||||
Reference in New Issue
Block a user