#   Copyright (C) 1993-2018 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 {
    fail "nm (assembling)"
} else {

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

# Test nm --size-sort

# The target exceptions here are intended for targets that have ELF as
# an intermediate format or otherwise require the ELF-variant syntax
# for proper size annotation.  It would be nice if is_elf_format found
# all the ELF variants, but adding the patterns here to that proc then
# introduces a whole slew of new regressions in the GAS and LD testsuites.
if {   [is_elf_format]
    || [istarget *-*-beos]
    || [istarget *-*-dragonfly*]
    || [istarget *-*-*elf]
    || [istarget *-*-freebsd*]
    || [istarget *-*-lynxos*]
    || [istarget "mmix-knuth-mmixware"]
    || [istarget *-*-netware*]
    || [istarget *-*-nto*]
    || [istarget *-*-rdos*]
    || [istarget *-*-tpf*]
    || [istarget *-*-uclinux*]
    || [istarget ia64-*-*vms*]
    || [istarget *-*-vxworks*]
    || [istarget wasm32-*-*] } {
    set nm_1_src "nm-elf-1.s"
} else {
    set nm_1_src "nm-1.s"
}

if {![binutils_assemble $srcdir/$subdir/$nm_1_src tmpdir/nm-1.o]} then {
    fail "nm --size-sort (assembling)"
} else {

    if [is_remote host] {
	set tempfile [remote_download host tmpdir/nm-1.o]
    } else {
	set tempfile tmpdir/nm-1.o
    }

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

    set got [binutils_run $NM "$NMFLAGS --size-sort $tempfile"]

    set want "0*4 T text_symbol3.*0*8 T text_symbol2.*0*c T text_symbol1"

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

if [is_elf_format] {
    # PR binutils/12753
    # Test nm -g on a unique global symbol.
    if {![binutils_assemble $srcdir/$subdir/unique.s tmpdir/unique.o]} then {
	unsupported "nm -g on unique symbols"
    } 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"
	}
    }

    # PR binutils/20751
    # Test nm --with-symbol-versions

    if {![binutils_assemble $srcdir/$subdir/nm-ver.s tmpdir/nm-ver.o]} then {
	fail "nm --with-symbol-versions (assembling)"
    } else {
	if [is_remote host] {
	    set tmpfile [remote_download host tmpdir/nm-ver.o]
	} else {
	    set tmpfile tmpdir/nm-ver.o
	}
	
	set got [binutils_run $NM "$NMFLAGS --with-symbol-versions --format sysv $tmpfile"]

	if {! [regexp "foo@VER_1" $got]} then {
	    fail "nm --with-symbol-versions (grep for @VER_1)"
	} else {
	    if {! [regexp "foo@VER_1" $got]} then {
		fail "nm --with-symbol-versions (grep for @@VER_2)"
	    } else {
		pass "nm --with-symbol-versions"
	    }
	}

	if { $verbose < 1 } {
	    remote_file host delete "tmpdir/nm-ver.o"
	}
    }
}

# There are certainly other tests that could be run.
