#   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
#   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 $OBJDUMP] == 0} then {
	perror "$OBJDUMP does not exist"
	return
    }
}

send_user "Version [binutil_version $OBJDUMP]"

# Simple test of objdump -i

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -i"]

set cpus_expected [list]
lappend cpus_expected a29k alliant alpha arc arm convex 
lappend cpus_expected d10v d30v fr30 fr500 h8 hppa i386 i860 i960 ip2022
lappend cpus_expected m32r m68hc11 m68hc12 m68k m88k MCore
lappend cpus_expected mips mn10200 mn10300 ns32k pj powerpc pyramid
lappend cpus_expected romp rs6000 s390 sh sparc
lappend cpus_expected tahoe tic54x tic80 tms320c30 tms320c4x tms320c54x v850
lappend cpus_expected vax we32k x86-64 xscale z8k z8001 z8002

# Make sure the target CPU shows up in the list.
lappend cpus_expected ${target_cpu}

# Create regexp
set cpus_regex "([join $cpus_expected | ])"

verbose -log "CPU regex: $cpus_regex"

set want "BFD header file version.*srec\[^\n\]*\n\[^\n\]*header \[^\n\]*endian\[^\n\]*, data \[^\n\]*endian.*$cpus_regex"

if [regexp $want $got] then {
    pass "objdump -i"
} else {
    fail "objdump -i"
}

# The remaining tests require a test file.


if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
    return
}
if [is_remote host] {
    set testfile [remote_download host tmpdir/bintest.o]
} else {
    set testfile tmpdir/bintest.o
}

# Test objdump -f

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $testfile"]

set want "$testfile:\[ 	\]*file format.*architecture:\[ 	\]*${cpus_regex}.*HAS_RELOC.*HAS_SYMS"

if ![regexp $want $got] then {
    fail "objdump -f"
} else {
    pass "objdump -f"
}

# Test objdump -h

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $testfile"]

set want "$testfile:\[ 	\]*file format.*Sections.*\[0-9\]+\[ 	\]+\[^ 	\]*(text|TEXT|\\\$CODE\\\$)\[^ 	\]*\[ 	\]*(\[0-9a-fA-F\]+).*\[0-9\]+\[ 	\]+\[^ 	\]*(\\.data|DATA)\[^ 	\]*\[ 	\]*(\[0-9a-fA-F\]+)"

if ![regexp $want $got all text_name text_size data_name data_size] then {
    fail "objdump -h"
} else {
    verbose "text name is $text_name size is $text_size"
    verbose "data name is $data_name size is $data_size"
    set ets 8
    set eds 4
    # The [ti]c4x target has the property sizeof(char)=sizeof(long)=1
    if [istarget *c4x*-*-*] then {
        set ets 2
        set eds 1
    }
    # c54x section sizes are in bytes, not octets; adjust accordingly
    if [istarget *c54x*-*-*] then {
	set ets 4
	set eds 2
    }
    if {[expr "0x$text_size"] < $ets || [expr "0x$data_size"] < $eds} then {
	send_log "sizes too small\n"
	fail "objdump -h"
    } else {
	pass "objdump -h"
    }
}

# Test objdump -t

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $testfile"]

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)]} then {
    fail "objdump -t"
} else {
    pass "objdump -t"
}

# Test objdump -r

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -r $testfile"]

set want "$testfile:\[ 	\]*file format.*RELOCATION RECORDS FOR \\\[\[^\]\]*(text|TEXT|\\\$CODE\\\$)\[^\]\]*\\\].*external_symbol"

if [regexp $want $got] then {
    pass "objdump -r"
} else {
    fail "objdump -r"
}

# Test objdump -s

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s $testfile"]

set want "$testfile:\[ 	\]*file format.*Contents.*(text|TEXT|\\\$CODE\\\$)\[^0-9\]*\[ 	\]*\[0-9a-fA-F\]*\[ 	\]*(00000001|01000000|00000100).*Contents.*(data|DATA)\[^0-9\]*\[ 	\]*\[0-9a-fA-F\]*\[ 	\]*(00000002|02000000|00000200)"

if [regexp $want $got] then {
    pass "objdump -s"
} else {
    fail "objdump -s"
}

# Options which are not tested: -a -d -D -R -T -x -l --stabs
# I don't see any generic way to test any of these other than -a.
# Tests could be written for specific targets, and that should be done
# if specific problems are found.
