# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
#   Copyright (C) 1999-2014 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"
