# Expect script for various DWARF tests.
#   Copyright 2006 Free Software Foundation, Inc.
#
# This file 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., 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
