# Copyright 1998-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 Elena Zannoni (ezannoni@cygnus.com)

# this file tests command line calls with functions returning structures
# corresponding source file: call_return_struct.c




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


# Test depends on printf, which the sparclet stub doesn't support.  
if { [istarget "sparclet-*-*"] } {
    return 0
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested "couldn't compile ${srcdir}/${subdir}/${srcfile}"
    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
}

# Some targets can't do function calls, 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
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set print sevenbit-strings"
gdb_test_no_output "set print address off"
gdb_test_no_output "set width 0"


if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}


gdb_test "break loop_count" \
    "Breakpoint.* file .*call-rt-st.c, line 128\\." \
    "breakpoint loop_count"

gdb_test "continue" \
    "Continuing\\..*Breakpoint.*loop_count \\(\\) at.*call-rt-st.c:128\[ \t\r\n\]+128\[\t \]+for \\(index=0; index.4; index..\\);\[\r\n \]+" \
    "continue to loop_count"

gdb_test_multiple "finish" "finish out from loop count" {
    -re "Run till exit from .0  loop_count \\(\\) at.*call-rt-st.c:128\[ \t\r\n\]+main \\(\\) at.*call-rt-st.c:777\[ \t\r\n\]+777\[\t \]+return 0;.*$gdb_prompt $" {
	pass "finish out from loop_count (line 777)"
    }
    -re  "Run till exit from .0  loop_count \\(\\) at.*call-rt-st.c:128\[ \t\r\n\]+main \\(\\) at.*call-rt-st.c:775\[ \t\r\n\]+775\[\t \]+loop_count.*$gdb_prompt $" {
	pass "finish out from loop_count (line 775)"
    }
}

# Ask GDB to print the value of EXPR, and expect to see the regexp
# RESULT in the output.  If we get back the error message "Function
# return value unknown", call that an `unsupported' test; on some
# architectures, it's impossible to find structs returned by value
# reliably.
proc print_struct_call { expr result } {
    global gdb_prompt

    set command "print $expr"
    gdb_test_multiple "${command}" "${command}" {
        -re "$result\[\r\n\]+$gdb_prompt $" {
            pass "$command"
        }
        -re "Function return value unknown.\[\r\n\]+$gdb_prompt $" {
            unsupported "$command"
        }
    }
}


if ![gdb_skip_stdio_test "print print_struct_rep(*struct1)"] {
    print_struct_call "print_struct_rep(*struct1)" \
            ".*Contents of struct1:\[ \t\n\r\]+22\[ \t\]+0\[ \t\n\r\]+.\[0-9\]+ = \\{value = 5, head = 0\\}"
}

if ![gdb_skip_stdio_test "print print_one_large_struct(...)"] {
    print_struct_call "print_one_large_struct(*list1)" \
            ".*\[ \t\]+4\[ \t\]+1\[ \r\n\]+.\[0-9\]+ = \\{next_index = \\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10\\}, values = \\{4, 6, 8, 10, 12, 14, 16, 18, 20, 22\\}, head = 0\\}"
}

if {![gdb_skip_float_test "print print_one_double(*d1)"] && \
        ![gdb_skip_stdio_test "print print_one_double(*d1)"] } {
    print_struct_call "print_one_double(*d1)" \
	    ".*Contents of one_double_t:\[ \r\n\]+1\\.111110\[ \r\n\]+.\[0-9\]+ = \\{double1 = 1\\.111\[0-9\]*\\}"
}

if {![gdb_skip_float_test "print print_two_floats(*f3)"] && \
        ![gdb_skip_stdio_test "print print_two_floats(*f3)"] } {
    print_struct_call "print_two_floats(*f3)" \
            ".*Contents of two_floats_t:\[ \r\n\]+-2\\.345000\[ \t]+1\\.000000\[ \r\n\]+.\[0-9\]+ = \\{float1 = -2\\.34500003, float2 = 1\\}"
}

if ![gdb_skip_stdio_test "print print_bit_flags_char(*cflags)"] {
    print_struct_call "print_bit_flags_char(*cflags)" \
            ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1 '\\\\001', beta = 0 '\\\\000', gamma = 1 '\\\\001', delta = 0 '\\\\000', epsilon = 1 '\\\\001', omega = 0 '\\\\000'\\}"
}

if ![gdb_skip_stdio_test "print print_bit_flags_short(*sflags)"] {
    print_struct_call "print_bit_flags_short(*sflags)" \
            ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\\}"
}

if ![gdb_skip_stdio_test "print print_bit_flags(*flags)"] {
    print_struct_call "print_bit_flags(*flags)" \
            ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\\}"
}

if ![gdb_skip_stdio_test "print print_bit_flags_combo(*flags_combo)"] {
    print_struct_call "print_bit_flags_combo(*flags_combo)" \
            ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+ch1: y\[ \t\]+ch2: n\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1, beta = 0, ch1 = 121 'y', gamma = 1, delta = 0, ch2 = 110 'n', epsilon = 1, omega = 0\\}"
}

if ![gdb_skip_stdio_test "print print_three_chars(*three_chars)"] {
    print_struct_call "print_three_chars(*three_char)" \
            ".*Contents of three_char_t:\[ \r\n\]+x\[ \t\]+y\[ \t\]+z\[ \r\n\]+.\[0-9\]+ = \\{ch1 = 120 'x', ch2 = 121 'y', ch3 = 122 'z'\\}"
}

if ![gdb_skip_stdio_test "print print_five_chars(*five_chars)"] {
    print_struct_call "print_five_chars(*five_char)" \
            ".*Contents of five_char_t:\[ \r\n\]+h\[ \t\]+e\[ \t\]+l\[ \t\]+l\[ \t\]+o\[ \r\n\]+.\[0-9\]+ = \\{ch1 = 104 'h', ch2 = 101 'e', ch3 = 108 'l', ch4 = 108 'l', ch5 = 111 'o'\\}"
}

if ![gdb_skip_stdio_test "print print_int_char_combo(*int_char_combo)"] {
    print_struct_call "print_int_char_combo(*int_char_combo)" \
            ".*Contents of int_char_combo_t:\[ \r\n\]+13\[ \t\]+!\[ \r\n\]+.\[0-9\]+ = \\{int1 = 13, ch1 = 33 '!'\\}"
}

return
