| 1 | # Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 |
| 2 | # Free Software Foundation, Inc. |
| 3 | |
| 4 | # This program is free software; you can redistribute it and/or modify |
| 5 | # it under the terms of the GNU General Public License as published by |
| 6 | # the Free Software Foundation; either version 2 of the License, or |
| 7 | # (at your option) any later version. |
| 8 | # |
| 9 | # This program is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | # GNU General Public License for more details. |
| 13 | # |
| 14 | # You should have received a copy of the GNU General Public License |
| 15 | # along with this program; if not, write to the Free Software |
| 16 | # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 17 | |
| 18 | # Please email any bugs, comments, and/or additions to this file to: |
| 19 | # bug-gdb@prep.ai.mit.edu |
| 20 | |
| 21 | # This file was written by Elena Zannoni (ezannoni@cygnus.com) |
| 22 | |
| 23 | # this file tests command line calls with functions returning structures |
| 24 | # corresponding source file: call_return_struct.c |
| 25 | |
| 26 | |
| 27 | |
| 28 | if $tracelevel then { |
| 29 | strace $tracelevel |
| 30 | } |
| 31 | |
| 32 | set prms_id 0 |
| 33 | set bug_id 0 |
| 34 | |
| 35 | set testfile "call-rt-st" |
| 36 | set srcfile ${testfile}.c |
| 37 | set binfile ${objdir}/${subdir}/${testfile} |
| 38 | |
| 39 | |
| 40 | # Test depends on printf, which the sparclet stub doesn't support. |
| 41 | if { [istarget "sparclet-*-*"] } { |
| 42 | return 0; |
| 43 | } |
| 44 | |
| 45 | if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { |
| 46 | untested "couldn't compile ${srcdir}/${subdir}/${srcfile}" |
| 47 | return -1 |
| 48 | } |
| 49 | |
| 50 | |
| 51 | |
| 52 | # Create and source the file that provides information about the compiler |
| 53 | # used to compile the test case. |
| 54 | |
| 55 | if [get_compiler_info ${binfile}] { |
| 56 | return -1; |
| 57 | } |
| 58 | |
| 59 | # Some targets can't do function calls, so don't even bother with this |
| 60 | # test. |
| 61 | if [target_info exists gdb,cannot_call_functions] { |
| 62 | setup_xfail "*-*-*" 2416 |
| 63 | fail "This target can not call functions" |
| 64 | continue |
| 65 | } |
| 66 | |
| 67 | # Set the current language to C. This counts as a test. If it |
| 68 | # fails, then we skip the other tests. |
| 69 | |
| 70 | proc set_lang_c {} { |
| 71 | global gdb_prompt |
| 72 | |
| 73 | send_gdb "set language c\n" |
| 74 | gdb_expect { |
| 75 | -re ".*$gdb_prompt $" {} |
| 76 | timeout { fail "set language c (timeout)" ; return 0; } |
| 77 | } |
| 78 | |
| 79 | send_gdb "show language\n" |
| 80 | gdb_expect { |
| 81 | -re ".* source language is \"c\".*$gdb_prompt $" { |
| 82 | pass "set language to \"c\"" |
| 83 | return 1 |
| 84 | } |
| 85 | -re ".*$gdb_prompt $" { |
| 86 | fail "setting language to \"c\"" |
| 87 | return 0 |
| 88 | } |
| 89 | timeout { |
| 90 | fail "can't show language (timeout)" |
| 91 | return 0 |
| 92 | } |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | # Start with a fresh gdb. |
| 97 | |
| 98 | gdb_exit |
| 99 | gdb_start |
| 100 | gdb_reinitialize_dir $srcdir/$subdir |
| 101 | gdb_load ${binfile} |
| 102 | send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" |
| 103 | send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" |
| 104 | send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" |
| 105 | |
| 106 | |
| 107 | if ![runto_main] then { |
| 108 | perror "couldn't run to breakpoint" |
| 109 | continue |
| 110 | } |
| 111 | |
| 112 | |
| 113 | gdb_test "break loop_count" \ |
| 114 | "Breakpoint.* file .*call-rt-st.c, line 128\\." \ |
| 115 | "breakpoint loop_count" |
| 116 | |
| 117 | |
| 118 | send_gdb "continue\n" |
| 119 | gdb_expect { |
| 120 | -re "Continuing\\..*Breakpoint.*loop_count \\(\\) at.*call-rt-st.c:128\[ \t\r\n\]+128\[\t \]+for \\(index=0; index.4; index..\\);\[\r\n \]+$gdb_prompt $" { |
| 121 | pass "continue to loop_count"} |
| 122 | -re ".*$gdb_prompt $" { fail "continue to loop_count"} |
| 123 | timeout { fail "(timeout) continue to loop_count"} |
| 124 | } |
| 125 | |
| 126 | send_gdb "finish\n" |
| 127 | gdb_expect { |
| 128 | -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 $" { |
| 129 | pass "finish out from loop_count (line 777)" |
| 130 | } |
| 131 | -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 $" { |
| 132 | pass "finish out from loop_count (line 775)" |
| 133 | } |
| 134 | -re ".*$gdb_prompt $" { |
| 135 | fail "finish out from loop_count" |
| 136 | } |
| 137 | timeout { |
| 138 | fail "finish out from loop_count (timeout)" |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | # Ask GDB to print the value of EXPR, and expect to see the regexp |
| 143 | # RESULT in the output. If we get back the error message "Function |
| 144 | # return value unknown", call that an `unsupported' test; on some |
| 145 | # architectures, it's impossible to find structs returned by value |
| 146 | # reliably. |
| 147 | proc print_struct_call { expr result } { |
| 148 | global gdb_prompt |
| 149 | |
| 150 | set command "print $expr" |
| 151 | send_gdb "${command}\n" |
| 152 | gdb_expect { |
| 153 | -re "$result\[\r\n\]+$gdb_prompt $" { |
| 154 | pass "$command" |
| 155 | } |
| 156 | -re "Function return value unknown.\[\r\n\]+$gdb_prompt $" { |
| 157 | unsupported "$command" |
| 158 | } |
| 159 | -re "$gdb_prompt $" { |
| 160 | fail "$command" |
| 161 | } |
| 162 | timeout { |
| 163 | fail "$command (timeout)" |
| 164 | } |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | |
| 169 | if ![gdb_skip_stdio_test "print print_struct_rep(*struct1)"] { |
| 170 | print_struct_call "print_struct_rep(*struct1)" \ |
| 171 | ".*Contents of struct1:\[ \t\n\r\]+22\[ \t\]+0\[ \t\n\r\]+.\[0-9\]+ = \\{value = 5, head = 0\\}" |
| 172 | } |
| 173 | |
| 174 | if ![gdb_skip_stdio_test "print print_one_large_struct(...)"] { |
| 175 | print_struct_call "print_one_large_struct(*list1)" \ |
| 176 | ".*\[ \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\\}" |
| 177 | } |
| 178 | |
| 179 | if {![gdb_skip_float_test "print print_one_double(*d1)"] && \ |
| 180 | ![gdb_skip_stdio_test "print print_one_double(*d1)"] } { |
| 181 | print_struct_call "print_one_double(*d1)" \ |
| 182 | ".*Contents of one_double_t:\[ \r\n\]+1\\.111110\[ \r\n\]+.\[0-9\]+ = \\{double1 = 1\\.111\[0-9\]*\\}" |
| 183 | } |
| 184 | |
| 185 | if {![gdb_skip_float_test "print print_two_floats(*f3)"] && \ |
| 186 | ![gdb_skip_stdio_test "print print_two_floats(*f3)"] } { |
| 187 | print_struct_call "print_two_floats(*f3)" \ |
| 188 | ".*Contents of two_floats_t:\[ \r\n\]+-2\\.345000\[ \t]+1\\.000000\[ \r\n\]+.\[0-9\]+ = \\{float1 = -2\\.34500003, float2 = 1\\}" |
| 189 | } |
| 190 | |
| 191 | if ![gdb_skip_stdio_test "print print_bit_flags_char(*cflags)"] { |
| 192 | print_struct_call "print_bit_flags_char(*cflags)" \ |
| 193 | ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1 '\\\\001', beta = 0 '\\\\0', gamma = 1 '\\\\001', delta = 0 '\\\\0', epsilon = 1 '\\\\001', omega = 0 '\\\\0'\\}" |
| 194 | } |
| 195 | |
| 196 | if ![gdb_skip_stdio_test "print print_bit_flags_short(*sflags)"] { |
| 197 | print_struct_call "print_bit_flags_short(*sflags)" \ |
| 198 | ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\\}" |
| 199 | } |
| 200 | |
| 201 | if ![gdb_skip_stdio_test "print print_bit_flags(*flags)"] { |
| 202 | print_struct_call "print_bit_flags(*flags)" \ |
| 203 | ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \\{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\\}" |
| 204 | } |
| 205 | |
| 206 | if ![gdb_skip_stdio_test "print print_bit_flags_combo(*flags_combo)"] { |
| 207 | print_struct_call "print_bit_flags_combo(*flags_combo)" \ |
| 208 | ".*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\\}" |
| 209 | } |
| 210 | |
| 211 | if ![gdb_skip_stdio_test "print print_three_chars(*three_chars)"] { |
| 212 | print_struct_call "print_three_chars(*three_char)" \ |
| 213 | ".*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'\\}" |
| 214 | } |
| 215 | |
| 216 | if ![gdb_skip_stdio_test "print print_five_chars(*five_chars)"] { |
| 217 | print_struct_call "print_five_chars(*five_char)" \ |
| 218 | ".*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'\\}" |
| 219 | } |
| 220 | |
| 221 | if ![gdb_skip_stdio_test "print print_int_char_combo(*int_char_combo)"] { |
| 222 | print_struct_call "print_int_char_combo(*int_char_combo)" \ |
| 223 | ".*Contents of int_char_combo_t:\[ \r\n\]+13\[ \t\]+!\[ \r\n\]+.\[0-9\]+ = \\{int1 = 13, ch1 = 33 '!'\\}" |
| 224 | } |
| 225 | |
| 226 | return |