binutils-gdb/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
Marcus Comstedt f36ce378b4 RISC-V: Fix riscv gas/ld testsuites failures for big endian.
Add riscv_choose_[ilp32|lp64]_emul, and use them to choose the correct
linker script rather than set elf[32|64]lriscv directly.

gas/
    * testsuite/gas/riscv/li32.d: Accept bigriscv in addition
    to littleriscv.
    * testsuite/gas/riscv/li64.d: Likewise.
    * testsuite/gas/riscv/lla32.d: Likewise.
    * testsuite/gas/riscv/lla64.d: Likewise.
    * testsuite/gas/riscv/march-ok-g2.d: Likewise.
    * testsuite/gas/riscv/march-ok-g2_p1.d: Likewise.
    * testsuite/gas/riscv/march-ok-g2p0.d: Likewise.
    * testsuite/gas/riscv/march-ok-i2p0.d: Likewise.
    * testsuite/gas/riscv/march-ok-i2p0m2_a2f2.d: Likewise.
    * testsuite/gas/riscv/march-ok-nse-with-version.d: Likewise.
    * testsuite/gas/riscv/march-ok-two-nse.d: Likewise.

ld/
    * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Added
    riscv_choose_[ilp32|lp64]_emul to choose the correct linker script.
    * testsuite/ld-riscv-elf/attr-merge-arch-01.d: Call
    riscv_choose_[ilp32|lp64]_emul instead of hardcoding elf[32|64]lriscv.
    * testsuite/ld-riscv-elf/attr-merge-arch-02.d: Likewise.
    * testsuite/ld-riscv-elf/attr-merge-arch-03.d: Likewise.
    * testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Likewise.
    * testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d: Likewise.
    * testsuite/ld-riscv-elf/c-lui-2.d: Likewise.
    * testsuite/ld-riscv-elf/c-lui.d: Likewise.
    * testsuite/ld-riscv-elf/call-relax.d: Likewise.
    * testsuite/ld-riscv-elf/pcrel-lo-addend-2.d: Likewise.
    * testsuite/ld-riscv-elf/pcrel-lo-addend.d: Likewise.
    * testsuite/ld-riscv-elf/weakref32.d: Accept bigriscv in addition
    to littleriscv.
    * testsuite/ld-riscv-elf/weakref64.d: Likewise.
2021-01-06 18:01:41 +08:00

228 lines
8.3 KiB
Plaintext

# Expect script for RISC-V ELF linker tests
# Copyright (C) 2017-2021 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
proc riscv_choose_ilp32_emul {} {
if { [istarget "riscvbe-*"] \
|| [istarget "riscv32be-*"] \
|| [istarget "riscv64be-*"] } {
return "elf32briscv"
}
return "elf32lriscv"
}
proc riscv_choose_lp64_emul {} {
if { [istarget "riscvbe-*"] \
|| [istarget "riscv32be-*"] \
|| [istarget "riscv64be-*"] } {
return "elf64briscv"
}
return "elf64lriscv"
}
# target: rv32 or rv64.
# output: Which output you want? (exe, pie, .so)
proc run_dump_test_ifunc { name target output} {
set asflags ""
set ldflags "-z nocombreloc"
switch -- $output {
exe {
set ext "exe"
}
pie {
set ext "pie"
set ldflags "$ldflags -pie"
}
pic {
set ext "so"
set ldflags "$ldflags -shared"
}
}
switch -- $target {
rv32 {
set asflags "$asflags -march=rv32i -mabi=ilp32"
set ldflags "$ldflags -m[riscv_choose_ilp32_emul]"
}
rv64 {
set asflags "$asflags -march=rv64i -mabi=lp64 -defsym __64_bit__=1"
set ldflags "$ldflags -m[riscv_choose_lp64_emul]"
}
}
run_ld_link_tests [list \
[list "$name ($target-$output)" \
"$ldflags" "" \
"$asflags" \
[list "$name.s"] \
[concat [list "readelf -rW $name-$output.rd"] \
[list "objdump -dw $name.d"]] \
"$name-$target.$ext"]]
}
if [istarget "riscv*-*-*"] {
run_dump_test "call-relax"
run_dump_test "pcgp-relax"
run_dump_test "c-lui"
run_dump_test "c-lui-2"
run_dump_test "disas-jalr"
run_dump_test "pcrel-lo-addend"
run_dump_test "pcrel-lo-addend-2"
run_dump_test "attr-merge-arch-01"
run_dump_test "attr-merge-arch-02"
run_dump_test "attr-merge-arch-03"
run_dump_test "attr-merge-strict-align-01"
run_dump_test "attr-merge-strict-align-02"
run_dump_test "attr-merge-strict-align-03"
run_dump_test "attr-merge-strict-align-04"
run_dump_test "attr-merge-strict-align-05"
run_dump_test "attr-merge-stack-align"
run_dump_test "attr-merge-priv-spec-01"
run_dump_test "attr-merge-priv-spec-02"
run_dump_test "attr-merge-priv-spec-03"
run_dump_test "attr-merge-arch-failed-01"
run_dump_test "attr-merge-arch-failed-02"
run_dump_test "attr-merge-stack-align-failed"
run_dump_test "attr-merge-priv-spec-failed-01"
run_dump_test "attr-merge-priv-spec-failed-02"
run_dump_test "attr-merge-priv-spec-failed-03"
run_dump_test "attr-merge-priv-spec-failed-04"
run_dump_test "attr-merge-priv-spec-failed-05"
run_dump_test "attr-merge-priv-spec-failed-06"
run_ld_link_tests [list \
[list "Weak reference 32" "-T weakref.ld -m[riscv_choose_ilp32_emul]" "" \
"-march=rv32i -mabi=ilp32" {weakref32.s} \
{{objdump -d weakref32.d}} "weakref32"] \
[list "Weak reference 64" "-T weakref.ld -m[riscv_choose_lp64_emul]" "" \
"-march=rv64i -mabi=lp64" {weakref64.s} \
{{objdump -d weakref64.d}} "weakref64"]]
# The following tests require shared library support.
if ![check_shared_lib_support] {
return
}
set abis [list rv32gc ilp32 [riscv_choose_ilp32_emul] rv64gc lp64 [riscv_choose_lp64_emul]]
foreach { arch abi emul } $abis {
# This checks whether our linker scripts handle __global_pointer$
# correctly. It should be defined in executables and PIE, but not
# in shared libraries.
set suff64 [string map {ilp32 "" lp64 -64} $abi]
run_ld_link_tests [list \
[list "gp test ($abi shared library)" \
"-m$emul -shared" "" \
"-march=$arch -mabi=$abi -fpic" \
{ gp-test.s } \
[list "readelf --syms gp-test-lib.sd"] \
"gp-test-lib-${abi}.so"] \
[list "gp test ($abi executable)" \
"-m$emul" "" \
"-march=$arch -mabi=$abi" \
{ gp-test.s } \
[list "readelf --syms gp-test.sd"] \
"gp-test-${abi}"]]
}
run_ld_link_tests {
{ "Link non-pic code into a shared library (setup)"
"-shared" "" "" {lib-nopic-01a.s}
{} "lib-nopic-01a.so" }
}
run_dump_test "lib-nopic-01b"
# IFUNC testcases.
# Check IFUNC by single type relocs.
run_dump_test_ifunc "ifunc-reloc-call-01" rv32 exe
run_dump_test_ifunc "ifunc-reloc-call-01" rv32 pie
run_dump_test_ifunc "ifunc-reloc-call-01" rv32 pic
run_dump_test_ifunc "ifunc-reloc-call-02" rv32 exe
run_dump_test_ifunc "ifunc-reloc-call-02" rv32 pie
run_dump_test_ifunc "ifunc-reloc-call-02" rv32 pic
run_dump_test_ifunc "ifunc-reloc-pcrel" rv32 exe
run_dump_test_ifunc "ifunc-reloc-pcrel" rv32 pie
run_dump_test_ifunc "ifunc-reloc-pcrel" rv32 pic
run_dump_test_ifunc "ifunc-reloc-data" rv32 exe
run_dump_test_ifunc "ifunc-reloc-data" rv32 pie
run_dump_test_ifunc "ifunc-reloc-data" rv32 pic
run_dump_test_ifunc "ifunc-reloc-got" rv32 exe
run_dump_test_ifunc "ifunc-reloc-got" rv32 pie
run_dump_test_ifunc "ifunc-reloc-got" rv32 pic
run_dump_test_ifunc "ifunc-reloc-pcrel" rv64 exe
run_dump_test_ifunc "ifunc-reloc-pcrel" rv64 pie
run_dump_test_ifunc "ifunc-reloc-pcrel" rv64 pic
run_dump_test_ifunc "ifunc-reloc-data" rv64 exe
run_dump_test_ifunc "ifunc-reloc-data" rv64 pie
run_dump_test_ifunc "ifunc-reloc-data" rv64 pic
run_dump_test_ifunc "ifunc-reloc-got" rv64 exe
run_dump_test_ifunc "ifunc-reloc-got" rv64 pie
run_dump_test_ifunc "ifunc-reloc-got" rv64 pic
# Check the IFUNC PLT and non-PLT relocs.
run_dump_test_ifunc "ifunc-nonplt" rv32 exe
run_dump_test_ifunc "ifunc-nonplt" rv32 pie
run_dump_test_ifunc "ifunc-nonplt" rv32 pic
run_dump_test_ifunc "ifunc-plt-01" rv32 exe
run_dump_test_ifunc "ifunc-plt-01" rv32 pie
run_dump_test_ifunc "ifunc-plt-01" rv32 pic
run_dump_test_ifunc "ifunc-plt-02" rv32 exe
run_dump_test_ifunc "ifunc-plt-02" rv32 pie
run_dump_test_ifunc "ifunc-plt-02" rv32 pic
run_dump_test_ifunc "ifunc-nonplt" rv64 exe
run_dump_test_ifunc "ifunc-nonplt" rv64 pie
run_dump_test_ifunc "ifunc-nonplt" rv64 pic
run_dump_test_ifunc "ifunc-plt-01" rv64 exe
run_dump_test_ifunc "ifunc-plt-01" rv64 pie
run_dump_test_ifunc "ifunc-plt-01" rv64 pic
run_dump_test_ifunc "ifunc-plt-02" rv64 exe
run_dump_test_ifunc "ifunc-plt-02" rv64 pie
run_dump_test_ifunc "ifunc-plt-02" rv64 pic
# Check the .rela.iplt overwrite issue.
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv32 exe
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv32 pie
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv32 pic
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv64 exe
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv64 pie
run_dump_test_ifunc "ifunc-plt-got-overwrite" rv64 pic
# Setup shared libraries.
run_ld_link_tests {
{ "Build shared library for IFUNC non-PLT caller"
"-shared" "" "" {ifunc-seperate-caller-nonplt.s}
{} "ifunc-seperate-caller.so" }
{ "Build shared library for IFUNC PLT caller"
"-shared" "" "" {ifunc-seperate-caller-plt.s}
{} "ifunc-seperate-caller.so" }
{ "Build shared library for IFUNC resolver"
"-shared" "" "" {ifunc-seperate-resolver.s}
{} "ifunc-seperate-resolver.so" }
}
# The IFUNC resolver and caller are in the seperate modules.
# If IFUNC resolver and caller are linked to the same module,
# then the result are the same as the run_dump_test_ifunc.
run_dump_test "ifunc-seperate-nonplt-exe"
run_dump_test "ifunc-seperate-nonplt-pie"
run_dump_test "ifunc-seperate-nonplt-pic"
run_dump_test "ifunc-seperate-plt-exe"
run_dump_test "ifunc-seperate-plt-pie"
run_dump_test "ifunc-seperate-plt-pic"
run_dump_test "ifunc-seperate-pcrel-pie"
run_dump_test "ifunc-seperate-pcrel-pic"
}