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

# Run to FUNC and unload symbols from system shared libraries, to
# avoid conflicts with the minsyms in the program.  E.g.,
# intl/plural-exp.h has 'enum expression_operator {..., mult, ...}'.

proc nodebug_runto {func} {
    with_test_prefix $func {
	if ![runto $func] {
	    return false
	}
	gdb_test_no_output "nosharedlibrary" \
	    "unload symbols from system libraries"
	return true
    }
}

# Test calling no-debug functions involving argument types that may
# require coercion/promotion, both prototyped and unprototyped, both
# return-type-cast style, and function-pointer-cast styles.
proc test_call_promotion {} {
    if [target_info exists gdb,cannot_call_functions] {
	return
    }

    # Call prototyped function with float parameters via both
    # return-type cast and function-pointer cast.  This checks that
    # GDB doesn't do float->double coercion.
    gdb_test "p (float) multf(2.0f, 3.0f)" " = 6"
    gdb_test "p ((float (*) (float, float)) multf)(2, 3)" " = 6"
    gdb_test "p ((float (*) (float, float)) multf)(2.0f, 3.0f)" " = 6"

    # Call unprototyped function with float parameters via
    # function-pointer cast, only.  return-type cast assumes
    # protototyped.  Check that GDB does float->double coercion.
    gdb_test "p ((float (*) ()) multf_noproto)(2.0f, 3.0f)" " = 6"
    gdb_test "p ((float (*) ()) multf_noproto)(2.0, 3.0)" " = 6"

    # Same, but for double.
    gdb_test "p (double) mult (2.0, 3.0)" " = 6"
    gdb_test "p ((double (*) (double, double)) mult)(2.0f, 3.0f)" " = 6"
    gdb_test "p ((double (*) (double, double)) mult)(2, 3)" " = 6"
    gdb_test "p ((double (*) ()) mult_noproto)(2.0f, 3.0f)" " = 6"
    gdb_test "p ((double (*) ()) mult_noproto)(2.0, 3.0)" " = 6"

    # Check that GDB promotes char->int correctly.
    gdb_test "p /d (uint8) add8((uint8) 2, (uint8) 3)" " = 5"
    gdb_test "p /d ((uint8 (*) (uint8, uint8)) add8)((uint8) 2, (uint8) 3)" " = 5"
    gdb_test "p /d ((uint8 (*) ()) add8_noproto)((uint8) 2, (uint8) 3)" " = 5"
}

if [nodebug_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.

    with_test_prefix "func" {
	# Most languages default to printing like C.
	set c_print_re " = \\{<text variable, no debug info>\\} $hex <top>"
	set c_whatis_re " = <text variable, no debug info>"
	set c_ptype_re "= <unknown return type> \\(\\)"

	set cxx_ptype_re "= <unknown return type> \\(void\\)"

	set ada_ptype_re " = function return <unknown return type>"

	set m2_print_re " = \\{PROCEDURE <text variable, no debug info> \\(\\) : <unknown return type>\\} $hex <top>"
	set m2_whatis_re "PROCEDURE <text variable, no debug info> \\(\\) : <unknown return type>"
	set m2_ptype_re $m2_whatis_re

	# Rust can't access minsyms?
	set rust_nosym "No symbol 'top' in current context"

	set pascal_ptype_re "type = procedure  : <unknown return type>"

	#LANG		#PRINT		#WHATIS		#PTYPE
	foreach lang_line {
	    {"ada"		$c_print_re	$c_whatis_re	$ada_ptype_re}
	    {"asm"		$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"c"		$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"c++"		$c_print_re	$c_whatis_re	$cxx_ptype_re}
	    {"d"		$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"fortran"	$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"go"		$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"minimal"	$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"modula-2"	$m2_print_re	$m2_whatis_re	$m2_ptype_re}
	    {"objective-c"	$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"opencl"	$c_print_re	$c_whatis_re	$c_ptype_re}
	    {"pascal"	$c_print_re	$c_whatis_re	$pascal_ptype_re}
	    {"rust"		$rust_nosym	$rust_nosym	$rust_nosym}
	} {
	    set lang [lindex $lang_line 0]
	    set print_re [lindex $lang_line 1]
	    set whatis_re [lindex $lang_line 2]
	    set ptype_re [lindex $lang_line 3]

	    set print_re [subst "$print_re"]
	    set whatis_re [subst "$whatis_re"]
	    set ptype_re [subst "$ptype_re"]

	    with_test_prefix "$lang" {
		gdb_test_no_output "set language $lang"
		gdb_test "p top" $print_re
		gdb_test "whatis top" $whatis_re
		gdb_test "ptype top" $ptype_re
	    }
	}
    }

    gdb_test_no_output "set language auto"

    # We can't rely on uintXX_t being available/known to GDB because
    # we may or may not have debug info for those (depending on
    # whether we have debug info for the C runtime, for example).
    gdb_test_no_output "macro define uint8 unsigned char"
    gdb_test_no_output "macro define uint32 unsigned int"
    gdb_test_no_output "macro define uint64 unsigned long long"

    set data_var_type "<data variable, no debug info>"
    set unk_type_re "has unknown type.*to its declared type"
    set ptr_math_re "Cannot perform pointer math on incomplete type \"$data_var_type\", try casting to a known type, or void \\*\\."
    set not_mem_re "Attempt to take address of value not located in memory\\."

    set dataglobal_unk_re "dataglobal.*$unk_type_re"

	 #exp				#fmt #print						#ptype/whatis
    foreach line {
	{"dataglobal"			""   $dataglobal_unk_re					" = $data_var_type"}
	{"(int) dataglobal"		""   "= 3"						" = int"}
	{"sizeof(dataglobal)"		""   $dataglobal_unk_re					$dataglobal_unk_re}
	{"sizeof(dataglobal + 1)"	""   $dataglobal_unk_re					$dataglobal_unk_re}
	{"sizeof((int) dataglobal)"	""   " = $decimal"					" = int"}
	{"dataglobal + 1"		""   $dataglobal_unk_re					$dataglobal_unk_re}
	{"&dataglobal"			""   "\\($data_var_type \\*\\) $hex <dataglobal>"	" = $data_var_type \\*"}
	{"&dataglobal + 1"		""   $ptr_math_re					$ptr_math_re}
	{"(int *) &dataglobal + 1"	""   " = \\(int \\*\\) $hex <datalocal>"		"int \\*"}
	{"&(int) dataglobal + 1"	""   $not_mem_re					$not_mem_re}
	{"&dataglobal, &dataglobal"	""   "\\($data_var_type \\*\\) $hex <dataglobal>"	" = $data_var_type \\*"}
	{"*dataglobal"			""   $dataglobal_unk_re					$dataglobal_unk_re}

	{"dataglobal8"			"/x" $dataglobal_unk_re					" = $data_var_type"}
	{"(uint8) dataglobal8"		"/x" " = 0xff"						"unsigned char"}

	{"dataglobal32_1"		"/x" $dataglobal_unk_re					" = $data_var_type"}
	{"(uint32) dataglobal32_1"	"/x" " = 0x7fffffff"					"unsigned int"}
	{"dataglobal32_2"		"/x" $dataglobal_unk_re					" = $data_var_type"}
	{"(uint32) dataglobal32_2"	"/x" " = 0xff"						"unsigned int"}

	{"dataglobal64_1"		"/x" $dataglobal_unk_re					" = $data_var_type"}
	{"(uint64) dataglobal64_1"	"/x" " = 0x7fffffffffffffff"				"unsigned long long"}
	{"dataglobal64_2"		"/x" $dataglobal_unk_re					" = $data_var_type"}
	{"(uint64) dataglobal64_2"	"/x" " = 0xff"						"unsigned long long"}
    } {
	set exp [lindex $line 0]
	# Expand variables.
	set fmt [subst -nobackslashes [lindex $line 1]]
	set print [subst  -nobackslashes [lindex $line 2]]
	set whatis [subst -nobackslashes [lindex $line 3]]
	if {$fmt == ""} {
	    gdb_test "p $exp" $print
	} else {
	    gdb_test "p $fmt $exp" $print
	}
	gdb_test "whatis $exp" $whatis
	gdb_test "ptype $exp" $whatis
    }
    
    # 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" "datalocal.*$unk_type_re"
    gdb_test "p (int) datalocal" "= 4"

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

    gdb_test "whatis datalocal" "datalocal.*$data_var_type"

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

    gdb_test "ptype datalocal" "datalocal.*$data_var_type"

    gdb_test "p bssglobal" "bssglobal.*$unk_type_re"
    gdb_test "p (int) bssglobal" "= 0"
    gdb_test "whatis bssglobal" $data_var_type
    gdb_test "ptype bssglobal" $data_var_type

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

    gdb_test "p bsslocal" "bsslocal.*$unk_type_re"
    gdb_test "p (int) bsslocal" "= 0"

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

    gdb_test "whatis bsslocal" $data_var_type

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

    gdb_test "ptype bsslocal" $data_var_type

    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.
    foreach cmd {"p/c" "ptype" "whatis"} {
	gdb_test "$cmd array_index(\"abcdef\",2)" \
	    "'array_index' has unknown return type; cast the call to its declared return type"
    }
    if [target_info exists gdb,cannot_call_functions] {
	unsupported "p/c (int) 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 (int) array_index("abcdef",2)} " = 99 'c'"
	set timeout $prev_timeout
    }

    test_call_promotion

    # Now, try that we can give names of file-local symbols which happen
    # to be unique, and have it still work
    if [nodebug_runto middle] then {
	gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \
	    "backtrace from middle in nodebug.exp"
    }
}
