# 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-2016 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] {
    unresolved $testname
    return
}

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

if ![ld_nm $nm "" tmpdir/sizeof] {
    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)] \
     || ![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
