# Test for --section-ordering-file FILE.
# Copyright (C) 2024 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.

# The --section-ordering-file option is only supported by ELF and
# PE COFF linkers, which allow for arbitrarily named sections, eg:
# .text.*
if { !([is_elf_format] || [is_pecoff_format]) } {
    return
}

set old_ldflags $LDFLAGS
if { [istarget spu*-*-*] } then {
    set LDFLAGS "$LDFLAGS --local-store 0:0 --no-overlays"
} elseif { [is_pecoff_format] } then {
    set LDFLAGS "$LDFLAGS --image-base 0"
} elseif { [is_xcoff_format] } then {
    set LDFLAGS "$LDFLAGS -bnogc"
}

set test_list [lsort [glob -nocomplain $srcdir/$subdir/section-order*.d]]
foreach test_file $test_list {
    set test_name [file rootname $test_file]
    set map_file "tmpdir/[file tail $test_name].map"
    verbose $test_name
    run_dump_test $test_name
}

set LDFLAGS $old_ldflags
