#   Copyright 1993, 1994, 1995, 1997, 2007, 2009 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 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.

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

if [is_elf_format] {
    # PR binutils/12753
    # Test nm -g on a unique global symbol.

    # Only some targets support unique symbols.
    if {([istarget "i?86-*-*"]
	 || [istarget "x86_64-*-*"]
	 || [istarget "arm-*-*"]
	 || [istarget "powerpc*-*-*"]
	 || [istarget "sparc*-*-*"])} then {

	if {![binutils_assemble $srcdir/$subdir/unique.s tmpdir/unique.o]} then {
	    fail "nm -g on unique symbols (assembling)"
	} else {
	    if [is_remote host] {
		set tmpfile [remote_download host tmpdir/unique.o]
	    } else {
		set tmpfile tmpdir/unique.o
	    }
	
	    set got [binutils_run $NM "$NMFLAGS -g $tmpfile"]

	    if [regexp "u foo" $got] then {
		pass "nm -g on unique symbols"
	    } else {
		fail "nm -g on unique symbols"
	    }

	    if { $verbose < 1 } {
		remote_file host delete "tmpdir/unique.o"
	    }
	}
   }
}

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