# Expect script for ld discard tests
#   Copyright 2001, 2002 Free Software Foundation, Inc.
#
# This file 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 2 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 Hans-Peter Nilsson (hp@axis.com)
#	     H.J. Lu (hjl@gnu.org)
#

# Test for ELF here, so we don't have to qualify on ELF specifically
# in every .d-file.

if { ![istarget *-*-linux*] \
     && ![istarget *-*-gnu] \
     && ![istarget hppa*64*-*-hpux*] \
     && ![istarget *-*-elf] } {
    return
}

if { [istarget *-*-linux*aout*] \
     || [istarget *-*-linux*oldld*] } {
    return
}

load_lib ld-lib.exp

set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
for { set i 0 } { $i < [llength $test_list] } { incr i } {
    # We need to strip the ".d", but can leave the dirname.
    verbose [file rootname [lindex $test_list $i]]
    # These fail because they use the generic linker.
    setup_xfail "arc-*" "d30v-*" "dlx-*" "i960-*" "m6812-*" "m68hc12-*"
    setup_xfail "or32-*" "pj-*"
    run_dump_test [file rootname [lindex $test_list $i]]
}
