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

# Copyright 2004-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 "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] {
    unsupported "this target can not call functions"
    continue
}

standard_testfile .c

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

if [get_compiler_info] {
    return -1
}
set skip_float_test [gdb_skip_float_test]

# 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 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 [standard_output_file ${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 "failed to compile"
	    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/r ${type}" "${test}" {
	-re "type = (\[^\r\n\]*)\r\n$gdb_prompt $" {
	    set foo_t "$expect_out(1,string)"
	    pass "$test (${foo_t})"
	}
    }
    gdb_test "ptype/r 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.

# 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.

# 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 {!$skip_float_test} {
    # 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
