# Copyright 1997-2013 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/>.  */

# This file was written by Fred Fish. (fnf@cygnus.com)

# These tests are the same as those in callfuncs.exp, except that the
# test program here does not call malloc.
#
# "What in the world does malloc have to do with calling functions in
# the inferior?"  Well, nothing.  GDB's ability to invoke a function
# in the inferior program works just fine in programs that have no
# malloc function available.  It doesn't rely on the inferior's
# malloc, directly or indirectly.  It just uses the inferior's stack
# space.
#
# "Then what's the point of this test file?"  Well, it just so happens
# that this file, in addition to testing inferior function calls, also
# tests GDB's ability to evaluate string literals (like "string 1" and
# "string 2" in the tests below).  Evaluating *those* sorts of
# expressions does require malloc.
#
# (As an extension to C, GDB also has a syntax for literal arrays of
# anything, not just characters.  For example, the expression
# {2,3,4,5} (which appears in the tests below) evaluates to an array
# of four ints.  So rather than talking just about string literals,
# we'll use the broader term "array literals".)
#
# Now, in this file, we only evaluate array literals when we're about
# to pass them to a function, but don't be confused --- this is a red
# herring.  You can evaluate "abcdef" even if you're not about to pass
# that to a function, and doing so requires malloc even if you're just
# going to store a pointer to it in a variable, like this:
#
#    (gdb) ptype s
#    type = char *
#    (gdb) set variable s = "abcdef"
#
# According to C's rules for evaluating expressions, arrays are
# converted into pointers to their first element.  This means that, in
# order to evaluate an expression like "abcdef", GDB needs to actually
# find some memory in the inferior we can plop the characters into;
# then we use that memory's address as the address of our array
# literal.  GDB finds this memory by calling the inferior's malloc
# function, if it has one.  So, evaluating an array literal depends on
# performing an inferior function call, but not vice versa.  (GDB
# can't just allocate the space on the stack; the pointer may remain
# live long after the current frame has been popped.)
#
# "But, if evaluating array literals requires malloc, what's the point
# of testing that GDB can do so in a program that doesn't have malloc?
# It can't work!"  On most systems, that's right, but HP-UX has some
# sort of dynamic linking magic that ensures that *every* program has
# malloc.  So on HP-UX, GDB can evaluate array literals even in
# inferior programs that don't use malloc.  That's why this test is in
# gdb.hp.
# 
# This file has, for some reason, led to well more than its fair share
# of misunderstandings about the relationship between array literal
# expressions and inferior function calls.  Folks talk as if you can
# only evaluate array literals when you're about to pass them to a
# function.  I think they're assuming that, since GDB is constructing
# a new frame on the inferior's stack (correct), it's going to use
# that space for the array literals (incorrect).  Remember that those
# array literals may need to be live long after the inferior function
# call returns; GDB can't tell.
#
# What makes the confusion worse is that there *is* a relationship
# between array literals and inferior function calls --- GDB uses
# inferior function calls to evaluate array literals.  But many people
# jump to other, incorrect conclusions about this.


if { [skip_hp_tests] } then { continue }

set testfile "callfwmall"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested callfwmall.exp
     return -1
}

# Create and source the file that provides information about the compiler
# used to compile the test case.

if [get_compiler_info] {
    return -1;
}

if {$hp_aCC_compiler} {
    set prototypes 1
} else {
    set prototypes 0
}


# Some targets can't call functions, so don't even bother with this
# test.
if [target_info exists gdb,cannot_call_functions] {
    setup_xfail "*-*-*" 2416
    fail "This target can not call functions"
    continue
}

# Set the current language to C.  This counts as a test.  If it
# fails, then we skip the other tests.

proc set_lang_c {} {
    global gdb_prompt

    send_gdb "set language c\n"
    gdb_expect {
	-re ".*$gdb_prompt $" {}
	timeout { fail "set language c (timeout)" ; return 0 }
    }

    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"c\".*$gdb_prompt $" {
	    pass "set language to \"c\""
	    return 1
	}
	-re ".*$gdb_prompt $" {
	    fail "setting language to \"c\""
	    return 0
	}
	timeout {
	    fail "can't show language (timeout)"
	    return 0
	}
    }
}

# FIXME:  Before calling this proc, we should probably verify that
# we can call inferior functions and get a valid integral value
# returned.
# Note that it is OK to check for 0 or 1 as the returned values, because C
# specifies that the numeric value of a relational or logical expression
# (computed in the inferior) is 1 for true and 0 for false.

proc do_function_calls {} {
    global prototypes
    global gcc_compiled
    global gdb_prompt

    # We need to up this because this can be really slow on some boards.
    set timeout 60;

    gdb_test "p t_char_values(0,0)" " = 0"
    gdb_test "p t_char_values('a','b')" " = 1"
    gdb_test "p t_char_values(char_val1,char_val2)" " = 1"
    gdb_test "p t_char_values('a',char_val2)" " = 1"
    gdb_test "p t_char_values(char_val1,'b')" " = 1"

    gdb_test "p t_short_values(0,0)" " = 0"
    gdb_test "p t_short_values(10,-23)" " = 1"
    gdb_test "p t_short_values(short_val1,short_val2)" " = 1"
    gdb_test "p t_short_values(10,short_val2)" " = 1"
    gdb_test "p t_short_values(short_val1,-23)" " = 1"

    gdb_test "p t_int_values(0,0)" " = 0"
    gdb_test "p t_int_values(87,-26)" " = 1"
    gdb_test "p t_int_values(int_val1,int_val2)" " = 1"
    gdb_test "p t_int_values(87,int_val2)" " = 1"
    gdb_test "p t_int_values(int_val1,-26)" " = 1"

    gdb_test "p t_long_values(0,0)" " = 0"
    gdb_test "p t_long_values(789,-321)" " = 1"
    gdb_test "p t_long_values(long_val1,long_val2)" " = 1"
    gdb_test "p t_long_values(789,long_val2)" " = 1"
    gdb_test "p t_long_values(long_val1,-321)" " = 1"

    if ![target_info exists gdb,skip_float_tests] {
	gdb_test "p t_float_values(0.0,0.0)" " = 0"

	# These next four tests fail on the mn10300.
	# The first value is passed in regs, the other in memory.
	# Gcc emits different stabs for the two parameters; the first is
	# claimed to be a float, the second a double.
	# dbxout.c in gcc claims this is the desired behavior.
	setup_xfail "mn10300-*-*"
	gdb_test "p t_float_values(3.14159,-2.3765)" " = 1"
	setup_xfail "mn10300-*-*"
	gdb_test "p t_float_values(float_val1,float_val2)" " = 1"
	setup_xfail "mn10300-*-*"
	gdb_test "p t_float_values(3.14159,float_val2)" " = 1"
	setup_xfail "mn10300-*-*"
	gdb_test "p t_float_values(float_val1,-2.3765)" " = 1"

	# Test passing of arguments which might not be widened.
	gdb_test "p t_float_values2(0.0,0.0)" " = 0"

	# Although PR 5318 mentions SunOS specifically, this seems
	# to be a generic problem on quite a few platforms.
	if $prototypes then {
	    setup_xfail "sparc-*-*" "mips*-*-*" 5318
	    if {!$gcc_compiled} then {
		setup_xfail "alpha-dec-osf2*" "i*86-*-sysv4*" 5318
	    }
	}
	gdb_test "p t_float_values2(3.14159,float_val2)" " = 1"
	gdb_test "p t_small_values(1,2,3,4,5,6,7,8,9,10)" " = 55"

	gdb_test "p t_double_values(0.0,0.0)" " = 0"
	gdb_test "p t_double_values(45.654,-67.66)" " = 1"
	gdb_test "p t_double_values(double_val1,double_val2)" " = 1"
	gdb_test "p t_double_values(45.654,double_val2)" " = 1"
	gdb_test "p t_double_values(double_val1,-67.66)" " = 1"
   
    }

    gdb_test "p t_string_values(string_val2,string_val1)" " = 0"
    gdb_test "p t_string_values(string_val1,string_val2)" " = 1"
    gdb_test "p t_string_values(\"string 1\",\"string 2\")" " = 1"
    gdb_test "p t_string_values(\"string 1\",string_val2)" " = 1"
    gdb_test "p t_string_values(string_val1,\"string 2\")" " = 1"

    gdb_test "p t_char_array_values(char_array_val2,char_array_val1)" " = 0"
    gdb_test "p t_char_array_values(char_array_val1,char_array_val2)" " = 1"
    gdb_test "p t_char_array_values(\"carray 1\",\"carray 2\")" " = 1"
    gdb_test "p t_char_array_values(\"carray 1\",char_array_val2)" " = 1"
    gdb_test "p t_char_array_values(char_array_val1,\"carray 2\")" " = 1"

    gdb_test "p doubleit(4)" " = 8"
    gdb_test "p add(4,5)" " = 9"
    gdb_test "p t_func_values(func_val2,func_val1)" " = 0"
    gdb_test "p t_func_values(func_val1,func_val2)" " = 1"

    # On the rs6000, we need to pass the address of the trampoline routine,
    # not the address of add itself.  I don't know how to go from add to
    # the address of the trampoline.  Similar problems exist on the HPPA,
    # and in fact can present an unsolvable problem as the stubs may not
    # even exist in the user's program.  We've slightly recoded t_func_values
    # to avoid such problems in the common case.  This may or may not help
    # the RS6000.
    setup_xfail "rs6000*-*-*"

    if {![istarget hppa*-*-hpux*]} then {
	gdb_test "p t_func_values(add,func_val2)" " = 1"
    }

    setup_xfail "rs6000*-*-*"

    if {![istarget hppa*-*-hpux*]} then {
	gdb_test "p t_func_values(func_val1,doubleit)" " = 1"
    }

    gdb_test "p t_call_add(func_val1,3,4)" " = 7"

    setup_xfail "rs6000*-*-*"

    if {![istarget hppa*-*-hpux*]} then {
	gdb_test "p t_call_add(add,3,4)" " = 7"
    }
    
    gdb_test "p t_enum_value1(enumval1)" " = 1"
    gdb_test "p t_enum_value1(enum_val1)" " = 1"
    gdb_test "p t_enum_value1(enum_val2)" " = 0"

    gdb_test "p t_enum_value2(enumval2)" " = 1"
    gdb_test "p t_enum_value2(enum_val2)" " = 1"
    gdb_test "p t_enum_value2(enum_val1)" " = 0"

    gdb_test "p sum_args(1,{2})" " = 2"
    gdb_test "p sum_args(2,{2,3})" " = 5"
    gdb_test "p sum_args(3,{2,3,4})" " = 9"
    gdb_test "p sum_args(4,{2,3,4,5})" " = 14"
    gdb_test "p sum10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" " = 55"

    gdb_test "p t_structs_c(struct_val1)" "= 120 'x'" \
	"call inferior func with struct - returns char"
    gdb_test "p t_structs_s(struct_val1)" "= 87" \
	"call inferior func with struct -  returns short"
    gdb_test "p t_structs_i(struct_val1)" "= 76" \
	"call inferior func with struct - returns int"
    gdb_test "p t_structs_l(struct_val1)" "= 51" \
	"call inferior func with struct - returns long"
    gdb_test "p t_structs_f(struct_val1)" "= 2.12.*" \
	"call inferior func with struct - returns float"
    gdb_test "p t_structs_d(struct_val1)" "= 9.87.*" \
	"call inferior func with struct - returns double"
    gdb_test "p t_structs_a(struct_val1)" "= (.unsigned char .. )?\"foo\"" \
	"call inferior func with struct - returns char *"

}

# Start with a fresh gdb.

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

gdb_test "set print sevenbit-strings" ""
gdb_test "set print address off" ""
gdb_test "set width 0" ""

if { $hp_aCC_compiler } {
    # Do not set language explicitly to 'C'.  This will cause aCC
    # tests to fail because promotion rules are different.  Just let
    # the language be set to the default.

    if { ![runto_main] } {
	gdb_suppress_tests;
    }

    gdb_test "set overload-resolution 0" ".*"
} else {
    if { ![set_lang_c] } {
	gdb_suppress_tests;
    } else {
	if { ![runto_main] } {
	    gdb_suppress_tests;
	}
    }
}

gdb_test "next" ".*"
do_function_calls

return 0
