| # 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/>. |
| |
| # Test that GDB properly ignores invalid stabs. |
| # Also test that GDB can debug a .o file, and that it doesn't mind |
| # a file that's more minimal than what a compiler normally puts out. |
| |
| set testfile weird |
| set srcfile [standard_output_file weird.s] |
| set binfile [standard_output_file weirdx.o] |
| |
| if { [ get_compiler_info ] } { |
| return -1 |
| } |
| |
| if { $hp_cc_compiler || $hp_aCC_compiler } { |
| # The native hp-ux assembler does not support stabs at all. |
| # If the compiler is native hp-ux, of course the assembler is too. |
| # But if someone builds gcc with the native assembler (not recommended) |
| # rather than the gnu assembler, then this logic will not suppress it. |
| # -- chastain 2004-01-07 |
| unsupported "stabs with hp-ux assembler" |
| continue |
| } |
| |
| proc do_tests {} { |
| global binfile |
| global gdb_prompt |
| |
| # Mips/alpha targets that use gcc with mips-tfile put out the stabs |
| # assembler directives embedded in comments. If the assembler |
| # file is then processed with native cc, all stabs directives |
| # will be lost. |
| # Skip the rest of the stabs tests for this case. |
| send_gdb "ptype inttype\n" |
| gdb_expect { |
| -re "^ptype inttype\r*\ntype = inttype.*$gdb_prompt $" { |
| pass "stabs found" |
| } |
| -re ".*$gdb_prompt $" { |
| setup_xfail "mips-*-*" |
| setup_xfail "alpha-*-*" |
| fail "stabs not found" |
| return |
| } |
| default { fail "checking for stabs" } |
| } |
| |
| print_weird_var var0 |
| print_weird_var var1 |
| print_weird_var var2 |
| print_weird_var var3 |
| |
| print_weird_var attr32 |
| print_weird_var attr33 |
| print_weird_var attr35 |
| print_weird_var attr36 |
| print_weird_var attr37 |
| print_weird_var attr38 |
| print_weird_var attr39 |
| print_weird_var attr41 |
| print_weird_var attr42 |
| print_weird_var attr43 |
| print_weird_var attr44 |
| print_weird_var attr46 |
| print_weird_var attr47 |
| print_weird_var attr58 |
| print_weird_var attr59 |
| print_weird_var attr60 |
| print_weird_var attr61 |
| print_weird_var attr62 |
| print_weird_var attr63 |
| print_weird_var attr64 |
| print_weird_var attr65 |
| print_weird_var attr66 |
| print_weird_var attr67 |
| print_weird_var attr68 |
| print_weird_var attr69 |
| print_weird_var attr70 |
| print_weird_var attr71 |
| print_weird_var attr72 |
| print_weird_var attr73 |
| print_weird_var attr74 |
| print_weird_var attr75 |
| print_weird_var attr76 |
| print_weird_var attr77 |
| print_weird_var attr78 |
| print_weird_var attr79 |
| print_weird_var attr80 |
| print_weird_var attr81 |
| print_weird_var attr82 |
| print_weird_var attr83 |
| print_weird_var attr84 |
| print_weird_var attr85 |
| print_weird_var attr86 |
| print_weird_var attr87 |
| print_weird_var attr88 |
| print_weird_var attr89 |
| print_weird_var attr90 |
| print_weird_var attr91 |
| print_weird_var attr92 |
| print_weird_var attr93 |
| print_weird_var attr94 |
| print_weird_var attr95 |
| print_weird_var attr96 |
| print_weird_var attr97 |
| print_weird_var attr98 |
| print_weird_var attr99 |
| print_weird_var attr100 |
| print_weird_var attr101 |
| print_weird_var attr102 |
| print_weird_var attr103 |
| print_weird_var attr104 |
| print_weird_var attr105 |
| print_weird_var attr106 |
| print_weird_var attr107 |
| print_weird_var attr108 |
| print_weird_var attr109 |
| print_weird_var attr110 |
| print_weird_var attr111 |
| print_weird_var attr112 |
| print_weird_var attr113 |
| print_weird_var attr114 |
| print_weird_var attr115 |
| print_weird_var attr116 |
| print_weird_var attr117 |
| print_weird_var attr118 |
| print_weird_var attr119 |
| print_weird_var attr120 |
| print_weird_var attr121 |
| print_weird_var attr122 |
| print_weird_var attr123 |
| print_weird_var attr124 |
| print_weird_var attr125 |
| print_weird_var attr126 |
| |
| gdb_test "p const69" " = 69" "'e' constant on non-enum type" |
| gdb_test "whatis const69" "type = (unsigned int|inttype)" "whatis const69" |
| |
| gdb_test "p sizeof (const70)" " = 2" "'e' constant with embedded type" |
| |
| gdb_test "p constchar" " = 97 'a'" "char constant" |
| gdb_test "p constString1" " = \"Single quote String1\"" "String constant 1" |
| gdb_test "p constString2" " = \"Double quote String2\"" "String constant 2" |
| |
| gdb_test "p constString3" " = \"String3 with embedded quote ' in the middle\"" "String constant 3" |
| gdb_test "p constString4" { = "String4 with embedded quote \\" in the middle"} "String constant 4" |
| gdb_test "p bad_neg0" " = \{field0 = 42, field2 =.*field3 = 45\}" "p bad_neg0" |
| |
| gdb_test "ptype inttype" "type = (unsigned int|inttype)" "ptype on inttype" |
| gdb_test "p sizeof (float72type)" " = 9" "unrecognized floating point type" |
| |
| # This big number needs to be kept as one piece |
| gdb_test "p/x int256var" " = 0x0*2a0000002b0000002c0000002d0000002d0000002c0000002b0000002a" "print very big integer" |
| |
| gdb_test "whatis consth" "type = inttype" "whatis consth" |
| gdb_test "whatis consth2" "type = inttype" "whatis consth2" |
| |
| # GDB does not yet understand S constants |
| setup_xfail "*-*-*" |
| gdb_test "p/x bad_neg0const" " = \{field0 = 0x11222211, field2 =.*\ |
| field3 = 0x77888877\}" "print struct constant" |
| |
| gdb_test "ptype bad_type0" "type = .*" "print bad_type0" |
| gdb_test "ptype bad_type1" "type = .*" "print bad_type1" |
| |
| # GDB does not yet support arrays indexed by anything at all unusual |
| setup_xfail "*-*-*" |
| gdb_test "p array0" " = \\{42, 43, 44, 45, 46, 47\\}" "array0 with strange index" |
| setup_xfail "*-*-*" |
| gdb_test "p array1" " = \\{42, 43, 44\\}" "array1 with strange index" |
| |
| # GDB does not yet support this feature |
| gdb_test "whatis one_var" "type = inttype_one" \ |
| "whatis one_var (known failure in gdb 4.10)" |
| # But do make sure that it prints as something reasonable |
| gdb_test "whatis one_var" "type = inttype(|_one)" \ |
| "whatis one_var test 2" |
| |
| gdb_test "whatis two_var" "type = inttype_two" \ |
| "whatis two_var (known failure in gdb 4.10)" |
| # But do make sure that it prints as something reasonable |
| gdb_test "whatis two_var" "type = inttype(|_two)" \ |
| "whatis two_var test 2" |
| |
| setup_xfail "*-*-*" |
| gdb_test "whatis pointer_to_int_var" "type = int \[*\]" |
| setup_xfail "*-*-*" |
| gdb_test "whatis intp_var" "type = intp" |
| |
| gdb_test "p common0var0" "= 42" |
| # GDB seems to only understand common blocks local to a function. |
| # These variables never get relocated to be relative to the common |
| # block. |
| # I'm not sure whether it is valid to have a common block which |
| # is not local to a function. |
| setup_xfail "*-*-*" |
| gdb_test "p common0var1" "= 24" |
| setup_xfail "*-*-*" |
| gdb_test "p common0var2" "= 22" |
| } |
| |
| proc print_weird_var { var } { |
| global gdb_prompt |
| |
| # Make sure that the variable gets printed out correctly, without |
| # any sort of warning message. |
| gdb_test_multiple "print $var" "variable $var printed property" { |
| -re "^print $var\r*\n.\[0-9\]* = 42.*$gdb_prompt $" { |
| pass "variable $var printed properly" |
| } |
| -re ".*$gdb_prompt $" { |
| fail "variable $var printed properly" |
| } |
| } |
| |
| # Make sure that the stabs did get loaded in a sensible way. |
| # If somehow the stabs got skipped, then the above test can |
| # pass because GDB assumes int for variables without a stab. |
| |
| # This doesn't work because 32=45 doesn't preserve the name in |
| # gdb (as of 14 Sep 93 anyway). |
| #gdb_test "whatis $var" "type = (unsigned int|inttype)" |
| |
| # But the size should be right. |
| gdb_test "print sizeof ($var)" "= 4" |
| } |
| |
| |
| # Don't use gdb_load; it doesn't bitch if the loading produced some |
| # error messages during symbol reading. |
| |
| global target_os |
| set sedscript ${srcdir}/${subdir}/aout.sed |
| set sedoptions "" |
| |
| switch -glob ${target_triplet} { |
| "hppa*-*-*" { |
| set sedscript ${srcdir}/${subdir}/hppa.sed |
| } |
| "mips-*-ecoff" { |
| set sedscript ${srcdir}/${subdir}/ecoff.sed |
| } |
| "powerpc-*-aix*" { |
| set sedscript ${srcdir}/${subdir}/xcoff.sed |
| set sedoptions "-r" |
| } |
| "rs6000-*-aix*" { |
| set sedscript ${srcdir}/${subdir}/xcoff.sed |
| set sedoptions "-r" |
| } |
| "*-*-aout" { |
| set sedscript ${srcdir}/${subdir}/aout.sed |
| } |
| "*-*-xcoff" { |
| set sedscript ${srcdir}/${subdir}/xcoff.sed |
| set sedoptions "-r" |
| } |
| "alpha-*-*" { |
| set sedscript ${srcdir}/${subdir}/ecoff.sed |
| } |
| } |
| |
| # Hope this is a Unix box. |
| set exec_output [remote_exec build "sed" "${sedoptions} -f ${sedscript}" "${srcdir}/${subdir}/weird.def" "${srcfile}"] |
| if { [lindex $exec_output 0] != 0 } { |
| perror "Couldn't make test case. $exec_output" |
| return -1 |
| } |
| |
| if { [gdb_compile "${srcfile}" "${binfile}" object ""] != "" } { |
| untested weird.exp |
| return -1 |
| } |
| |
| remote_file build delete ${srcfile} |
| |
| # Start with a fresh gdb |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| |
| set binfile [remote_download host ${binfile} object.o] |
| send_gdb "file $binfile\n" |
| # If $binfile is very long, a \r (but not a \n) will echo in the |
| # middle of the echo of the command. So to match the echo, we |
| # would like to match anything not containing \n |
| # (we would prefer to be sure not to match any warning message). |
| # But \[^\n\]* doesn't seem to work, so instead use the heuristic |
| # that a filename won't contain a space and a warning message will. |
| # But spaces following by backspaces aren't really spaces. |
| gdb_expect 60 { |
| -re "^file (\[^ \]| +\008)*\r*\n" { |
| exp_continue |
| } |
| -re "A program is being debugged already.\[\r\n\]+Are you sure you want to change the file\\? \\(y or n\\)" { |
| send_gdb "y\n" |
| exp_continue |
| } |
| -re "^Reading symbols from .*$binfile\\.\\.\\.done\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)\r\n$gdb_prompt $" { |
| pass "weirdx.o read without error" |
| } |
| -re ".*$gdb_prompt $" { |
| fail "Errors reading weirdx.o" |
| } |
| timeout { |
| perror "couldn't load $binfile into $GDB (timed out)." |
| return -1 |
| } |
| eof { fail "(eof) cannot read weirdx.o" } |
| } |
| |
| do_tests |
| |
| remote_file host delete ${binfile} |
| |
| return 0 |