# Expect script for LD section checks tests
#   Copyright (C) 1999-2018 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 Nick Clifton (nickc@cygnus.com)

proc section_check {} {
    global ld_flags
    global as
    global ld
    global srcdir
    global subdir

    # The usage of .lcomm in asm.s is incompatible with ia64 and ppc coff.
    if { [istarget ia64-*-*]
	 || [istarget powerpc*-*-aix*]
	 || [istarget powerpc-*-beos*]
	 || [istarget rs6000-*-*] } {
	return
    }
    set test "check sections 1"

    set ldflags "--check-sections -e foo"

    if { ![ld_assemble $as $srcdir/$subdir/asm.s tmpdir/asm.o]} {
	unresolved $test
	return
    }

    if ![ld_link $ld tmpdir/asm.x "$ldflags tmpdir/asm.o"] {
	fail $test
    } else {
	pass $test
    }

    set test "check sections 2"

    # Change the linker flags so that our "buggy" linker
    # script is used.
    set ldflags "--check-sections -T $srcdir/$subdir/script -e foo"

    # Perform the equivalent of invoking ld_link
    # except that we need to massage the output further.

    set exec_output [run_host_cmd "$ld" "-o tmpdir/asm.x $ldflags tmpdir/asm.o"]
    set exec_output [prune_warnings $exec_output]

    # Make sure that we got some output from the linker
    if [string match "" $exec_output] then {
	fail $test
    }

    # Now remove our expected error message
    regsub -all ".*: section .data .* overlaps section .text .*" $exec_output "" exec_output

    # And check to see if anything else, (unexpected) was left
    if [string match "" $exec_output] then {
	pass $test
    } else {
	verbose -log "Unexpected linker message(s): $exec_output"
	fail $test
    }
}

proc overflow_check {} {
    # Test only on some 32-bit targets that are often tested
    if { ![istarget i?86-*-*]
	 && ![istarget powerpc-*-*]
	 && ![istarget arm*-*-*] } {
	return
    }
    if ![is_elf_format] {
	return
    }

    run_dump_test "over"
    run_dump_test "over2"
}

section_check
overflow_check
