# This testcase is part of GDB, the GNU debugger.

# Copyright 2004, 2007-2012 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 "return", "finish", and "call" of functions that a scalar (int,
# float, enum) and/or take a single scalar parameter.


# Some targets can't call functions, so don't even bother with this
# test.

if [target_info exists gdb,cannot_call_functions] {
    setup_xfail "*-*-*"
    fail "This target can not call functions"
    continue
}

set testfile "call-sc"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

if [get_compiler_info] {
    return -1;
}

# Compile a variant of scalars.c using TYPE to specify the type of the
# parameter and return-type.  Run the compiled program up to "main".
# Also updates the global "testfile" to reflect the most recent build.

proc start_scalars_test { type } {
    global testfile
    global srcfile
    global binfile
    global objdir
    global subdir
    global srcdir
    global gdb_prompt
    global expect_out

    # Create the additional flags
    set flags "debug additional_flags=-DT=${type}"
    set testfile "call-sc-${type}"

    set binfile ${objdir}/${subdir}/${testfile}
    if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "${flags}"] != "" } {
	# built the second test case since we can't use prototypes
	warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES"
	if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "${flags} additional_flags=-DNO_PROTOTYPES"] != "" } {
	    untested call-sc.exp
	    return -1
	}
    }

    # Start with a fresh gdb.
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${binfile}

    # Make certain that the output is consistent
    gdb_test_no_output "set print sevenbit-strings"
    gdb_test_no_output "set print address off"
    gdb_test_no_output "set width 0"

    # Advance to main
    if { ![runto_main] } then {
	gdb_suppress_tests;
    }

    # Get the debug format
    get_debug_format

    # check that type matches what was passed in
    set test "ptype; ${testfile}"
    set foo_t "xxx"
    gdb_test_multiple "ptype ${type}" "${test}" {
	-re "type = (\[^\r\n\]*)\r\n$gdb_prompt $" {
	    set foo_t "$expect_out(1,string)"
	    pass "$test (${foo_t})"
	}
    }
    gdb_test "ptype foo" "type = ${foo_t}" "ptype foo; ${testfile} $expect_out(1,string)"
}


# Given N (0..25), return the corresponding alphabetic letter in lower
# or upper case.  This is ment to be i18n proof.

proc i2a { n } {
    return [string range "abcdefghijklmnopqrstuvwxyz" $n $n]
}

proc I2A { n } {
    return [string toupper [i2a $n]]
}


# Test GDB's ability to make inferior function calls to functions
# returning (or passing) in a single scalar.

# start_scalars_test() will have previously built a program with a
# specified scalar type.  To ensure robustness of the output, "p/c" is
# used.

# This tests the code paths "which return-value convention?" and
# "extract return-value from registers" called by "infcall.c".

proc test_scalar_calls { } {
    global testfile
    global gdb_prompt

    # Check that GDB can always extract a scalar-return value from an
    # inferior function call.  Since GDB always knows the location of
    # an inferior function call's return value these should never fail
    
    # Implemented by calling the parameterless function "fun" and then
    # examining the return value printed by GDB.

    set tests "call ${testfile}"

    # Call fun, checking the printed return-value.
    gdb_test "p/c fun()" "= 49 '1'" "p/c fun(); ${tests}"

    # Check that GDB can always pass a structure to an inferior function.
    # This test can never fail.

    # Implemented by calling the one parameter function "Fun" which
    # stores its parameter in the global variable "L".  GDB then
    # examining that global to confirm that the value is as expected.

    gdb_test_no_output "call Fun(foo)" "call Fun(foo); ${tests}"
    gdb_test "p/c L" " = 49 '1'" "p/c L; ${tests}"
}

# Test GDB's ability to both return a function (with "return" or
# "finish") and correctly extract/store any corresponding
# return-value.

# Check that GDB can consistently extract/store structure return
# values.  There are two cases - returned in registers and returned in
# memory.  For the latter case, the return value can't be found and a
# failure is "expected".  However GDB must still both return the
# function and display the final source and line information.

# N identifies the number of elements in the struct that will be used
# for the test case.  FAILS is a list of target tuples that will fail
# this test.

# This tests the code paths "which return-value convention?", "extract
# return-value from registers", and "store return-value in registers".
# Unlike "test struct calls", this test is expected to "fail" when the
# return-value is in memory (GDB can't find the location).  The test
# is in three parts: test "return"; test "finish"; check that the two
# are consistent.  GDB can sometimes work for one command and not the
# other.

proc test_scalar_returns { } {
    global gdb_prompt
    global testfile

    set tests "return ${testfile}"


    # Check that "return" works.

    # GDB must always force the return of a function that has
    # a struct result.  Dependant on the ABI, it may, or may not be
    # possible to store the return value in a register.

    # The relevant code looks like "L{n} = fun{n}()".  The test forces
    # "fun{n}" to "return" with an explicit value.  Since that code
    # snippet will store the returned value in "L{n}" the return
    # is tested by examining "L{n}".  This assumes that the
    # compiler implemented this as fun{n}(&L{n}) and hence that when
    # the value isn't stored "L{n}" remains unchanged.  Also check for
    # consistency between this and the "finish" case.

    # Get into a call of fun
    gdb_test "advance fun" \
	    "fun .*\[\r\n\]+\[0-9\].*return foo.*" \
	    "advance to fun for return; ${tests}"

    # Check that the program invalidated the relevant global.
    gdb_test "p/c L" " = 90 'Z'" "zed L for return; ${tests}"

    # Force the "return".  This checks that the return is always
    # performed, and that GDB correctly reported this to the user.
    # GDB 6.0 and earlier, when the return-value's location wasn't
    # known, both failed to print a final "source and line" and misplaced
    # the frame ("No frame").

    # The test is writen so that it only reports one FAIL/PASS for the
    # entire operation.  The value returned is checked further down.
    # "return_value_unknown", if non-empty, records why GDB realised
    # that it didn't know where the return value was.

    set test "return foo; ${tests}"
    set return_value_unknown 0
    set return_value_unimplemented 0
    gdb_test_multiple "return foo" "${test}" {
	-re "The location" {
	    # Ulgh, a struct return, remember this (still need prompt).
	    set return_value_unknown 1
	    exp_continue
	}
	-re "A structure or union" {
	    # Ulgh, a struct return, remember this (still need prompt).
	    set return_value_unknown 1
	    # Double ulgh.  Architecture doesn't use return_value and
	    # hence hasn't implemented small structure return.
	    set return_value_unimplemented 1
	    exp_continue
	}
	-re "Make fun return now.*y or n. $" {
	    gdb_test_multiple "y" "${test}" {
		-re "L *= fun.*${gdb_prompt} $" {
		    # Need to step off the function call
		    gdb_test "next" "zed.*" "${test}"
		}
		-re "zed \\(\\);.*$gdb_prompt $" {
		    pass "${test}"
		}
	    }
	}
    }

    # If the previous test did not work, the program counter might
    # still be inside foo() rather than main().  Make sure the program
    # counter is is main().
    #
    # This happens on ppc64 GNU/Linux with gcc 3.4.1 and a buggy GDB

    set test "return foo; synchronize pc to main()"
    for {set loop_count 0} {$loop_count < 2} {incr loop_count} {
      gdb_test_multiple "backtrace 1" $test {
        -re "#0.*main \\(\\).*${gdb_prompt} $" {
          pass $test
          set loop_count 2
        }
        -re "#0.*fun \\(\\).*${gdb_prompt} $" {
          if {$loop_count < 1} {
            gdb_test "finish" ".*" ""
          } else {
            fail $test
            set loop_count 2
          }
        }
      }
    }

    # Check that the return-value is as expected.  At this stage we're
    # just checking that GDB has returned a value consistent with
    # "return_value_unknown" set above.

    set test "value foo returned; ${tests}"
    gdb_test_multiple "p/c L" "${test}" {
	-re " = 49 '1'.*${gdb_prompt} $" {
	    if $return_value_unknown {
		# This contradicts the above claim that GDB didn't
		# know the location of the return-value.
		fail "${test}"
	    } else {
		pass "${test}"
	    }
	}
	-re " = 90 .*${gdb_prompt} $" {
	    if $return_value_unknown {
		# The struct return case.  Since any modification
		# would be by reference, and that can't happen, the
		# value should be unmodified and hence Z is expected.
		# Is this a reasonable assumption?
		pass "${test}"
	    } else {
		# This contradicts the above claim that GDB knew
		# the location of the return-value.
		fail "${test}"
	    }
	}
	-re ".*${gdb_prompt} $" {
	    if $return_value_unimplemented {
		# What a suprize.  The architecture hasn't implemented
		# return_value, and hence has to fail.
		kfail "$test" gdb/1444
	    } else {
		fail "$test"
	    }
	}
    }	
    
    # Check that a "finish" works.

    # This is almost but not quite the same as "call struct funcs".
    # Architectures can have subtle differences in the two code paths.

    # The relevant code snippet is "L{n} = fun{n}()".  The program is
    # advanced into a call to  "fun{n}" and then that function is
    # finished.  The returned value that GDB prints, reformatted using
    # "p/c", is checked.

    # Get into "fun()".
    gdb_test "advance fun" \
	    "fun .*\[\r\n\]+\[0-9\].*return foo.*" \
	    "advance to fun for finish; ${tests}"

    # Check that the program invalidated the relevant global.
    gdb_test "p/c L" " = 90 'Z'" "zed L for finish; ${tests}"

    # Finish the function, set 'finish_value_unknown" to non-empty if the
    # return-value was not found.
    set test "finish foo; ${tests}"
    set finish_value_unknown 0
    gdb_test_multiple "finish" "${test}" {
	-re "Value returned is .*${gdb_prompt} $" {
	    pass "${test}"
	}
	-re "Cannot determine contents.*${gdb_prompt} $" {
	    # Expected bad value.  For the moment this is ok.
	    set finish_value_unknown 1
	    pass "${test}"
	}
    }

    # Re-print the last (return-value) using the more robust
    # "p/c".  If no return value was found, the 'Z' from the previous
    # check that the variable was cleared, is printed.
    set test "value foo finished; ${tests}"
    gdb_test_multiple "p/c" "${test}" {
	-re " = 49 '1'\[\r\n\]+${gdb_prompt} $" {
	    if $finish_value_unknown {
		# This contradicts the above claim that GDB didn't
		# know the location of the return-value.
		fail "${test}"
	    } else {
		pass "${test}"
	    }
	}
	-re " = 90 'Z'\[\r\n\]+${gdb_prompt} $" {
	    # The value didn't get found.  This is "expected".
	    if $finish_value_unknown {
		pass "${test}"
	    } else {
		# This contradicts the above claim that GDB did
		# know the location of the return-value.
		fail "${test}"
	    }
	}
    }

    # Finally, check that "return" and finish" have consistent
    # behavior.

    # Since both "return" and "finish" use equivalent "which
    # return-value convention" logic, both commands should have
    # identical can/can-not find return-value messages.

    # Note that since "call" and "finish" use common code paths, a
    # failure here is a strong indicator of problems with "store
    # return-value" code paths.  Suggest looking at "return_value"
    # when investigating a fix.

    set test "return and finish use same convention; ${tests}"
    if {$finish_value_unknown == $return_value_unknown} {
	pass "${test}"
    } else {
	kfail gdb/1444 "${test}"
    }
}

# ABIs pass anything >8 or >16 bytes in memory but below that things
# randomly use register and/and structure conventions.  Check all
# possible sized char scalars in that range.  But only a restricted
# range of the other types.

# NetBSD/PPC returns "unnatural" (3, 5, 6, 7) sized scalars in memory.

# d10v is weird. 5/6 byte scalars go in memory.  2 or more char
# scalars go in memory.  Everything else is in a register!

# Test every single char struct from 1..17 in size.  This is what the
# original "scalars" test was doing.

start_scalars_test tc
test_scalar_calls
test_scalar_returns


# Let the fun begin.

# Assuming that any integer struct larger than 8 bytes goes in memory,
# come up with many and varied combinations of a return struct.  For
# "struct calls" test just beyond that 8 byte boundary, for "struct
# returns" test up to that boundary.

# For floats, assumed that up to two struct elements can be stored in
# floating point registers, regardless of their size.

# The approx size of each structure it is computed assumed that tc=1,
# ts=2, ti=4, tl=4, tll=8, tf=4, td=8, tld=16, and that all fields are
# naturally aligned.  Padding being added where needed.  Note that
# these numbers are just approx, the d10v has ti=2, a 64-bit has has
# tl=8.

# Approx size: 2, 4, ...
start_scalars_test ts
test_scalar_calls
test_scalar_returns

# Approx size: 4, 8, ...
start_scalars_test ti
test_scalar_calls
test_scalar_returns

# Approx size: 4, 8, ...
start_scalars_test tl
test_scalar_calls
test_scalar_returns

# Approx size: 8, 16, ...
start_scalars_test tll
test_scalar_calls
test_scalar_returns

if ![target_info exists gdb,skip_float_tests] {
    # Approx size: 4, 8, ...
    start_scalars_test tf
    test_scalar_calls
    test_scalar_returns

    # Approx size: 8, 16, ...
    start_scalars_test td
    test_scalar_calls
    test_scalar_returns

    # Approx size: 16, 32, ...
    start_scalars_test tld
    test_scalar_calls
    test_scalar_returns
}

# Approx size: 4, 8, ...
start_scalars_test te
test_scalar_calls
test_scalar_returns

return 0
