# Copyright (C) 2014-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.

# Don't run on alpha-vms which requires linking with other libraries,
# or on targets that complain about relocations in read-only sections.
if { [istarget *-*-vms]
     || [istarget bfin-*-*]
     || [istarget frv-*-*]
     || [istarget lm32-*-*] } then {
    return
}

# 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" where X is a non-empty string.
set with_sysroot [check_sysroot_available]
verbose -log "Has (non-empty) sysroot support: $with_sysroot; \"$ld_sysroot\""

# We also need to know if the sysroot is "/" (a common use) as some of
# the tests prepend sysroot to the current directory and on most
# common systems "//dir/path" is handled as "/dir/path".
if {$ld_sysroot == "/"} {
    # Use a modified test-subset for testing.
    set with_sysroot 3
}

# The linker on Windows expects Windows style paths.
# MSYS2 runtime converts paths in the command line automatically.
# However, for our test linker scripts, we have to prepare
# the correct paths manually.
proc get_base_dir_for_scripts {} {
    global base_dir
    global get_base_dir_for_scripts_saved

    if { ![info exists get_base_dir_for_scripts_saved] } {
	set get_base_dir_for_scripts_saved $base_dir
	if { ([ishost *-*-cygwin] || [ishost *-*-mingw*] )
	     && ![catch "exec cygpath -m $base_dir" base_dir_converted] } {
	    set get_base_dir_for_scripts_saved $base_dir_converted
	}
    }
    return $get_base_dir_for_scripts_saved
}

# Entries in the array-tables:
# 0: Testtype; an inclusive bitmask indicating that the test should run on a
# build configured for: 1: non-sysroot, 2: sysroot != "/", 4: sysroot == "/".
# 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 {
    {7 "plain -Lpath" "sysroot/" {} ""}
    {7 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
    {7 "full-path" "@cwd@/sysroot/" {} ""}
    {7 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
    {7 "root-anchored $SYSROOT-prefixed -Lpath" "$SYSROOT/sysroot/" {} "cannot find"}
    {7 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
    {7 "plain $SYSROOT-prefixed with empty" "$SYSROOTsysroot/" "--sysroot=" ""}
    {6 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
    {6 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
    {6 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
    {6 "root-anchored $SYSROOT-prefixed script outside" "$SYSROOT/" "--sysroot=@cwd@/sysroot" ""}
    {6 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
    {6 "root-anchored $SYSROOT-prefixed script inside" "$SYSROOT/sysroot/" "--sysroot=@cwd@" ""}
    {2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"}
    {2 "plain $SYSROOT-prefixed without but -Lpath" "$SYSROOTsysroot/" {} "cannot find"}
    {2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"}
    {2 "full-path $SYSROOT-prefixed without" "$SYSROOT@cwd@/sysroot/" {} "cannot find"}
    {1 "plain =-prefixed -Lpath" "=sysroot/" {} ""}
    {1 "plain $SYSROOT-prefixed -Lpath" "$SYSROOTsysroot/" {} ""}
    {1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""}
    {1 "full-path $SYSROOT-prefixed without" "$SYSROOT@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]} {
	perror "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] {
	    perror "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] } {
	    perror "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 $scriptname: $finalscript"

    set res [ld_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 "[get_base_dir_for_scripts]/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
