Add sysroot-prefix ld linker tests.
authorHans-Peter Nilsson <hp@bitrange.com>
Wed, 15 Oct 2014 00:59:41 +0000 (02:59 +0200)
committerHans-Peter Nilsson <hp@bitrange.com>
Wed, 15 Oct 2014 00:59:41 +0000 (02:59 +0200)
* ld-scripts/sysroot-prefix.exp, ld-scripts/sysroot-prefix-x.s,
ld-scripts/sysroot-prefix-y.s: New files.

N.B: full coverage is only possible with complementary use of
--with-sysroot when configuring.

ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/sysroot-prefix-x.s [new file with mode: 0644]
ld/testsuite/ld-scripts/sysroot-prefix-y.s [new file with mode: 0644]
ld/testsuite/ld-scripts/sysroot-prefix.exp [new file with mode: 0644]

index f8dcc96f8a2ac27ab32ebaefcded07aa830831c7..d6bc2b098222392863125f8b6c370fc8acc9a981 100644 (file)
@@ -1,5 +1,7 @@
 2014-10-15  Hans-Peter Nilsson  <hp@axis.com>
 
+       * ld-scripts/sysroot-prefix.exp, ld-scripts/sysroot-prefix-x.s,
+       ld-scripts/sysroot-prefix-y.s: New files.
        * lib/ld-lib.exp (check_sysroot_available): New proc.
 
 2014-10-04  Alan Modra  <amodra@gmail.com>
diff --git a/ld/testsuite/ld-scripts/sysroot-prefix-x.s b/ld/testsuite/ld-scripts/sysroot-prefix-x.s
new file mode 100644 (file)
index 0000000..9b81905
--- /dev/null
@@ -0,0 +1,5 @@
+       .data
+       .globl x
+x:
+       .dc.a y
+
diff --git a/ld/testsuite/ld-scripts/sysroot-prefix-y.s b/ld/testsuite/ld-scripts/sysroot-prefix-y.s
new file mode 100644 (file)
index 0000000..f05ffa0
--- /dev/null
@@ -0,0 +1,4 @@
+       .data
+       .globl y
+y:
+       .dc.a 0
diff --git a/ld/testsuite/ld-scripts/sysroot-prefix.exp b/ld/testsuite/ld-scripts/sysroot-prefix.exp
new file mode 100644 (file)
index 0000000..cf434df
--- /dev/null
@@ -0,0 +1,183 @@
+# Copyright (C) 2014 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.
+
+# Check that scripts using the "=" sysroot-prefix work, for both
+# toolchains with and without --sysroot support.
+
+# We test this by emitting archives into a subdirectory and expect
+# constructs such as GROUP and AS_NEEDED (the only two constructs
+# actually tested) to find them (or not); both quoted and unquoted
+# paths, with different prefixes on the path and with --sysroot
+# present or not, with different arguments.
+
+# Find out if the linker supports sysroot; if it was configured
+# "--with-sysroot X".  We ignore that X can actually be set to
+# interfere with the tests, as that's unlikely to be useful, and
+# assume that the build-directory (aka. $base_dir) does not contain X.
+set with_sysroot [check_sysroot_available]
+verbose -log "Has (non-empty) sysroot support: $with_sysroot"
+
+# Entries in the array-tables:
+# 0: Testtype (1: only non-sysroot, 2: only sysroot, 3: either).
+# 1: Description, forming part of the dejagnu test-name.
+# 2: Replacement for @p@.
+# 3: Option to pass to linker (usually something with --sysroot).
+# 4: Message substring; a substring to match against the error message
+# if an error is expected, or empty if no error is expected.
+#
+# If the replacement or option contains @cwd@, that'll be replaced by
+# "$base_dir/tmpdir", the full path to the location of the script
+# (with the actual files in the "sysroot" subdirectory).  If the
+# description contains @cwd@, that will be replaced by "<CWD>".
+
+set sysroot_prefix_tests {
+    {3 "plain -Lpath" "sysroot/" {} ""}
+    {3 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
+    {3 "full-path" "@cwd@/sysroot/" {} ""}
+    {3 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
+    {3 "full-path =-prefixed with empty" "=@cwd@/sysroot/" "--sysroot=" ""}
+    {3 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
+    {2 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
+    {2 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
+    {2 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
+    {2 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
+    {2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"}
+    {2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"}
+    {1 "plain =-prefixed -Lpath" "=sysroot/" {} ""}
+    {1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""}
+}
+
+# May have to provide a target-specific assembler option for some targets.
+set gasopt ""
+
+# Intentionally similar to the ubiquitous glibc libc.so script.
+set template "GROUP ( @q@@p@tmp/ldtest-xyzzy/libx.a@q@ AS_NEEDED ( @q@@p@tmp/ldtest-xyzzy/liby.a@q@ ) )"
+
+# Set up everything from the variables above.
+proc sysroot_prefix_test_setup { } {
+    global as gasopt srcdir subdir ar
+
+    if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/pr14962a.s tmpdir/main.o]} {
+       error "Error assembling a trivial file for sysroot-prefix tests framework"
+       return 0
+    }
+
+    # We need somewhere under tmpdir to point the sysroot, a subdirectory
+    # that is benevolent if it escapes into "/".
+    remote_exec host "mkdir -p tmpdir/sysroot/tmp/ldtest-xyzzy"
+
+    # 0: a "main" object that needs a symbol (x) (most portably by
+    # using a pre-existing file).  1: a library with an object that
+    # provides that symbol and needs another one (y).  2: another
+    # library with a third object providing that other symbol.
+    set sysroot_prefix_tests_framework_objects  {
+       {"pr14962a.s" "main" ""}
+       {"sysroot-prefix-x.s" "x" "x"}
+       {"sysroot-prefix-y.s" "y"  "y"}
+    }
+
+    foreach test_object $sysroot_prefix_tests_framework_objects {
+       set sname [lindex $test_object 0]
+       set onamebase [lindex $test_object 1]
+       set oname "tmpdir/$onamebase.o"
+       set libnamebase [lindex $test_object 2]
+
+       if ![ld_assemble_flags $as $gasopt $srcdir/$subdir/$sname $oname] {
+           error "Error assembling trivial file $sname for sysroot-prefix tests framework"
+           return 0
+       }
+
+       if { [string length $libnamebase] != 0 &&
+            ![ar_simple_create $ar "" tmpdir/sysroot/tmp/ldtest-xyzzy/lib$libnamebase.a $oname] } {
+           error "Error creating archive $libnamebase for sysroot-prefix tests framework"
+           return 0
+       }
+    }
+
+    return 1
+}
+
+# Run a single linker test.
+proc single_sysroot_prefix_test { type xtestname finalscript ldopt errstr } {
+    global ld exec_output with_sysroot
+    set scriptname "tmpdir/libsysroottest.a"
+    set testname "sysroot-prefix $xtestname"
+
+    if { ($type & ($with_sysroot + 1)) == 0 } {
+       unsupported $testname
+       return
+    }
+
+    if [catch { set ofd [open $scriptname w] } x] {
+       perror "$x"
+       unresolved $testname
+       return
+    }
+
+    puts $ofd "$finalscript"
+    close $ofd
+    verbose -log "script: $finalscript"
+
+    set res [ld_simple_link $ld tmpdir/output "$ldopt tmpdir/main.o -Ltmpdir -lsysroottest"]
+    set ld_output "$exec_output"
+    set expect_success [expr [string length $errstr] == 0]
+
+    if { $res == $expect_success &&
+         ($expect_success || [regexp "$errstr" $ld_output]) } {
+       pass $testname
+       catch "exec rm -f $scriptname"
+    } {
+       fail $testname
+    }
+}
+
+# Run all interesting variants from an option-and-path combination.
+proc run_sysroot_prefix_test { type name templ p ldopt errstr } {
+    global base_dir
+    set qlist { { "quoted" "\"" } { "unquoted" {} } }
+
+    regsub -all "@p@" $templ $p templ
+    regsub -all "@cwd@" $templ "$base_dir/tmpdir" templ
+    regsub -all "@cwd@" $ldopt "$base_dir/tmpdir" ldopt
+    regsub -all "@cwd@" $name "<CWD>" name
+
+    foreach qitems $qlist {
+       regsub -all "@q@" $templ [lindex $qitems 1] finalscript
+       single_sysroot_prefix_test $type "$name, [lindex $qitems 0]" \
+               $finalscript $ldopt $errstr
+    }
+}
+
+# Run a list of option-and-path test-combinations.
+proc run_sysroot_prefix_tests { descr templ items } {
+    foreach item $items {
+       set type [lindex $item 0]
+       set name [lindex $item 1]
+       set p [lindex $item 2]
+       set ldopt [lindex $item 3]
+       set errstr [lindex $item 4]
+       run_sysroot_prefix_test $type "$descr $name" $templ "$p" "$ldopt" "$errstr"
+    }
+}
+
+if ![sysroot_prefix_test_setup] {
+    return
+}
+
+run_sysroot_prefix_tests "common" $template $sysroot_prefix_tests