# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
#   Copyright 1999-2013 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.

set testname "script"

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

proc check_script { } {
    global nm
    global testname
    global nm_output

    if ![ld_nm $nm "" tmpdir/script] {
	unresolved $testname
	return
    } 

    if {![info exists nm_output(text_start)] \
	    || ![info exists nm_output(text_end)] \
	    || ![info exists nm_output(data_start)] \
	    || ![info exists nm_output(data_end)]} {
	send_log "bad output from nm\n"
	verbose "bad output from nm"
	fail $testname
	return
    } 

    set passes 1
    set text_end 0x104
    set data_end 0x1004

    if [istarget *c4x*-*-*] then {
	set text_end 0x101
	set data_end 0x1001
    }

    if [istarget *c54x*-*-*] then {
	set text_end 0x102
	set data_end 0x1002
    }

    if {$nm_output(text_start) != 0x100} {
	send_log "text_start == $nm_output(text_start)\n"
	verbose "text_start == $nm_output(text_start)"
	set passes 0
    } 

    if {$nm_output(text_end) < $text_end \
	    || $nm_output(text_end) > 0x110} {
	send_log "text_end == $nm_output(text_end)\n"
	verbose "text_end == $nm_output(text_end)"
	set passes 0
    } 

    if {$nm_output(data_start) != 0x1000} {
	send_log "data_start == $nm_output(data_start)\n"
	verbose "data_start == $nm_output(data_start)"
	set passes 0
    } 

    if {$nm_output(data_end) < $data_end \
	    || $nm_output(data_end) > 0x1010} {
	send_log "data_end == $nm_output(data_end)\n"
	verbose "data_end == $nm_output(data_end)"
	set passes 0
    } 

    if { $passes } {
	pass $testname
    } else {
	fail $testname
    }
}

# PE targets need to set the image base to 0 to avoid complications from nm.
set flags ""
if {[istarget "*-*-pe*"] \
    || [istarget "*-*-cygwin*"] \
    || [istarget "*-*-mingw*"] \
    || [istarget "*-*-winnt*"] \
    || [istarget "*-*-nt"] \
    || [istarget "*-*-interix*"] } then {
  set flags "--image-base 0"
}

if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/script.t tmpdir/script.o"] {
    fail $testname
} else {
    check_script
}

set testname "MRI script"

if ![ld_simple_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t"] {
    fail $testname
} else {
    check_script
}

set testname "MEMORY"

if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir/script.o"] {
    fail $testname
} else {
    check_script
}

set test_script_list [lsort [glob $srcdir/$subdir/region-alias-*.t]]

foreach test_script $test_script_list {
    run_dump_test [string range $test_script 0 end-2]
}

run_dump_test "align-with-input"
