diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-26 11:03:35 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-26 11:03:35 -0700 |
commit | 09797ba54abf3683ea66eedddf6afbe7653f9cb9 (patch) | |
tree | 8030b2ed79c7463c89d6da294782e9d503c84f50 /binutils-2.24/ld/testsuite/ld-elfcomm | |
parent | 5a2caf34e4995860baf405552163df288000b7bf (diff) | |
download | toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.zip toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.tar.gz toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.tar.bz2 |
Initial checkin of binutils 2.24.
Change-Id: I0dfcbae6608dded6c3586bf5f4ac27e9612e70a2
Diffstat (limited to 'binutils-2.24/ld/testsuite/ld-elfcomm')
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-elfcomm/common1a.c | 2 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-elfcomm/common1b.c | 7 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-elfcomm/elfcomm.exp | 273 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-elfcomm/sort-common.s | 6 |
4 files changed, 288 insertions, 0 deletions
diff --git a/binutils-2.24/ld/testsuite/ld-elfcomm/common1a.c b/binutils-2.24/ld/testsuite/ld-elfcomm/common1a.c new file mode 100644 index 0000000..eb8fbef --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-elfcomm/common1a.c @@ -0,0 +1,2 @@ +char foo1 [2] __attribute__((aligned(64))); +char foo2 [2] __attribute__((aligned(128))); diff --git a/binutils-2.24/ld/testsuite/ld-elfcomm/common1b.c b/binutils-2.24/ld/testsuite/ld-elfcomm/common1b.c new file mode 100644 index 0000000..a375c90 --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-elfcomm/common1b.c @@ -0,0 +1,7 @@ +static +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) + __attribute__((__used__)) +#endif /* __GNUC__ */ + char dummy1 = 'X'; +char foo1 [] = "Aligned at odd byte."; +char foo2 [4]; diff --git a/binutils-2.24/ld/testsuite/ld-elfcomm/elfcomm.exp b/binutils-2.24/ld/testsuite/ld-elfcomm/elfcomm.exp new file mode 100644 index 0000000..c5c7539 --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-elfcomm/elfcomm.exp @@ -0,0 +1,273 @@ +# Expect script for common symbol tests +# Copyright 2003, 2005, 2006, 2007, 2008, 2009 +# 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. +# +# Written by H.J. Lu (hjl@gnu.org) +# + +# Make sure that ld correctly handles common symbols in ELF. + +# This test can only be run on ELF platforms. +if ![is_elf_format] { + return +} + +# hpux assembly is weird +if [istarget "hppa*-*-hpux*"] { + return +} + +proc test_sort_common {} { + global exec_output + global objdump + global srcdir + global subdir + global as + global ld + + set test "--sort-common (descending)" + + verbose "Check to see that --sort-common sorts in descending alignment" + + # We do not run the sort common tests for the DLX target because we know that the linker + # will seg-fault. The built-in DLX linker script requires that there be something in the + # .text section and our sort-common.s file does not provide anything. + if [istarget dlx-*-*] { + untested "$test" + return 0 + } + + if { ![ld_assemble $as $srcdir/$subdir/sort-common.s tmpdir/sort-common.o] } { + unresolved "$test" + return 0 + } + + if { ![ld_simple_link $ld tmpdir/sort-common.dx "--sort-common=descending tmpdir/sort-common.o"] } { + fail "$test" + return 0 + } + + send_log "$objdump --syms tmpdir/sort-common.dx | grep var | sort\n" + set exec_output [run_host_cmd "$objdump" "--syms tmpdir/sort-common.dx | grep var | sort"] + + # Don't know why, but the CR ports fail this test. + setup_xfail "cr16-*-*" "crx-*-*" + + # Note: The second regexp is for targets which put small commons in a .sbss + # section and large commons in a .bss section. + if { ![regexp ".*var_16.*var_8.*var_4.*var_2.*var_1.*" $exec_output] + && ![regexp ".*sbss.*var_8.*var_4.*var_2.*var_1.*bss.*var_16.*" $exec_output] } { + fail $test + } else { + pass $test + } + + set test "--sort-common (ascending)" + + verbose "Check to see that --sort-common=ascending sorts in ascending alignment" + + if { ![ld_simple_link $ld tmpdir/sort-common.ax "--sort-common=ascending tmpdir/sort-common.o"] } { + fail "$test" + return 0 + } + + send_log "$objdump --syms tmpdir/sort-common.ax | grep var | sort\n" + set exec_output [run_host_cmd "$objdump" "--syms tmpdir/sort-common.ax | grep var | sort"] + + if {![regexp ".*var_1.*var_2.*var_4.*var_8.*var_16.*" $exec_output]} { + fail $test + return 0 + } + + pass $test + return 1 +} + +test_sort_common + +set test1 "size/aligment change of common symbols" +set test1w1 "$test1 (warning 1)" +set test1w2 "$test1 (warning 2)" +set test1c1 "$test1 (change 1)" +set test1c2 "$test1 (change 2)" + +if { ![is_remote host] && [which $CC] == 0 } { + untested $test1w1 + untested $test1w2 + untested $test1c1 + untested $test1c2 + return +} +if { [istarget score-*-*] } { + untested $test1w1 + untested $test1w2 + untested $test1c1 + untested $test1c2 + return +} + +proc dump_common1 { testname } { + global exec_output + global READELF + + send_log "$READELF --syms tmpdir/common1.o | grep foo\n" + set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common1.o | grep foo"] + + if { ![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0\]*)80(\[ \]+)4(\[ \]+)(COMMON|OBJECT)(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)(PRC\\\[0xff03\\\]|COM|SCOM)(\[ \]+)_?foo2" $exec_output] + || ![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0-9\]+)(\[ \]+)21(\[ \]+)OBJECT(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)(\[0-9\]+)(\[ \]+)_?foo1" $exec_output] } { + verbose $exec_output + fail $testname + return 0 + } + + return 1 +} + +proc stt_common_test { options testname } { + global exec_output + global READELF + global ld + + set options "$options tmpdir/common1a.o" + + if { ! [ld_simple_link $ld tmpdir/common.exe $options] } { + unresolved $testname + return 0 + } + + send_log "$READELF --syms tmpdir/common.exe | grep foo\n" + set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common.exe | grep foo"] + + if {![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0-9\]+)(\[ \]+)(\[0-9\]+)(\[ \]+)COMMON(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)(\[0-9\]+)(\[ \]+)_?foo2" $exec_output] } { + fail $testname + return 0 + } + + pass $testname + return 1 +} + +# Check to see if the assembler is generating symbols with the STT_COMMON type. +proc assembler_generates_commons {} { + global exec_output + global READELF + + verbose "Check to see if STT_COMMON symbols are being generated:" + set exec_output [run_host_cmd "$READELF" "--syms tmpdir/common1a.o | grep foo"] + + if { ![regexp "(\[ \]*)(\[0-9\]+):(\[ \]*)(\[0\]*)80(\[ \]+).(\[ \]+)COMMON(\[ \]+)GLOBAL(\[ \]+)DEFAULT(\[ \]+)(PRC\\\[0xff03\\\]|COM|SCOM)(\[ \]+)_?foo2" $exec_output] } { + verbose "STT_COMMON not generated" + return 0 + } + + verbose "STT_COMMON's are generated" + return 1 +} + +if [istarget nios2*-*-*] { + set CFLAGS "$CFLAGS -G0" +} + +# Explicitly use "-fcommon" so that even if $CFLAGS includes +# "-fno-common", these tests are compiled as expected. +if { ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1a.c tmpdir/common1a.o] + || ![ld_compile "$CC $CFLAGS -fcommon" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } { + unresolved $test1 + return +} + +global ld +global link_output + +set options "-r tmpdir/common1a.o tmpdir/common1b.o" + +# SH64 targets needs an extra ld option for this test. +if [istarget sh64*-*-*] { + if [istarget sh64*l*-*-*] { + set options "-mshlelf32 $options" + } else { + set options "-mshelf32 $options" + } +} + +if { [ld_simple_link $ld tmpdir/common1.o $options] } { + unresolved $test1w1 + return +} + +# This test fails on MIPS because the backend sets type_change_ok. +# The size change warning is suppressed. Same on hppa64. +if {[istarget mips*-*-*] || [istarget hppa*64*-*-*]} { + if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } { + fail $test1w1 + } else { + pass $test1w1 + } +} else { + if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] + || ![regexp "Warning: size of symbol \`_?foo1\' changed from 2 in tmpdir/common1a.o to 21 in tmpdir/common1b.o" $link_output] } { + fail $test1w1 + } else { + pass $test1w1 + } +} + +if { [dump_common1 $test1c1] } { + pass $test1c1 +} + +set options "-r tmpdir/common1b.o tmpdir/common1a.o" + +# SH64 targets needs an extra ld option for this test. +if [istarget sh64*-*-*] { + if [istarget sh64*l*-*-*] { + set options "-mshlelf32 $options" + } else { + set options "-mshelf32 $options" + } +} + +if { [ld_simple_link $ld tmpdir/common1.o $options] } { + unresolved $test1w2 + return +} + +if { ![regexp "Warning: alignment (\[0-9\]+) of symbol \`_?foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } { + fail $test1w2 +} else { + pass $test1w2 +} + +if { [dump_common1 $test1c2] } { + pass $test1c2 +} + +# +# The following tests are for when we are generating STT_COMMON symbols only. +# + +if { ![assembler_generates_commons] } { + return +} + +stt_common_test "-static -e 0" "static link of common symbols" +stt_common_test "-shared" "shared link of common symbols" +stt_common_test "-pie" "position independent link of common symbols" + diff --git a/binutils-2.24/ld/testsuite/ld-elfcomm/sort-common.s b/binutils-2.24/ld/testsuite/ld-elfcomm/sort-common.s new file mode 100644 index 0000000..478d73e --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-elfcomm/sort-common.s @@ -0,0 +1,6 @@ + .comm var_1byte_align,1,1 + .comm var_2byte_align,2,2 + .comm var_4byte_align,4,4 + .comm var_8byte_align,8,8 + .comm var_16byte_align,16,16 + |