# Copyright 1997, 1999, 2004, 2005 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 that things still (sort of) work when compiled without -g.

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile nodebug

set srcfile $srcdir/$subdir/$testfile.c
set binfile $objdir/$subdir/$testfile

if [get_compiler_info ${binfile}] {
    return -1;
}

if [test_compiler_info "xlc-*"] {
    # By default, IBM'x xlc compiler doesn't add static variables into the symtab.
    # Use "-qstatsym" to do so. 
    set exec_opts additional_flags=-qstatsym
} else {
    set exec_opts ""
}

if  { [gdb_compile $srcfile $binfile executable $exec_opts] != "" } {
    untested "Couldn't compile $srcfile."
    return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

if [runto inner] then {
    
    # Expect to find global/local symbols in each of text/data/bss.
    
    # The exact format for some of this output is not necessarily
    # ideal, particularly interpreting "p top" requires a fair bit of
    # savvy about gdb's workings and the meaning of the "{}"
    # construct.  So the details maybe could be tweaked.  But the
    # basic purpose should be maintained, which is (a) users should be
    # able to interact with these variables with some care (they have
    # to know how to interpret them according to their real type,
    # since gdb doesn't know the type), but (b) users should be able
    # to detect that gdb does not know the type, rather than just
    # being told they are ints or functions returning int like old
    # versions of gdb used to do.
    
    # On alpha (and other ecoff systems) the native compilers put
    # out debugging info for non-aggregate return values of functions
    # even without -g, which should be accepted.
    # Irix5, even though it is ELF, counts as "ecoff" because it
    # encapsulates ecoff debugging info in a .mdebug section.
    # Irix6 gcc emits no debug info at all for static functions and
    # variables, so all tests involving statics fail.
    
    if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" }
    gdb_test "p top" \
	"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <top(\\(int\\)|)>"
    if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" }
    gdb_test "whatis top" \
	"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"

# APPLE LOCAL: Our gdb doesn't assume the return type of a function is int
# as many of our higher-level libraries return things other than ints and
# this assumption can mess things up.
    setup_xfail "*-apple-darwin*"

    if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix6*" }
    gdb_test "ptype top" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
    
    if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" }
    setup_xfail "mips-sgi-irix6*"
    gdb_test "p middle" \
	"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <middle(\\(int\\)|)>"
    if {![test_compiler_info "gcc-*"]} then { setup_xfail "mips-sgi-irix5*" }
    setup_xfail "mips-sgi-irix6*"
    gdb_test "whatis middle" \
	"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"

# APPLE LOCAL: Our gdb doesn't assume the return type of a function is int
# as many of our higher-level libraries return things other than ints and
# this assumption can mess things up.
    setup_xfail "*-apple-darwin*"

    setup_xfail "mips-sgi-irix6*"
    gdb_test "ptype middle" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
    
# APPLE LOCAL: Apple gdb doesn't assume that variables have one word of
# storage associated with them (that they're int's).
    setup_xfail "*-apple-darwin*"

    gdb_test "p dataglobal" "= 3"
    gdb_test "whatis dataglobal" \
	"<(data variable|variable), no debug info>|int"

# APPLE LOCAL: ptype-vs-whatis difference w/o debug info.  Jim Ingham
# explains the Apple gdb behavior like this -
#
# This falls out because when we find a data value whose type we
# don't know, we fill out a type of "<unknown type>, whereas the FSF
# gdb returns an expression object with no type information.  The
# code in ptype_command parses the expression, looks to see if the
# first element is a type, if it is it prints it, otherwise it calls
# whatis_exp - the core of whatis_command, which parses it again,
# fails again, and them prints a different error message.  Our version
# of whatis_exp and ptype_command are actually the same as the Net
# version of gdb.  It looks like we need to have the unknown type
# type to do the stuff above, and given that, I certainly don't want
# to deviate from the net version of either ptype_command or whatis_exp
# to get this one error message right.  So I am not sure I would call
# this a bug...
    setup_xfail "*-apple-darwin*"

    gdb_test "ptype dataglobal" "<(data variable|variable), no debug info>|int"
    
    # The only symbol xcoff puts out for statics is for the TOC entry.
    # Possible, but hairy, for gdb to deal.  Right now it doesn't, it
    # doesn't know the variables exist at all.
    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
# APPLE LOCAL: Apple gdb doesn't assume that variables have one word of
# storage associated with them (that they're int's).
    setup_xfail "*-apple-darwin*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }

    gdb_test "p datalocal" "= 4"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }

    gdb_test "whatis datalocal" "<(data variable|variable), no debug info>"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
# APPLE LOCAL: See the "ptype-vs-whatis difference" explanation above.
    setup_xfail "*-apple-darwin*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }

    gdb_test "ptype datalocal" "<(data variable|variable), no debug info>"
    
# APPLE LOCAL: Apple gdb doesn't assume that variables have one word of
# storage associated with them (that they're int's).
    setup_xfail "*-apple-darwin*"

    gdb_test "p bssglobal" "= 0"
    gdb_test "whatis bssglobal" "<(data variable|variable), no debug info>|int"

# APPLE LOCAL: See the "ptype-vs-whatis difference" explanation above.
    setup_xfail "*-apple-darwin*"

    gdb_test "ptype bssglobal" "<(data variable|variable), no debug info>|int"
    
    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
# APPLE LOCAL: Apple gdb doesn't assume that variables have one word of
# storage associated with them (that they're int's).
    setup_xfail "*-apple-darwin*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }

    gdb_test "p bsslocal" "= 0"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }

    gdb_test "whatis bsslocal" "<(data variable|variable), no debug info>"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"
# APPLE LOCAL: See the "ptype-vs-whatis difference" explanation above.
    setup_xfail "*-apple-darwin*"
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    } else {
        setup_xfail "hppa*-*-hpux*"
    }
    gdb_test "ptype bsslocal" "<(data variable|variable), no debug info>"
    
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*" 
    }

    gdb_test "backtrace 10" "#0.*inner.*#1.*middle.*#2.*top.*#3.*main.*" \
	"backtrace from inner in nodebug.exp"
    # Or if that doesn't work, at least hope for the external symbols
    # Commented out because if we aren't going to xfail the above test
    # ever, why bother with a weaker test?
    #gdb_test "backtrace 10" "#0.*inner.*#1.*#2.*top.*#3.*main.*" \
	#    "backtrace from inner in nodebug.exp for externals"
    
    # This test is not as obscure as it might look.  `p getenv ("TERM")'
    # is a real-world example, at least on many systems.
    if { ! [test_compiler_info "gcc-*"]} {
        setup_xfail "mips-sgi-irix6*" 
    }
    if [target_info exists gdb,cannot_call_functions] {
	setup_xfail "*-*-*" 2416
	fail "p/c array_index(\"abcdef\",2)"
    } else {
	#
	# On HP-UX, a support function (__d_plt_call) necessary to
	# implement an inferior call is normally only available when
	# the inferior was compiled with -g.  Thus, we expect this
	# testpoint to fail on HP-UX.
	if { [istarget "hppa*-hpux*"] } {
	    send_gdb "p/c array_index(\"abcdef\",2)\n"
	    gdb_expect {
		-re ".*Suggest linking executable with -g.*$gdb_prompt $" { pass "p/c array_index(\"abcdef\",2)" }
		-re ".*Cannot find __wdb_call_dummy in.*end.o.*" { pass "p/c array_index(\"abcdef\",2)" }
		-re ".*99 'c'.*" { pass "p/c array_index(\"abcdef\",2)" }
		timeout { fail "(timeout) p/c array_index" }
	    }
	} else {
	    # We need to up this because this can be really slow on some boards.
	    # (malloc() is called as part of the test).
	    set timeout 60;    
# APPLE LOCAL: Our gdb requires you to declare the ret type.
	    gdb_test {p/c (int) array_index("abcdef",2)} " = 99 'c'" "p/c (int) array_index(\"abcdef\",2)"
	}
    }
    
    # Now, try that we can give names of file-local symbols which happen
    # to be unique, and have it still work
    if [test_compiler_info "gcc-*"] {
        setup_xfail "mips-sgi-irix6*"
    }
    if [runto middle] then {
	gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \
	    "backtrace from middle in nodebug.exp"
    }
}
