X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Ftestsuite%2Flib%2Fbinutils-common.exp;h=b9e3c6d8174168226a044d532b760e22ef8f7d8f;hb=8a8a1171237d45e20b2ebb18ee2d3f8686e01b82;hp=d5951e62f2c6fa56e4942f48341341e759078c57;hpb=b3adc24a0713411ab38a21dc894dd40dbc5c8f4f;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp index d5951e62f2..b9e3c6d817 100644 --- a/binutils/testsuite/lib/binutils-common.exp +++ b/binutils/testsuite/lib/binutils-common.exp @@ -171,32 +171,37 @@ proc is_rela { binary_file } { # in square brackets or as machine triplet otherwise. # proc match_target { target } { - if [string match {\[*\]} $target] { + if [regexp {^!?\[.*\]$} $target] { return $target } else { return [istarget $target] } } -# True if the ELF target supports STB_GNU_UNIQUE with the ELF header's -# OSABI field set to ELFOSABI_GNU. +# True if the ELF target supports setting the ELF header OSABI field +# to ELFOSABI_GNU or ELFOSABI_FREEBSD, a requirement for STT_GNU_IFUNC +# symbol and SHF_GNU_MBIND section support. # # This generally depends on the target OS only, however there are a # number of exceptions for bare metal targets as follows. The MSP430 -# and Visium targets set OSABI to ELFOSABI_STANDALONE and cannot -# support STB_GNU_UNIQUE. Likewise non-EABI ARM targets set OSABI to -# ELFOSABI_ARM, and TI C6X targets to ELFOSABI_C6000_*. Finally -# rather than `bfd_elf_final_link' a number of targets use -# `_bfd_generic_final_link', which does not support STB_GNU_UNIQUE -# symbol binding causing assertion failures. +# and Visium targets set OSABI to ELFOSABI_STANDALONE. Likewise +# non-EABI ARM targets set OSABI to ELFOSABI_ARM # -proc supports_gnu_unique {} { +# Note that some TI C6X targets use ELFOSABI_C6000_* but one doesn't, +# so we don't try to sort out tic6x here. (The effect is that linker +# testcases will generally need to exclude tic6x or use a -m option.) +# +proc supports_gnu_osabi {} { if { [istarget *-*-gnu*] || [istarget *-*-linux*] - || [istarget *-*-nacl*] } { - return 1 - } - if { [istarget "arm*-*-*eabi*"] } { + || [istarget *-*-nacl*] + || ( [istarget *-*-*bsd*] && ![istarget arm*-*-netbsd*] ) + || [istarget *-*-symbianelf] + || [istarget *-*-lynxos] + || ( [istarget *-*-nto*] && ![istarget arm*-*-*] ) + || [istarget *-*-irix*] + || [istarget *-*-*eabi*] + || [istarget *-*-rtems*] } { return 1 } if { [istarget "wasm32*-*-*"] } { @@ -207,19 +212,36 @@ proc supports_gnu_unique {} { } if { [istarget "arm*-*-*"] || [istarget "msp430-*-*"] - || [istarget "tic6x-*-*"] || [istarget "visium-*-*"] } { return 0 } - if { [istarget "am33_2.0-*-*"] - || [istarget "d30v-*-*"] + return 1 +} + +# Return true if target uses the generic_link_hash_table linker. +proc is_generic { } { + if { [istarget "d30v-*-*"] || [istarget "dlx-*-*"] || [istarget "pj*-*-*"] || [istarget "s12z-*-*"] || [istarget "xgate-*-*"] } { + return 1 + } + return 0 +} + +# True if the ELF target supports STB_GNU_UNIQUE. +# +# This require ELFOSABI_GNU, and `bfd_elf_final_link'. +# +proc supports_gnu_unique {} { + if { [istarget *-*-freebsd*] } { return 0 } - return 1 + if { [supports_gnu_osabi] && ![is_generic] } { + return 1 + } + return 0 } # True for targets that do not sort .symtab as per the ELF standard. @@ -269,6 +291,23 @@ proc check_shared_lib_support { } { return $shared_available_saved } +# Returns true if -pie is supported on the target + +proc check_pie_support { } { + global pie_available_saved + global ld + + if {![info exists pie_available_saved]} { + set ld_output [remote_exec host $ld "-pie"] + if { [ string first "not supported" $ld_output ] >= 0 } { + set pie_available_saved 0 + } else { + set pie_available_saved 1 + } + } + return $pie_available_saved +} + # Compare two files line-by-line. FILE_1 is the actual output and FILE_2 # is the expected output. Ignore blank lines in either file. # @@ -1399,12 +1438,24 @@ proc big_or_little_endian {} { set tmp_flags " [board_info [target_info name] multilib_flags]" foreach x $tmp_flags { - case $x in { - {*big*endian eb EB -eb -EB -mb -meb} { + switch -glob $x { + *big*endian - + eb - + EB - + -eb - + -EB - + -mb - + -meb { set flags " -EB" return $flags } - {*little*endian el EL -el -EL -ml -mel} { + *little*endian - + el - + EL - + -el - + -EL - + -ml - + -mel { set flags " -EL" return $flags }