# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
#   Copyright 2001
#   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
    } else {
	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
	} else {
	    set text_end 0x104
	    set data_end 0x1004
	    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)"
		fail $testname
	    } else { 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)"
		fail $testname
	    } else { if {$nm_output(data_start) != 0x1000} {
		send_log "data_start == $nm_output(data_start)\n"
		verbose "data_start == $nm_output(data_start)"
		fail $testname
	    } else { 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)"
		fail $testname
	    } else {
		pass $testname
	    } } } }
	}
    }
}

# PE targets need to set the image base to 0 to avoid complications from nm.
set flags ""
if {[istarget "*-*-pe*"] \
    || [istarget "*-*-cygwin*"] \
    || [istarget "*-*-mingw32*"] \
    || [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
}
