# Copyright 2002, 2004
# 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-gdb@prep.ai.mit.edu

# This file was written by Jason Molenda (jmolenda@apple.com)

if $tracelevel then {
        strace $tracelevel
}


# Test an executable with a weak library.  A "weak library" is unlike any
# ELF thing; if all externally visible functions in a shared library are
# marked as "weak" in their prototypes in a C file, then when that executable
# is run, the shared library may be absent and the program will still work.
# (as oppposed to the normal case, where you'd get an unresolved shared library
# reference from the dynamic linker run-time).  All the addresses of the
# functions from the shared library will have a value of 0 in this case.

set timeout 30

set prms_id 0
set bug_id 0

set testfile "weak-prog"
set binfile ${objdir}/${subdir}/${testfile}
set srcfile ${srcdir}/${subdir}/${testfile}.c

set libfile "libweak"
set libbinfile ${objdir}/${subdir}/${libfile}.dylib
set libsrcfile ${srcdir}/${subdir}/${libfile}.c

set additional_flags "additional_flags=-dynamiclib"
if  { [gdb_compile "${libsrcfile}" "${libbinfile}" executable [list debug $additional_flags]] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

global env

set ::env(MACOSX_DEPLOYMENT_TARGET) "10.2"
set additional_flags "additional_flags=-L${objdir}/${subdir} -weak-lweak"
if  { [gdb_compile "${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd "${binfile}"

gdb_test "future-break foo" "Breakpoint 1 at $hex: file .*libweak.c.*, line $decimal." "Set breakpoint on foo"

gdb_test "run" \
"Starting program: $binfile\[ \r\]*
Reading symbols for shared libraries \[+\\.]+ done\[ \r\]*\(Breakpoint 1 at $hex: file .*libweak.c.*, line $decimal.\[ \r\]*\)*
hi, in main\[ \r\]*
\[ \r\]*
Breakpoint 1, foo.*libweak.c.*\[ \r\]*" \
"continue to weak library bp"

gdb_test "info sharedlibrary" "$decimal libweak.dylib *- $hex *dyld Y Y $libbinfile at $hex \\(offset $hex\\).*"
gdb_exit


# Now move the library aside, try again

remote_exec build "mv ${libbinfile} ${libbinfile}.hide"

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "file ${binfile}" "Reading symbols for shared libraries \\.+ done\r\nReading symbols from ${binfile}.*done.\[\r\n\]+" "load with missing weak lib, hope for no warnings"

gdb_test "info sharedlibrary" ".*$decimal libweak.dylib *- - *w-init Y ! ${libbinfile}.*" "check sharedlibrary entry for missing weak library pre-run"

gdb_test "future-break foo" "Function \"foo\" not defined..*Breakpoint 1 .foo. pending.*" "Set breakpoint on foo (2), not yet defined"

send_gdb "run\n"
gdb_expect {
 -re "Starting program: $binfile \[\r\n\]+\[\r\n\]+(Reading symbols for shared libraries (\\.)+ done\[\r\n\]+)+hi, in main\[\r\n\]+finished in main\[\r\n\]+Program exited with code $decimal\\.\[\r\n\]+$gdb_prompt $" {
    pass "test running weak program"
 }
 -re ".*$gdb_prompt $" {
    fail "test running weak program"
 }
 timeout {
    fail "(timeout) test running weak program"
 }
}

gdb_test "info sharedlibrary" ".*$decimal libweak.dylib *- - *c-w-init Y ! ${libbinfile}.*" "check sharedlibrary entry for missing weak library post-run"

gdb_exit
return 0
