# 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 *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)"
		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
}
