blob: 256bc993d10ed863fca5a9dcaa15cf3420b591cc [file] [log] [blame]
# Copyright (C) 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu
# Test Apple local commands -file-list-statics and -file-list-globals.
#
# Written by Jim Ingham <jingham@apple.com>
#
# This only tests the "new style" -file, -shlib, etc. form and not the original one.
# Consts are handled differently between C & C++, so we test both languages.
load_lib mi-support.exp
set MIFLAGS "-i=mi1"
gdb_exit
if [mi_gdb_start] {
continue
}
set testfile "file-statics"
set srcfile ${testfile}.c
set second_srcfile more-statics.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "$srcdir/$subdir/$srcfile $srcdir/$subdir/$second_srcfile" "${binfile}" executable debug] != "" } {
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}
mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
# First test some error conditions:
proc test_errors {command} {
append usage_error {\^error,msg="} mi_cmd_ [regsub -all -- - $command _] \
{: Usage: -file FILE -shlib SHLIB VALUES \[-filter FILTER\] \[-constants 0/1\]"}
mi_gdb_test "10-$command" \
"10$usage_error" \
"$command no arguments error"
mi_gdb_test "11-$command -file nofile" \
"11$usage_error" \
"$command only file error"
mi_gdb_test "12-$command -file nofile -shlib noshlib" \
"12$usage_error" \
"$command no values error"
mi_gdb_test "13-$command -file nofile -shlib noshlib -filter nofilter" \
"13$usage_error" \
"$command no values plus filter error"
mi_gdb_test "14-$command -file nofile --no-values -filter nofilter" \
"14$usage_error" \
"$command no shlib error"
mi_gdb_test "15-$command -file --no-values -shlib noshlib -filter nofilter" \
"15$usage_error" \
"$command file argument missing error"
}
# Test file-list-statics
test_errors file-list-statics
# This is annoying, but DWARF lists the statics in the reverse order from stabs
# so we have to test the return in either order.
proc either_way {first second {third {}} {fourth {}}} {
if {[string equal $third ""]} {
return [format {\^done,statics=\[(%s,%s|%s,%s)\]} $first $second $second $first]
} else {
return [format {\^done,statics=\[(%s,%s|%s,%s)\]} $first $second $third $fourth]
}
}
set either_way [either_way {\{name="static_doesnt_match"\}} {\{name="static_int"\}}]
# One test of the old style just to make sure we don't totally break it till we remove it:
mi_gdb_test {30-file-list-statics file-statics.c file-statics --no-values} \
"30$either_way" \
{-file-list-statics: Old style - supply file and shlib, no values}
# These are the new style:
mi_gdb_test {20-file-list-statics -file file-statics.c -shlib file-statics --no-values} \
"20$either_way" \
{-file-list-statics: supply file and shlib, no values}
mi_gdb_test {21-file-list-statics -file file-statics.c -shlib "" --no-values} \
"21$either_way" \
{-file-list-statics: supply file and shlib, no values}
mi_gdb_test {22-file-list-statics -file file-statics.c -shlib file-statics --no-values -filter _int} \
{22\^done,statics=\[\{name="static_doesnt_match"\}\]} \
{-file-list-statics: supply file and shlib, no values, with filter}
mi_gdb_test {23-file-list-statics -file file-statics.c -shlib file-statics --no-values -constants 0} \
"23$either_way" \
{-file-list-statics: supply file and shlib, no values, no constants}
mi_gdb_test {24-file-list-statics -file "" -shlib file-statics --no-values} \
{24\^done,statics=\[]} \
{-file-list-statics: empty file and shlib, no values}
set static_doesnt_match {\{name="static_doesnt_match",type="int",value="8"\}}
set static_int {\{name="static_int",type="int",value="7"\}}
set either_way [either_way $static_doesnt_match $static_int]
mi_gdb_test {21-file-list-statics -file file-statics.c -shlib file-statics --simple-values} \
"21$either_way" \
{-file-list-statics: supply file and shlib, no simple}
set static_doesnt_match {varobj=\{exp="static_doesnt_match",value="8",name="var%d",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int",in_scope="true",block_start_addr="no block",block_end_addr="no block"\}}
set static_int {varobj=\{exp="static_int",value="7",name="var%d",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int",in_scope="true",block_start_addr="no block",block_end_addr="no block"\}}
set static_doesnt_match_1 [format $static_doesnt_match 1]
set static_doesnt_match_2 [format $static_doesnt_match 2]
set static_int_1 [format $static_int 1]
set static_int_2 [format $static_int 2]
set either_way [either_way $static_doesnt_match_1 $static_int_2 $static_int_1 $static_doesnt_match_2]
mi_gdb_test {21-file-list-statics -file file-statics.c -shlib file-statics --make-varobjs} \
"21$either_way" \
{-file-list-statics: supply file and shlib, make varobj}
# Now test file-list-globals
test_errors file-list-globals
# This is the old style again:
mi_gdb_test {49-file-list-globals file-statics.c file-statics --no-values} \
{49\^done,globals=\[\{name="const_char"\},\{name="global_int"\}\]} \
{-file-list-globals: Old style - supply file and shlib, no values}
# These are the new style:
mi_gdb_test {50-file-list-globals -file file-statics.c -shlib file-statics --no-values} \
{50\^done,globals=\[\{name="const_doesnt_match"\},\{name="const_int"\},\{name="const_char"\},\{name="global_int"\}\]} \
{-file-list-globals: supply file and shlib, no values}
mi_gdb_test {51-file-list-globals -file file-statics.c -shlib file-statics --no-values -filter _int} \
{51\^done,globals=\[\{name="const_doesnt_match"\},\{name="const_char"\}\]} \
{-file-list-globals: supply file and shlib, no values}
mi_gdb_test {52-file-list-globals -file file-statics.c -shlib file-statics --no-values -constants 0} \
{52\^done,globals=\[\{name="const_char"\},\{name="global_int"\}\]} \
{-file-list-globals: supply file and shlib, no values, no constants}
mi_gdb_test {53-file-list-globals -file file-statics.c -shlib file-statics --no-values} \
{53\^done,globals=\[\{name="const_doesnt_match"\},\{name="const_int"\},\{name="const_char"\},\{name="global_int"\}\]} \
{-file-list-globals: supply file and shlib, no values}
mi_gdb_test {54-file-list-globals -file file-statics.c -shlib file-statics --simple-values} \
{54\^done,globals=\[\{name="const_doesnt_match",type="const int",value="6"\},\{name="const_int",type="const int",value="5"\},\{name="const_char",type="const char \*",value="0x([0-9a-f]+) \\"I am a constant\\""\},\{name="global_int",type="int",value="6"\}\]} \
{-file-list-globals: supply file and shlib, simple values}
mi_gdb_test {55-file-list-globals -file "" -shlib file-statics --no-values} \
{55\^done,.*file=\[filename=".*/more-statics.c",globals=\[\{name="second_const_int"\},\{name="second_const_char"\},\{name="second_const_doesnt_match"\},\{name="second_global_int"\}\]\],.*file=\[filename=".*/file-statics.c",globals=\[\{name="const_doesnt_match"\},\{name="const_int"\},\{name="const_char"\},\{name="global_int"\}\]\].*} \
{-file-list-globals: all files, supply shlib, no values}
# Now test a few C++ cases.
gdb_exit
if [mi_gdb_start] {
continue
}
set testfile "file-statics-cpp"
set srcfile ${testfile}.cpp
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "$srcdir/$subdir/$srcfile" "${binfile}" executable {debug c++}] != "" } {
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}
mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
mi_gdb_test {61-file-list-globals -file file-statics-cpp.cpp -shlib file-statics-cpp --simple-values} \
{61\^done,globals=\[\{name=\"Test::myVar\",type=\"int\",value=\"0\"\}\]} \
{-file-list-globals: c++ - supply file and shlib, simple values}
mi_gdb_test {62-file-list-globals -file file-statics-cpp.cpp -shlib file-statics-cpp --make-varobjs} \
{62\^done,globals=\[varobj={exp=\"Test::myVar\",value=\"0\",name=\"var1\",numchild=\"0\",type=\"int\",typecode=\"INT\",dynamic_type=\"\",resolved_type=\"int\",in_scope=\"true\",block_start_addr=\"no block\",block_end_addr=\"no block\"}\]} \
{-file-list-globals: c++ - supply file and shlib, make varobjs}
mi_gdb_test {71-file-list-statics -file file-statics-cpp.cpp -shlib file-statics-cpp --simple-values} \
{71\^done,statics=\[\{name=\"const_int\",type=\"const int\",value=\"5\"\}\]} \
{-file-list-statics: c++ - supply file and shlib, simple values}
mi_gdb_test {72-file-list-statics -file file-statics-cpp.cpp -shlib file-statics-cpp --make-varobjs} \
{72\^done,statics=\[varobj={exp=\"const_int\",value=\"5\",name=\"var2\",numchild=\"0\",type=\"const int\",typecode=\"INT\",dynamic_type=\"\",resolved_type=\"const int\",in_scope=\"true\",block_start_addr=\"no block\",block_end_addr=\"no block\"}\]} \
{-file-list-statics: c++ - supply file and shlib, make varobjs}