# Copyright 1997-2017 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 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, see <http://www.gnu.org/licenses/>.

# Test that things still (sort of) work when compiled without -g.


standard_testfile .c

if [get_compiler_info] {
    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 $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.

clean_restart $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.

    gdb_test "p top" \
	"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?top(\\(int\\)|)>"
    gdb_test "whatis top" \
	"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
    gdb_test "ptype top" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
    
    gdb_test "p middle" \
	"\{(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))\} \[0-9a-fx]* <\\.?middle(\\(int\\)|)>"
    gdb_test "whatis middle" \
	"(<(text variable|function), no debug info>|short \\(int\\)|short \\(\\))"
    gdb_test "ptype middle" "(short|int) \\((|void|int|<non-float parameter>|<non-float parameter>, <non-float parameter>)\\)"
    
    gdb_test "p dataglobal" "= 3"
    gdb_test "whatis dataglobal" \
	"<(data variable|variable), no debug info>|int"
    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*"

    gdb_test "p datalocal" "= 4"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"

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

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"

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

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"

    gdb_test "p bsslocal" "= 0"

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"

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

    setup_xfail "rs6000*-*-aix*"
    setup_xfail "powerpc*-*-aix*"

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

    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 [target_info exists gdb,cannot_call_functions] {
	unsupported "p/c array_index(\"abcdef\",2)"
    } else {
	# We need to up this because this can be really slow on some boards.
	# (malloc() is called as part of the test).
	set prev_timeout $timeout
	set timeout 60
	gdb_test {p/c array_index("abcdef",2)} " = 99 'c'"
	set timeout $prev_timeout
    }
    
    # Now, try that we can give names of file-local symbols which happen
    # to be unique, and have it still work
    if [runto middle] then {
	gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \
	    "backtrace from middle in nodebug.exp"
    }
}
