#   Copyright (C) 1993-2022 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 $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 aarch64 alpha am33-2 arc ARC700 ARCv2 arm cris
lappend cpus_expected d10v d30v fr30 fr500 fr550 h8 hppa i386 iamcu ip2022
lappend cpus_expected m16c m32c m32r m68hc11 m68hc12 m68k MCore mep c5 h1 MicroBlaze
lappend cpus_expected mips mn10200 mn10300 ms1 msp MSP430 nds32 n1h_v3 ns32k
lappend cpus_expected or1k or1knd pj powerpc pyramid riscv romp rs6000 s390 sh sparc
lappend cpus_expected tic54x tilegx tms320c30 tms320c4x tms320c54x
lappend cpus_expected v850 vax x86-64 xscale xtensa z8k z8001 z8002
lappend cpus_expected Loongarch64 Loongarch32

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

set obj o
if { [istarget "*-*-vms"] } then {
    set obj obj
}
set exe [exeext]

# The remaining tests require a test file.

if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.${obj}]} then {
    fail "objdump (assembling bintest.s)"
    return
}
if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest2.${obj}]} then {
    fail "objdump (assembling)"
    return
}
if [is_remote host] {
    set testfile [remote_download host tmpdir/bintest.${obj}]
    set testfile2 [remote_download host tmpdir/bintest2.${obj}]
} else {
    set testfile tmpdir/bintest.${obj}
    set testfile2 tmpdir/bintest2.${obj}
}

# $testarchive exists only if it is supported.
set testarchive tmpdir/bintest.a
remote_file host delete $testarchive
set got [binutils_run $AR "rc tmpdir/bintest.a $testfile2"]
if ![string match "" $got] then {
    fail "bintest.a"
    remote_file host delete tmpdir/bintest.a
} elseif [is_remote host] {
    set testarchive [remote_download host tmpdir/bintest.a]
}
remote_file host delete tmpdir/bintest2.${obj}

# Test objdump -f

proc test_objdump_f { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS
    global cpus_regex

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

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

    if ![regexp $want $got] then {
	fail "objdump -f ($testfile, $dumpfile)"
    } else {
	pass "objdump -f ($testfile, $dumpfile)"
    }
}

test_objdump_f $testfile $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_f $testarchive bintest2.${obj}
}

# Test objdump -h

proc test_objdump_h { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

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

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

    if ![regexp $want $got all text_name text_size data_name data_size] then {
	fail "objdump -h ($testfile, $dumpfile)"
    } 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 ($testfile, $dumpfile)"
	} else {
	    pass "objdump -h ($testfile, $dumpfile)"
	}
    }
}

test_objdump_h $testfile $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_h $testarchive bintest2.${obj}
}

# Test objdump -t

proc test_objdump_t { testfile} {
    global OBJDUMP
    global OBJDUMPFLAGS

    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 ($testfile)"
    } else {
	pass "objdump -t ($testfile)"
    }
}

test_objdump_t $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_t $testarchive
}

# Test objdump -r

proc test_objdump_r { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

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

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

    if [regexp $want $got] then {
	pass "objdump -r ($testfile, $dumpfile)"
    } else {
	fail "objdump -r ($testfile, $dumpfile)"
    }
}

test_objdump_r $testfile $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_r $testarchive bintest2.${obj}
}

# Test objdump -d
proc test_objdump_d { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

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

    set want "${dumpfile}.*:.*Disassembly of section"
    if ![regexp $want $got] then {
	fail "objdump -d $testfile: No disassembly title"
	return
    }

    set want "${dumpfile}.*:.*00+0 <text_symbol>"
    if ![regexp $want $got] then {
	fail "objdump -d $testfile: Missing symbol name and address"
	return
    }

    set want "${dumpfile}.*:.*00+. <text_symbol2>"
    if ![regexp $want $got] then {
	fail "objdump -d $testfile: Missing second symbol"
	return
    }

    set want "${dumpfile}.*:.*00+. <text_symbol3>"
    if ![regexp $want $got] then {
	fail "objdump -d $testfile: Missing third symbol"
	return
    }

    pass "objdump -d $testfile"
}

test_objdump_d $testfile $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_d $testarchive bintest2.${obj}
}

# Test objdump --disassemble=<symbol>
proc test_objdump_d_sym { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble=text_symbol2 $testfile"]

    set want "$dumpfile:.*Disassembly of section"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=text_symbol2 $testfile: No disassembly title"
	return
    }

    set want "$dumpfile:.*00+0 <text_symbol>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=text_symbol2 $testfile: First symbol displayed, when it should be absent"
	return
    }

    set want "$dumpfile:.*00+. <text_symbol2>"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=text_symbol2 $testfile: Missing second symbol"
	return
    }

    set want "$dumpfile:.*00+. <text_symbol3>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=text_symbol2 $testfile: Third symbol displayed when it should be absent"
	return
    }

    pass "objdump --disassemble=text_symbol2 $testfile"
}

test_objdump_d_sym $testfile $testfile

proc test_objdump_d_func_sym { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble=func --disassemble-zeroes $testfile"]

    set want "$dumpfile:.*Disassembly of section"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=func $testfile: No disassembly title"
	return
    }

    set want "$dumpfile:.*00+0 <start_of_text>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=func $testfile: First symbol displayed, when it should be absent"
	return
    }

    set want "$dumpfile:.*00+. <func>"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=func $testfile: Disassembly does not start at function symbol"
	return
    }

    set want "$dumpfile:.*00+. <global_non_func_sym>"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=func $testfile: Non function symbol not displayed"
	return
    }

    set want "$dumpfile:.*00+. <next_func>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=func $testfile: Disassembly did not stop at the next function"
	return
    }

    pass "objdump --disassemble=func $testfile"
}

proc test_objdump_d_non_func_sym { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble=global_non_func_sym $testfile"]

    set want "$dumpfile:.*Disassembly of section"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=non_func $testfile: No disassembly title"
	return
    }

    set want "$dumpfile:.*00+0 <start_of_text>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=non_func $testfile: First symbol displayed, when it should be absent"
	return
    }

    set want "$dumpfile:.*00+. <global_non_func_sym>"
    if ![regexp $want $got] then {
	fail "objdump --disassemble=non_func $testfile: Non function symbol not displayed"
	return
    }

    set want "$dumpfile:.*00+. <local_non_func_sym>"
    if [regexp $want $got] then {
	fail "objdump --disassemble=non_func $testfile: Disassembly did not stop at the next symbol"
	return
    }

    pass "objdump --disassemble=non_func $testfile"
}

# Extra test for ELF format - check that --disassemble=func disassembles
# all of func, and does not stop at the next symbol.
if { [is_elf_format] } then {

    if {![binutils_assemble $srcdir/$subdir/disasm.s tmpdir/disasm.${obj}]} then {
	fail "objdump --disassemble=func (assembling disasm.s)"
    } else {
	if [is_remote host] {
	    set elftestfile [remote_download host tmpdir/disasm.${obj}]
	} else {
	    set elftestfile tmpdir/disasm.${obj}
	}
    
	test_objdump_d_func_sym $elftestfile $elftestfile
	test_objdump_d_non_func_sym $elftestfile $elftestfile
    }
}


# Test objdump -s

proc test_objdump_s { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

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

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

    if [regexp $want $got] then {
	pass "objdump -s ($testfile, $dumpfile)"
    } else {
	fail "objdump -s ($testfile, $dumpfile)"
    }
}

test_objdump_s $testfile $testfile
if { [ remote_file host exists $testarchive ] } then {
    test_objdump_s $testarchive bintest2.${obj}
}

# Test objdump -s on a file that contains a compressed .debug section

if { ![is_elf_format] } then {
    unsupported "objdump compressed debug"
} elseif { ![binutils_assemble $srcdir/$subdir/dw2-compressed.S tmpdir/dw2-compressed.${obj}] } then {
    fail "objdump compressed debug"
} else {
    if [is_remote host] {
	set compressed_testfile [remote_download host tmpdir/dw2-compressed.${obj}]
    } else {
	set compressed_testfile tmpdir/dw2-compressed.${obj}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -s -j .zdebug_abbrev $compressed_testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "objdump -s -j .zdebug_abbrev (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    if { [regexp_diff objdump.out $srcdir/$subdir/objdump.s] } then {
	fail "objdump -s -j .zdebug_abbrev"
    } else {
	pass "objdump -s -j .zdebug_abbrev"
    }

    # Test objdump -W on a file that contains some compressed .debug sections

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -W $compressed_testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "objdump -W (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    if { [regexp_diff objdump.out $srcdir/$subdir/objdump.W] } then {
	fail "objdump -W"
    } else {
	pass "objdump -W"
    }
}

# Test objdump -WL on a file that contains line information for multiple files and search directories.
# Not supported on mcore and moxie targets because they do not (yet) support the generation
# of DWARF2 line debug information.

if { ![is_elf_format]
     || [istarget "hppa64*-*-hpux*"]
     || [istarget "ia64*-*-*"]
     || [istarget "mcore-*-*"]
     || [istarget "moxie-*-*"]
} then {
    unsupported "objump decode line"
} else {
    if { [istarget "or1k*-*-*"] } then {
        set decodedline_testsrc $srcdir/$subdir/dw2-decodedline-1.S
    } else {
        set decodedline_testsrc $srcdir/$subdir/dw2-decodedline.S
    }
    if { ![binutils_assemble $decodedline_testsrc tmpdir/dw2-decodedline.${obj}] } then {
	fail "objdump decoded line"
    }

    if [is_remote host] {
	set decodedline_testfile [remote_download host tmpdir/dw2-decodedline.${obj}]
    } else {
	set decodedline_testfile tmpdir/dw2-decodedline.${obj}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -WL $decodedline_testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "objdump -WL (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    if { [regexp_diff objdump.out $srcdir/$subdir/objdump.WL] } then {
	fail "objdump -WL"
    } else {
	pass "objdump -WL"
    }
}

# Test objdump -W on a file containing debug_ranges information.

if { ![is_elf_format] } then {
    unsupported "objdump debug_ranges test"
} elseif { ![binutils_assemble $srcdir/$subdir/dw2-ranges.S tmpdir/dw2-ranges.${obj}] } then {
    fail "objdump debug_ranges test"
} else {
    if [is_remote host] {
	set ranges_testfile [remote_download host tmpdir/dw2-ranges.${obj}]
    } else {
	set ranges_testfile tmpdir/dw2-ranges.${obj}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --dwarf=Ranges $ranges_testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "objdump -W for debug_ranges (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    setup_xfail "msp430-*-*"
    if { [regexp_diff objdump.out $srcdir/$subdir/dw2-ranges.W] } then {
	fail "objdump -W for debug_ranges"
    } else {
	pass "objdump -W for debug_ranges"
    }
}

# Test objdump -Wi on a file containing dwarf-5 encodings information.

if { ![is_elf_format] } then {
    unsupported "objdump DW_OP_* test"
} elseif { ![binutils_assemble $srcdir/$subdir/dw5-op.S tmpdir/dw5-op.${obj}] } then {
    fail "objdump DW_OP_* test"
} else {
    if [is_remote host] {
       set op_testfile [remote_download host tmpdir/dw5-op.${obj}]
    } else {
       set op_testfile tmpdir/dw5-op.${obj}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
       fail "objdump -Wi (reason: unexpected output)"
       send_log $got
       send_log "\n"
    }

    set got [remote_exec host "tail -n +4 objdump.out" "" "/dev/null" "objdump.out"]
    set output [remote_upload host objdump.out]

    if ![file size $output] then {
       # If the output file is empty, then this target does not
       # generate dwarf2 output.  This is not a failure.
       verbose "No output from 'objdump -Wi'"
       untested "objdump -Wi"
       return
    }

    if { [regexp_diff objdump.out $srcdir/$subdir/dw5-op.W] } then {
       fail "objdump -Wi for DW_OP_*"
    } else {
       pass "objdump -Wi for DW_OP_*"
    }

    file_on_host delete $output
}

proc test_build_id_debuglink {} {
    global srcdir
    global subdir
    global env
    global STRIP
    global OBJCOPY
    global OBJDUMP
    global CFLAGS_FOR_TARGET
    global exe
    
    set test "build-id-debuglink"

    # Use a fixed build-id.
    if { [info exists CFLAGS_FOR_TARGET] } {
	set save_CFLAGS_FOR_TARGET $CFLAGS_FOR_TARGET
    }
    set CFLAGS_FOR_TARGET "-g -Wl,--build-id=0x12345678abcdef01"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog${exe} executable debug] != "" } {
	unsupported "$test (build)"
	return
    }

    if { [info exists save_CFLAGS_FOR_TARGET] } {
	set CFLAGS_FOR_TARGET $save_CFLAGS_FOR_TARGET
    } else {
	unset CFLAGS_FOR_TARGET
    }

    if { [binutils_run $STRIP "--strip-debug --remove-section=.comment tmpdir/testprog${exe} -o tmpdir/testprog.strip"] != "" } {
	fail "$test (strip debug info)"
	return
    }

    if { [binutils_run $OBJCOPY "--only-keep-debug tmpdir/testprog${exe} tmpdir/testprog.debug"] != "" } {
	fail "$test (create separate debug info file)"
	return
    }

    set got [remote_exec host "mkdir -p .build-id/12" ]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "$test (make debug directory)"
	return
    }

    set got [remote_exec host "cp tmpdir/testprog.debug .build-id/12/345678abcdef01.debug"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "$test (copy debug info into debug directory)"
	return
    }
    
    set got [remote_exec host "$OBJDUMP -Sl tmpdir/testprog.strip" "" "/dev/null" "tmpdir/testprog.strip.dump"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "$test (post strip dump)"
	return
    }

    set src2 tmpdir/testprog.strip.dump
    verbose " grep -e testprog.c ${src2}"
    set status [remote_exec build grep "-e testprog.c ${src2}"]
    set exec_output [lindex $status 1]
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
	send_log "$exec_output\n"
	verbose "$exec_output" 1
	fail "$test (grepping for source file name in disassembly output)"
    } else {
	pass "$test"
	# Cleanup...
	set got [remote_exec host "rm .build-id/12/345678abcdef01.debug"]
	set got [remote_exec host "rmdir -p .build-id/12" ]
	set got [remote_exec host "rm tmpdir/testprog.strip.dump"]
	set got [remote_exec host "rm tmpdir/testprog.debug"]
	set got [remote_exec host "rm tmpdir/testprog.strip"]
    }
}

if {[is_elf_format]} then {
    test_build_id_debuglink
}

# Test objdump -Wk on a file containing debug links.

if { [is_elf_format] } then {
    set testsrc $srcdir/$subdir/debuglink.s

    if { ![binutils_assemble $testsrc tmpdir/debuglink.${obj}] } then {
	fail "objdump -Wk (reason: could not assemble source)"
    }

    if [is_remote host] {
	set testfile [remote_download host tmpdir/debuglink.${obj}]
    } else {
	set testfile tmpdir/debuglink.${obj}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wk -WN $testfile" "" "/dev/null" "objdump.out"]

    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "objdump -Wk (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    if { [regexp_diff objdump.out $srcdir/$subdir/objdump.Wk] } then {
	fail "objdump -Wk (reason: output does not match expectations)"
    } else {
	pass "objdump -Wk"
    }
}


# Very similar to proc test_build_id_debuglink except this time we
# display some of the contents of the separate debug info file.

proc test_follow_debuglink { options dumpfile } {
    global srcdir
    global subdir
    global OBJDUMP
    global obj
    
    set test "follow-debuglink ($options)"

    if {![binutils_assemble $srcdir/$subdir/debuglink.s tmpdir/debuglink.${obj}]} then {
	fail "$test (reason: assemble first source file)"
	return
    }

    if {![binutils_assemble $srcdir/$subdir/linkdebug.s tmpdir/linkdebug.debug]} then {
	fail "$test (reason: assemble second source file)"
	return
    }

    if ![is_remote host] {
	set tempfile tmpdir/debuglink.${obj}
    } else {
	set tempfile [remote_download host tmpdir/linkdebug.debug]
	set tempfile [remote_download host tmpdir/debuglink.${obj}]
    }
    
    set got [remote_exec host "$OBJDUMP $options $tempfile" "" "/dev/null" "tmpdir/objdump.out"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "$test (reason: unexpected error output from objdump)"
	return
    }

    if { [regexp_diff tmpdir/objdump.out $srcdir/$subdir/$dumpfile] } then {
	fail $test
	verbose "output is \n[file_contents objdump.out]" 2
	return
    }

    pass $test

    # Tidy up
    set got [remote_exec host "rm tmpdir/objdump.out"]
    set got [remote_exec host "rm $tempfile"]
    set got [remote_exec host "rm tmpdir/linkdebug.debug"]
}

if {[is_elf_format]} then {
    test_follow_debuglink "--process-links --dwarf=info --dwarf=str" objdump.WK2
    test_follow_debuglink "--process-links --headers --wide" objdump.WK3
}

# Test objdump output with start and stop address limits for the specified
# dump option

proc test_objdump_limited { testfile dopt want start stop } {
    global OBJDUMP
    global OBJDUMPFLAGS

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS $dopt --start-address 0x$start --stop-address 0x$stop $testfile"]

    if [regexp $want $got] then {
	pass "objdump $dopt --start-address 0x$start --stop-address 0x$stop ($testfile)"
    } else {
	fail "objdump $dopt --start-address 0x$start --stop-address 0x$stop ($testfile)"
    }
}

# Test objdump -d --start-address M --stop-address N

proc test_objdump_disas_limited { testfile text start stop } {
    set want "$testfile:\[ 	\]*file format.*Disassembly of section $text:\n.*\[ \]*$start:.*"
    test_objdump_limited $testfile -d $want $start $stop
}

# Test objdump -s --start-address M --stop-address N

proc test_objdump_content_limited { testfile text start stop } {
    set want "$testfile:\[ 	\]*file format.*Contents of section $text:\n\[ \]*$start .*"
    test_objdump_limited $testfile -s $want $start $stop
}

# Test objdump with --start-address and --stop-address options for higher
# address ranges which may be sign-extended on targets that treat addresses
# as signed.  We only check that objdump produces some dump output at the
# specified start address as a proxy for correct enforcement of the
# start/stop limits.

if {[is_elf_format]} then {
    set sect_names [get_standard_section_names]
    if { $sect_names != "" } {
	set text [lindex $sect_names 0]
    } else {
	set text ".text"
    }
    # generate a copy of the test object with .text repositioned
    if { [binutils_run $OBJCOPY "--change-section-address $text=0x80000000 tmpdir/bintest.${obj} tmpdir/bintest_signed.${obj}"] != "" } {
	fail "Failed to reposition $text to 0x80000000 (tmpdir/bintest.${obj} -> tmpdir/bintest_signed.${obj})"
	return
    }

    if [is_remote host] {
	set testfile3 [remote_download host tmpdir/bintest_signed.${obj}]
    } else {
	set testfile3 tmpdir/bintest_signed.${obj}
    }

    test_objdump_content_limited $testfile3 $text "80000004" "80000008"
    test_objdump_disas_limited $testfile3 $text "80000004" "80000008"
    remote_file host delete $testfile3
}

# Test objdump on .NET assemblies (PE files)

proc test_objdump_dotnet_assemblies {} {
    global OBJDUMP
    global base_dir

    set test "dotnet-assemblies"

    set got [binutils_run "$base_dir/testsuite/gentestdlls" "tmpdir pei-i386 pei-x86-64"]
    set want "wrote linux-pei-x86-64.dll"
    # The test program is hardcoded to generate valid dlls on any target
    if ![regexp $want $got] then {
        fail "$test"
    }

    # First test an ordinary x86 PE format DLL.
    set test "dotnet-assemblies (ordinary x86 DLL)"
    set want "file format pei-i386"
    set got [binutils_run $OBJDUMP "-x tmpdir/simple-pei-i386.dll"]
    if ![regexp $want $got] then {
	if [regexp "file format not recognized" $got] then {
	    # If the target does not recognize vanilla x86 PE format files
	    # then it cannot be expected to recognize .NET assemblies.  But
	    # this means that these tests are unsupported, rather than failures.
	    unsupported $test
	} else {
	    fail "$test"
	}
	# In either case, if cannot pass this test, then
	# there is no point in running any further tests.
	return
    }
    pass $test

    # Next check a 32-bit .NET DLL.
    set test "dotnet-assemblies (32-bit .NET)"
    set got [binutils_run $OBJDUMP "-x tmpdir/linux-pei-i386.dll"]
    if ![regexp $want $got] then {
	fail "$test"
    } else {
	pass $test
    }

    # Next check an ordrinary x86_64 PE format DLL.
    set test "dotnet-assemblies (ordinary x86_64 DLL)"
    set want "file format pei-x86-64"
    set got [binutils_run $OBJDUMP "-x tmpdir/simple-pei-x86-64.dll"]
    if ![regexp $want $got] then {
	if [regexp "file format not recognized" $got] then {
	    # If the target does not support 64-bit PE format
	    # files, then the following tests are unsupported.
	    unsupported $test
	} else {
	    fail "$test"
	}
	return
    }
    pass $test

    # Finally check a 64-bit .NET DLL.
    set test "dotnet-assemblies (64-bit)"
    set got [binutils_run $OBJDUMP "-x tmpdir/linux-pei-x86-64.dll"]
    if ![regexp $want $got] then {
	fail "$test"
    } else {
	pass $test
    }
}

test_objdump_dotnet_assemblies

# Test objdump -S

proc test_objdump_S { } {
    global srcdir
    global subdir
    global OBJDUMP
    global OBJDUMPFLAGS
    global exe

    set test "objdump -S"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog${exe} executable debug] != "" } {
	unsupported "$test (build)"
	return
    }

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -D -S tmpdir/testprog${exe}"]

    set want "static int local = 2"

    if [regexp $want $got] then {
	pass $test
    } else {
	fail $test
    }

    set test "objdump --source-comment"

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble-all --source-comment=// tmpdir/testprog${exe}"]

    set want "//static int local = 2"

    if [regexp $want $got] then {
	pass $test
    } else {
	fail $test
    }
}

test_objdump_S

# Options which are not tested: -a -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.
