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

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

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