# Test SIZEOF in a linker script.
# By Ian Lance Taylor, Cygnus Support
# Based on a bug report from anders.blomdell@control.lth.se.
#   Copyright (C) 2001-2021 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 "SIZEOF"

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

if { [is_pecoff_format] } {
    set IMAGE_BASE "--image-base 0"
} else {
    set IMAGE_BASE ""
}

if ![ld_link $ld tmpdir/sizeof "$LDFLAGS -T $srcdir/$subdir/sizeof.t \
	$IMAGE_BASE tmpdir/sizeof.o"] {
    fail $testname
    return
}

if ![ld_nm $nm "" tmpdir/sizeof] {
    fail $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)] \
     || ![info exists nm_output(sizeof_text)] \
     || ![info exists nm_output(sizeof_data)]} {
    send_log "bad output from nm\n"
    verbose "bad output from nm"
    fail $testname
    return
}

if {$nm_output(text_end) - $nm_output(text_start) != $nm_output(sizeof_text)} {
    send_log "text_end - text_start != sizeof_text\n"
    verbose "text_end - text_start != sizeof_text"
    fail $testname
    return
}

if {$nm_output(data_end) - $nm_output(data_start) != $nm_output(sizeof_data)} {
    send_log "data_end - data_start != sizeof_data\n"
    verbose "data_end - data_start != sizeof_data"
    fail $testname
    return
}

if {$nm_output(sizeof_text) != $nm_output(sizeof_data)} {
    send_log "sizeof_text != sizeof_data\n"
    verbose "sizeof_text != sizeof_data"
    fail $testname
    return
}

pass $testname
