# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
#   Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2009, 2010
#   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 {
    set testname [file tail $test_script]
    if ![ld_simple_link $ld tmpdir/script "$flags -T $test_script tmpdir/script.o"] {
        xfail "REGION_ALIAS: $testname"
    } else {
        xpass "REGION_ALIAS: $testname"
    }
}
