#   Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.

# 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 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.

# Please email any bugs, comments, and/or additions to this file to:
# bug-dejagnu@prep.ai.mit.edu

# This file was written by Rob Savoye <rob@cygnus.com>
# and rewritten by Ian Lance Taylor <ian@cygnus.com>

if ![is_remote host] {
    if {[which $NM] == 0} then {
        perror "$NM does not exist"
        return
    }
}

send_user "Version [binutil_version $NM]"


if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
    return
}

if [is_remote host] {
    set tempfile [remote_download host tmpdir/bintest.o]
} else {
    set tempfile tmpdir/bintest.o
}

# Test nm with no arguments.

# This test does not work correctly on ECOFF targets, because ECOFF
# stores most symbols twice, which messes up the nm output.
setup_xfail "alpha*-*-osf*" "alpha*-*-netware*"
setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*"
setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*"

# This test does not work correctly on XCOFF targets, because XCOFF
# does not enter static symbols in the symbol table.
setup_xfail "*-*-aix*"

set got [binutils_run $NM "$NMFLAGS $tempfile"]

if [info exists vars] then { unset vars }
while {[regexp "(\[a-zA-Z\]) (\[a-z_\]*_symbol)(.*)" $got all type symbol rest]} {
    set vars($symbol) $type
    set got $rest
}

if {![info exists vars(text_symbol)] \
     || $vars(text_symbol) != "T" \
     || ![info exists vars(data_symbol)] \
     || $vars(data_symbol) != "D" \
     || ![info exists vars(common_symbol)] \
     || $vars(common_symbol) != "C" \
     || ![info exists vars(external_symbol)] \
     || $vars(external_symbol) != "U" \
     || ![info exists vars(static_text_symbol)] \
     || $vars(static_text_symbol) != "t" \
     || ![info exists vars(static_data_symbol)] \
     || $vars(static_data_symbol) != "d"} {
    fail "nm (no arguments)"
} else {
    pass "nm (no arguments)"
}

# Test nm -g

set got [binutils_run $NM "$NMFLAGS -g $tempfile"]

if [info exists vars] then { unset vars }
while {[regexp "(\[a-z_\]*_symbol)(.*)" $got all symbol rest]} {
    set vars($symbol) 1
    set got $rest
}

if {![info exists vars(text_symbol)] \
     || ![info exists vars(data_symbol)] \
     || ![info exists vars(common_symbol)] \
     || ![info exists vars(external_symbol)] \
     || [info exists vars(static_text_symbol)] \
     || [info exists vars(static_data_symbol)]} {
    fail "nm -g"
} else {
    pass "nm -g"
}

# Test nm -P

# This test does not work correctly on ECOFF targets, because ECOFF
# stores most symbols twice, which messes up the nm output.
setup_xfail "alpha*-*-osf*" "alpha*-*-netware*"
setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*"
setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*"

# This test does not work correctly on XCOFF targets, because XCOFF
# does not enter static symbols in the symbol table.
setup_xfail "*-*-aix*"

set got [binutils_run $NM "$NMFLAGS -P $tempfile"]

set want "common_symbol C \[0\]*4.*data_symbol D \[0-9a-fA-F\]*.*external_symbol U.*static_data_symbol d \[0-9a-fA-F\]*.*static_text_symbol t \[0-9a-fA-F\]*.*text_symbol T \[0-9a-fA-F\]*"

if [regexp $want $got] then {
    pass "nm -P"
} else {
    fail "nm -P"
}

# There are certainly other tests that could be run.
