#   Copyright (C) 1994, 95, 96, 97, 1998 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

# Written by Ian Lance Taylor <ian@cygnus.com>

if ![is_remote host] {
    if {[which $OBJCOPY] == 0} then {
        perror "$OBJCOPY does not exist"
        return
    }
}

send_user "Version [binutil_version $OBJCOPY]"

if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
    perror "unresolved 1"
    unresolved "objcopy (simple copy)"
    return
}

if ![is_remote host] {
    set tempfile tmpdir/bintest.o;
    set copyfile tmpdir/copy;
} else {
    set tempfile [remote_download host tmpdir/bintest.o]
    set copyfile copy
}

# Test that objcopy does not modify a file when copying it.

set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]

if ![string match "" $got] then {
    fail "objcopy (simple copy)"
} else {
    send_log "cmp $tempfile ${copyfile}.o\n"
    verbose "cmp $tempfile ${copyfile}.o"
    if [is_remote host] {
	set src1 tmpdir/bintest.o
	set src2 tmpdir/copy.o
	remote_upload host $tempfile $src1;
	remote_upload host ${copyfile}.o $src2;
    } else {
	set src1 ${tempfile}
	set src2 ${copyfile}.o
    }
    set status [remote_exec build cmp "${src1} ${src2}"];
    set exec_output [lindex $status 1];
    set exec_output [prune_warnings $exec_output]

    # On some systems the result of objcopy will not be identical.
    # Usually this is just because gas isn't using bfd to write the files
    # in the first place, and may order things a little differently.
    # Those systems should use setup_xfail here.

    setup_xfail "sh-*-coff" "sh-*-hms" 
    setup_xfail "m68*-*-hpux*" "m68*-*-sunos*" "m68*-*-coff" "m68*-*-vxworks*"
    setup_xfail "m68*-ericsson-ose" "m68k*-motorola-sysv*"
    setup_xfail "i*86-*-linuxaout*" "i*86-*-aout*"
    setup_xfail "i*86-*-sysv3" "i*86-*-isc*" "i*86-*-sco*" "i*86-*-coff"
    setup_xfail "i*86-*-aix*" "i*86-*-go32*" "i*86-*-msdos*"
    setup_xfail "a29k-*-udi" "a29k-*-coff" "a29k-*-vxworks*"
    setup_xfail "i960-*-coff"
    setup_xfail "h8300-*-hms" "h8300-*-coff"
    setup_xfail "h8500-*-hms" "h8500-*-coff"
    setup_xfail "hppa*-*-*"
    clear_xfail "hppa*-*-*elf*"
    setup_xfail "m88*-*-coff" "m88*-motorola-sysv*"
    setup_xfail "z8*-*-coff"

    if [string match "" $exec_output] then {
	pass "objcopy (simple copy)"
    } else {
	send_log "$exec_output\n"
	verbose "$exec_output" 1

	# On OSF/1, this succeeds with gas and fails with /bin/as.
	setup_xfail "alpha*-*-osf*"

	# This fails for COFF i960-vxworks targets.
	setup_xfail "i960-*-vxworks*"

	fail "objcopy (simple copy)"
    }
}

# Test generating S records.

# We make the srec filename 8.3 compatible. Note that the header string
# matched against depends on the name of the file. Ugh.

if [is_remote host] {
    set srecfile copy.sre
    set header_string S00B0000636F70792E737265C1
} else {
    set srecfile ${copyfile}.srec
    set header_string S0130000746D706469722F636F70792E7372656397
}

set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]

if ![string match "" $got] then {
    fail "objcopy -O srec"
} else {
    if [is_remote host] {
	remote_upload host ${srecfile} tmpdir/copy.srec;
	set srecfile tmpdir/copy.srec;
    }
    set file [open ${srecfile} r]

    # The first S record is fixed by the file name we are using.
    gets $file line
    send_log "$line\n"
    verbose $line
    if ![regexp "$header_string.*" $line] {
	send_log "bad header\n"
	fail "objcopy -O srec"
    } else {
	while {[gets $file line] != -1 \
	       && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
	    send_log "$line\n"
	    verbose $line
	    set line "**EOF**"
	}
	send_log "$line\n"
	verbose $line
	if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
	    send_log "bad trailer\n"
	    fail "objcopy -O srec"
	} else {
	    if {[gets $file line] != -1} then {
		send_log "garbage at end\n"
		send_log "$line\n"
		verbose $line
		fail "objcopy -O srec"
	    } else {
		set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
		if ![regexp "file format srec" $got] then {
		    send_log "objdump failed\n"
		    fail "objcopy -O srec"
		} else {
		    pass "objcopy -O srec"
		}
	    }
	}
    }

    close $file
}

# Test setting and adjusting the start address.  We only test this
# while generating S records, because we may not be able to set the
# start address for other object file formats, and the S record case
# is the only useful one anyhow.

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
    perror "objdump can not recognize bintest.o"
    set origstart ""
} else {
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --set-start 0x7654"]
    if ![string match "" $got] then {
	fail "objcopy --set-start"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
	    fail "objcopy --set-start"
	} else {
	    if {$srecstart != 0x7654} then {
		send_log "$srecstart != 0x7654\n"
		fail "objcopy --set-start"
	    } else {
		pass "objcopy --set-start"
	    }
	}
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --adjust-start 0x123"]
    if ![string match "" $got] then {
	fail "objcopy --adjust-start"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
	    fail "objcopy --adjust-start"
	} else {
	    if {$srecstart != $origstart + 0x123} then {
		send_log "$srecstart != $origstart + 0x123\n"
		fail "objcopy --adjust-start"
	    } else {
		pass "objcopy --adjust-start"
	    }
	}
    }
}

# Test adjusting the overall VMA, and adjusting the VMA of a
# particular section.  We again only test this when generating S
# records.

set low ""
set lowname ""

set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]

set headers_regexp "\[ 	0-9\]+(\[^ 	\]+)\[ 	\]*(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+2\[*\]\[*\]\[0-9\]+(.*)"

set got $headers
while {[regexp $headers_regexp $got all name size vma rest]} {
    set vma 0x$vma
    set size 0x$size
    if {$size != 0} {
	if {$low == "" || $vma < $low} {
            set low $vma
	    set lowname $name
	}
    }
    set got $rest
}

if {$low == "" || $origstart == ""} then {
    perror "objdump can not recognize bintest.o"
} else {
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --adjust-vma 0x123"]
    if ![string match "" $got] then {
        fail "objcopy --adjust-vma"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
	set want "file format srec.*start address\[ 	\]*(\[0-9a-fA-FxX\]+).*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all start vma] then {
	    fail "objcopy --adjust-vma"
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 0x123} then {
		send_log "$vma != $low + 0x123\n"
		fail "objcopy --adjust-vma"
	    } else {
		if {$start != $origstart + 0x123} then {
		    send_log "$start != $origstart + 0x123\n"
		    fail "objcopy --adjust-vma"
		} else {
		    pass "objcopy --adjust-vma"
		}
	    }
	}
    }

    set arg ""
    set got $headers
    while {[regexp $headers_regexp $got all name size vma rest]} {
	set vma 0x$vma
	if {$vma == $low} then {
	    set arg "$arg --adjust-section-vma $name+4"
	}
	set got $rest
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec $arg"]
    if ![string match "" $got] then {
	fail "objcopy --adjust-section-vma +"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all vma] then {
	    fail "objcopy --adjust-section-vma +"
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 4} then {
		send_log "$vma != $low + 4\n"
		fail "objcopy --adjust-section-vma +"
	    } else {
		pass "objcopy --adjust-section-vma +"
	    }
	}
    }

    regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec $argeq"]
    if ![string match "" $got] then {
	fail "objcopy --adjust-section-vma ="
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all vma] then {
	    fail "objcopy --adjust-section-vma ="
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 4} then {
		send_log "$vma != $low + 4\n"
		fail "objcopy --adjust-section-vma ="
	    } else {
		pass "objcopy --adjust-section-vma ="
	    }
	}
    }
}

# Test stripping an object.

proc strip_test { } {
    global CC
    global STRIP
    global STRIPFLAGS
    global NM
    global NMFLAGS
    global srcdir
    global subdir

    set test "strip"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host tmpdir/testprog.o];
    } else {
	set objfile tmpdir/testprog.o
    }

    set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
    if ![string match "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
    if ![string match "*: no symbols*" $exec_output] {
	fail $test
	return
    }

    pass $test
}

strip_test

# Test stripping an object file with saving a symbol

proc strip_test_with_saving_a_symbol { } {
    global CC
    global STRIP
    global STRIPFLAGS
    global NM
    global NMFLAGS
    global srcdir
    global subdir

    set test "strip with saving a symbol"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host tmpdir/testprog.o];
    } else {
	set objfile tmpdir/testprog.o
    }

    set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
    if ![string match "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
    if {![regexp {^([0-9a-fA-F]+)?[ ]+T main} $exec_output] \
         && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
	fail $test
	return
    }

    pass $test
}

strip_test_with_saving_a_symbol

# Build a final executable.

proc copy_setup { } {
    global srcdir
    global subdir
    
    set res [build_wrapper testglue.o];
    set flags { debug };
    
    if { $res != "" } {
	lappend flags "additional_flags=[lindex $res 1]";
	set add_libs "testglue.o";
    } else {
	set add_libs "";
    }

    if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/testprog executable $flags]  != "" } {
	return 2
    }

    set result [remote_load target tmpdir/testprog];
    set status [lindex $result 0];

    if { $status != "pass"  } {
	perror "unresolved setup, status = $status"
	return 3
    }

    return 0
}

# Test copying an executable.

proc copy_executable { prog flags test1 test2 } {

    if [is_remote host] {
	set testfile [remote_download host tmpdir/testprog];
	set testcopy copyprog
    } else {
	set testfile tmpdir/testprog
	set testcopy tmpdir/copyprog
    }
    remote_file host delete $testcopy;

    set exec_output [binutils_run $prog "$flags $testfile $testcopy"]

    if ![string match "" $exec_output] {
	fail $test1
	fail $test2
	return
    }

    if [is_remote host] {
	remote_upload host $testcopy tmpdir/copyprog
    }

    set status [remote_exec build "cmp" "tmpdir/testprog tmpdir/copyprog"]
    set exec_output [lindex $status 1];

    if [string match "" $exec_output] then {
	pass $test1
    } else {
	send_log "$exec_output\n"
	verbose "$exec_output"

	# This will fail for many reasons.  For example, it will most
	# likely fail if a non-GNU linker is used.  Therefore, we do
	# not insist that it pass.  If you are using an assembler and
	# linker based on the same BFD as objcopy, it is worth
	# investigating to see why this failure occurs.  If we are
	# cross compiling, we assume that a GNU linker is being used,
	# and expect it to succeed.
	if {[isnative]} then {
	    setup_xfail "*-*-*"
	}

	# This also fails for mips*-*-elf targets.  See elf32-mips.c
	# mips_elf_sym_is_global.
	setup_xfail "mips*-*-elf"

	setup_xfail "arm*-*-coff"
	setup_xfail "arm*-*-pe"
	setup_xfail "thumb*-*-coff"
	setup_xfail "thumb*-*-pe"
    
	fail $test1
    }

    set output [remote_load target tmpdir/copyprog]
    set status [lindex $output 0];
    if { $status != "pass" } {
	fail $test2
    } else {
	pass $test2
    }
}

# Test stripping an executable

proc strip_executable { prog flags test } {
    global NM
    global NMFLAGS

    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog];
    } else {
	set copyfile tmpdir/striprog
    }

    set exec_output [binutils_run $prog "$flags ${copyfile}"]
    if ![string match "" $exec_output] {
	fail $test
	return
    }

    if [is_remote host] {
	remote_upload host ${copyfile} tmpdir/striprog;
    }

    set result [remote_load target tmpdir/striprog]
    set status [lindex $result 0];
    if { $status != "pass" } {
	fail $test
        return
    }

    set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
    if ![string match "*: no symbols*" $exec_output] {
	fail $test
	return
    }
    pass $test
}

# Test stripping an executable with saving a symbol

proc strip_executable_with_saving_a_symbol { prog flags test } {
    global NM
    global NMFLAGS

    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog];
    } else {
	set copyfile tmpdir/striprog
    }

    set exec_output [binutils_run $prog "$flags ${copyfile}"]
    if ![string match "" $exec_output] {
	fail $test
	return
    }

    if [is_remote host] {
	remote_upload host ${copyfile} tmpdir/striprog;
    }

    set result [remote_load target tmpdir/striprog]
    set status [lindex $result 0];
    if { $status != "pass" } {
	fail $test
        return
    }

    set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
    if {![regexp {^[0-9a-fA-F]+ T main} $exec_output] \
         && ![regexp {^[0-9a-fA-F]+ T _main} $exec_output]} {
	fail $test
	return
    }
    pass $test
}

set test1 "simple objcopy of executable"
set test2 "run objcopy of executable"
set test3 "run stripped executable"
set test4 "run stripped executable with saving a symbol"

switch [copy_setup] {
    "1" {
	# do nothing
    }
    "2" {
	untested $test1
	untested $test2
	untested $test3
	untested $test4
    }
    "3" {
	unresolved $test1
	unresolved $test2
	unresolved $test3
	unresolved $test4
    }
    "0" {
	copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
	strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
	strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
    }
}
