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

# Test stepping into and continuing on from a function in
# a shared library (PR gdb/1555, was PR shlib/1280, shlib/1237).
# Tested on ppc-yellowdog-linux (Yellow Dog Linux 3.0 3.2.2-2a)

if $tracelevel then {
    strace $tracelevel
}

set testfile gdb1555-main
set libfile gdb1555
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

remote_exec build "rm -f ${binfile}"

# get the value of gcc_compiled
if [get_compiler_info ${binfile}] {
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}.o" object {debug}] != "" } {
    return -1
}

# Build the shared libraries this test case needs.
#

if {$gcc_compiled == 0} {
    if [istarget "hppa*-hp-hpux*"] then {
        set additional_flags "additional_flags=+z"
    } elseif { [istarget "mips-sgi-irix*"] } {
        # Disable SGI compiler's implicit -Dsgi
        set additional_flags "additional_flags=-Usgi"
    } else {
        # don't know what the compiler is...
        set additional_flags ""
    }
} else {
    if { ([istarget "powerpc*-*-aix*"]
    || [istarget "rs6000*-*-aix*"]) } {
        set additional_flags ""
    } else {
        set additional_flags "additional_flags=-fpic"
    }
}

if { [istarget "*-*-*darwin*"] } {
    set additional_flags "additional_flags=-dynamiclib"
} else {
    set additional_flags "additional_flags=-shared"
}
if {[gdb_compile "${srcdir}/${subdir}/${libfile}.c" "${objdir}/${subdir}/${libfile}.so" executable [list debug $additional_flags "incdir=${objdir}"]] != ""} {
    return -1
}

if { ($gcc_compiled 
&&  ([istarget "powerpc*-*-aix*"]
|| [istarget "rs6000*-*-aix*"] )) } {
    set additional_flags "additional_flags=-L${objdir}/${subdir}"
} elseif { [istarget "mips-sgi-irix*"] } {
    set additional_flags "additional_flags=-rpath ${objdir}/${subdir}"
} else {
    set additional_flags ""
}

if {[gdb_compile "${objdir}/${subdir}/${testfile}.o ${objdir}/${subdir}/${libfile}.so" "${binfile}" executable [list debug $additional_flags]] != ""} {
    return -1
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

# PR/1555 (was shlib 1280)
set name "Step into shared lib function"
gdb_test_multiple "s" $name \
{
    -re "hithere2 \\(\\) at.*${libfile}.c:25\r\n25.*a = 21;.*$gdb_prompt $"  {
	pass $name
    }
    -re "0x\[0-9a-f\]+ in .* \\(\\) from /lib/ld.so.1.*$gdb_prompt $" { 
	kfail "gdb/1555" $name 
    }
}

# PR/1555 (was shlib 1237)
set name "Next while in a shared lib function"
gdb_test_multiple "n" $name \
{
    -re "26.*return a;.*$gdb_prompt $" {
	pass $name
    }
    -re "Single stepping until exit from function .*, \r\nwhich has no line number information.\r\n\r\nProgram exited normally.*$gdb_prompt $" { 
	kfail "gdb/1555" $name 
    }
}

