#   Copyright (C) 1993-2026 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}
}

# AIX gas doesn't add local symbols to the symbol table.
# TI C30 and C54x ld emits various "address .. of tmpdir/dump section `...' is
# not within region `...'" errors, which look bogus for relocatable linking.
# alpha-vms doesn't support relocatable linking.
# i?86-msdos ld generates an executable despite being passed -r.
# Don't chance other than our own ld improperly handling -r.
if { ![istarget "*-*-aix*"]
     && ![istarget "*c30-*-*"]
     && ![istarget "*c54x-*-*"]
     && ![istarget "alpha-*-*vms*"]
     && ![istarget "i?86-*-msdos"]
     && [file normalize "$LD"] == [file normalize "$objdir/../ld/ld-new"]} then {
    run_dump_test multi-1
    run_dump_test multi-2
    run_dump_test multi-3
}

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

proc test_objdump_d_show_all_symbols { testfile dumpfile } {
    global OBJDUMP
    global OBJDUMPFLAGS

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

    set want "${dumpfile}.*:.*00+0 <text_symbol>"
    if ![regexp $want $got] then {
	fail "objdump -d --show-all-symbols $testfile: Missing 'text_symbol'"
	return
    }

    set want "${dumpfile}.*:.*00+0 <static_text_symbol>"
    if ![regexp $want $got] then {
	fail "objdump -d --show-all-symbols $testfile: Missing 'static_text_symbol'"
	return
    }

    pass "objdump -d --show-all-symbols $testfile"
}

# The AIX and ECOFF assemblers default to makeing symbols local, not global.
# So they do not show up in this test.
setup_xfail "*-*-*aix*"
setup_xfail "*-*-*ecoff"
test_objdump_d_show_all_symbols $testfile $testfile

# 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" "tmpdir/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 tmpdir/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" "tmpdir/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 tmpdir/objdump.out $srcdir/$subdir/objdump.W] } then {
	fail "objdump -W"
    } else {
	pass "objdump -W"
    }

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

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

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

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

# 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
    } elseif { [istarget "kvx*-*-*"] } {
        set decodedline_testsrc $srcdir/$subdir/dw2-decodedline-2.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" "tmpdir/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 tmpdir/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" "tmpdir/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 tmpdir/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" "tmpdir/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 {sed -e 1,3d tmpdir/objdump.out} {} /dev/null tmpdir/objdump.tail]
    set output [remote_upload host tmpdir/objdump.tail]

    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 tmpdir/objdump.tail $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 {option} {
    global srcdir
    global subdir
    global env
    global STRIP
    global OBJCOPY
    global OBJDUMP
    global CFLAGS_FOR_TARGET
    global exe
    
    set test "build-id-debuglink ($option)"

    # 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,--compress-debug-sections=$option"

    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 none
    test_build_id_debuglink zlib
}

# 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" "tmpdir/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 tmpdir/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 tmpdir/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"

    # If gentestdlls isn't available, skip instead of crashing below.
    if ![file exists $base_dir/testsuite/gentestdlls] {
	untested $test
	return
    }

    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

# Test objdump --map-global-vars on file containing dwarf-2 encoding information.

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

    set test "objdump --map-global-vars"

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

    if [is_remote host] {
	set testfile [remote_download host tmpdir/objdump-map-global-vars${exe}]
	set patternfile [remote_download host tmpdir/objdump.map-global-vars]
    } else {
	set testfile tmpdir/objdump-map-global-vars${exe}
	set patternfile $srcdir/$subdir/objdump.map-global-vars
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --dwarf=info $testfile"]
    if { [regexp -line {^ *Version: *([0-9]+)} $got -> dwarf_version] } then {
	if {$dwarf_version < 2} then {
	    unsupported "$test (DWARF2 at least is required)"
	    return
	}
    }

    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS --map-global-vars $testfile" "" "/dev/null" "tmpdir/objdump.out"]
    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
	fail "$test (reason: unexpected output)"
	send_log $got
	send_log "\n"
    }

    # Read and split patterns by double newline using regsub and split
    set pattern_file [open $patternfile r]
    set pattern_data [read $pattern_file]
    close $pattern_file

    set marked_pattern_blocks [regsub -all {\n\n} $pattern_data ";"]
    set pattern_blocks [split $marked_pattern_blocks ";"]

    # Read and split output into blocks by double newline using regsub and split
    set output_file [open "tmpdir/objdump.out" r]
    set output_data [read $output_file]
    close $output_file

    set marked_output_blocks [regsub -all {\n\n} $output_data ";"]
    set output_blocks [split $marked_output_blocks ";"]

    # Match each output block against all patterns, order independent
    foreach oblock $output_blocks {
	if {$oblock eq ""} { continue }
	set matched 0
	foreach pblock $pattern_blocks {
	    if {[regexp $pblock $oblock]} {
		set matched 1
	    }
	}
	if {!$matched} {
	    fail "$test: did not find a match for: $oblock"
	    return
	}
    }
    pass "objdump --map-global-vars"
}

test_objdump_map_global_vars

# Test objdump --private
proc test_objdump_P {} {
    global srcdir
    global subdir
    global OBJDUMP
    global OBJDUMPFLAGS
    global obj
    
    set test "objdump -P"
    
    if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.${obj}]} then {
	unsupported "$test (build)"
	return
    }

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

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -P header $testfile"]

    # FIXME: We should probably test the output further than this...
    set want "Machine Num"
    
    if [regexp $want $got] then {
	pass "$test (dump headers)"
    } else {
	fail "$test (dump headers)"
    }

    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --private=sections $testfile"]

    # FIXME: We should probably test the output further than this...
    set want "EXECUTE,READ"

    if [regexp $want $got] then {
	pass "$test (dump sections)"
    } else {
	fail "$test (dump sections)"
    }

    # remote_file host delete $testfile
}

# Test objdump --private of a PE format file.
if { [istarget "*-*-pe*"]
     || [istarget "*-*-cygwin*"]
     || [istarget "*-*-mingw*"]
} then {
    test_objdump_P
}

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