# Expect script for various DWARF tests.
#   Copyright 2006, 2007  Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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.
#

#
# Written by H.J. Lu (hongjiu.lu@intel.com)
#

# Exclude non-ELF targets.

if ![is_elf_format] {
    return
}

# The following tests require running the executable generated by ld.
if ![isnative] {
    return
}

# Check if compiler works
if { [which $CC] == 0 } {
    return
}

# Skip if -feliminate-dwarf2-dups isn't supported.
if ![ld_compile "$CC -g -feliminate-dwarf2-dups" $srcdir/$subdir/dummy.c tmpdir/dummy.o] {
    return
}

set build_tests {
  {"Build libdwarf1.so"
   "-s -shared" "-fPIC -g -feliminate-dwarf2-dups"
   {dwarf1.c} {} "libdwarf1.so"}
}

set run_tests {
    {"Run with libdwarf1.so first"
     "tmpdir/libdwarf1.so" ""
     {dwarf1main.c} "dwarf1a" "dwarf1.out"
     "-g -feliminate-dwarf2-dups"}
    {"Run with libdwarf1.so last"
     "tmpdir/dwarf1main.o tmpdir/libdwarf1.so" ""
     {dummy.c} "dwarf1b" "dwarf1.out"
     "-g -feliminate-dwarf2-dups"}
}

run_cc_link_tests $build_tests
run_ld_link_exec_tests [] $run_tests

proc strip_test {} {
    global ld
    global strip
    global NM

    set test "libdwarf1c.so"
    set test_name "Strip -s $test"
    set prog $strip

    if ![ld_simple_link $ld tmpdir/$test "-shared tmpdir/dwarf1.o"] {
	unresolved "$test_name"
	return
    }

    send_log "$NM -D tmpdir/$test > tmpdir/$test.exp\n"
    catch "exec $NM -D tmpdir/$test > tmpdir/$test.exp" got
    if ![string match "" $got] then {
	send_log "$got\n"
	unresolved "$test_name"
	return
    }

    send_log "$prog -s tmpdir/$test\n"
    catch "exec $prog -s tmpdir/$test" got
    if ![string match "" $got] then {
	send_log "$got\n"
	fail "$test_name"
	return
    }

    send_log "$NM -D tmpdir/$test > tmpdir/$test.out\n"
    catch "exec $NM -D tmpdir/$test > tmpdir/$test.out" got
    if ![string match "" $got] then {
	send_log "$got\n"
	unresolved "$test_name"
 	return
    }

    if { [catch {exec cmp tmpdir/$test.exp tmpdir/$test.out}] } then {
	send_log "tmpdir/$test.exp tmpdir/$test.out differ.\n"
 	fail "$test_name"
 	return
    }

    pass "$test_name"
}

strip_test
