aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl')
-rw-r--r--gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl184
1 files changed, 184 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl b/gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl
new file mode 100644
index 0000000..f740961
--- /dev/null
+++ b/gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl
@@ -0,0 +1,184 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2018-2020 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/>.
+
+# 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
+}
+
+set int_types { tc ts ti tl tll }
+set float_types { tf td tld }
+set complex_types { tfc tdc tldc }
+
+set compile_flags {debug}
+if [support_complex_tests] {
+ lappend compile_flags "additional_flags=-DTEST_COMPLEX"
+ lappend compile_flags "additional_flags=-Wno-psabi"
+}
+
+# Given N (0..25), return the corresponding alphabetic letter in upper
+# case.
+
+proc I2A { n } {
+ return [string range "ABCDEFGHIJKLMNOPQRSTUVWXYZ" $n $n]
+}
+
+# Compile a variant of nested-structs.c using TYPES to specify the
+# types of the struct fields within the source. Run up to main.
+# Also updates the global "testfile" to reflect the most recent build.
+
+proc start_nested_structs_test { lang types } {
+ global testfile
+ global srcfile
+ global binfile
+ global subdir
+ global srcdir
+ global compile_flags
+
+ standard_testfile infcall-nested-structs.c
+
+ # Create the additional flags
+ set flags $compile_flags
+ lappend flags $lang
+ lappend flags "additional_flags=-O2"
+
+ for {set n 0} {$n<[llength ${types}]} {incr n} {
+ set m [I2A ${n}]
+ set t [lindex ${types} $n]
+ lappend flags "additional_flags=-Dt${m}=${t}"
+ append testfile "-" "$t"
+ }
+
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "${flags}"] != "" } {
+ unresolved "failed to compile"
+ return 0
+ }
+
+ # Start with a fresh gdb.
+ clean_restart ${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 print pretty off"
+ gdb_test_no_output "set width 0"
+ gdb_test_no_output "set print elements 300"
+
+ # Advance to main
+ if { ![runto_main] } then {
+ fail "can't run to main"
+ return 0
+ }
+
+ # Now continue forward to a suitable location to run the tests.
+ # Some targets only enable the FPU on first use, so ensure that we
+ # have used the FPU before we make calls from GDB to code that
+ # could use the FPU.
+ gdb_breakpoint [gdb_get_line_number "Break Here"] temporary
+ gdb_continue_to_breakpoint "breakpt" ".* Break Here\\. .*"
+
+ return 1
+}
+
+# Assuming GDB is stopped at main within a test binary, run some tests
+# passing structures, and reading return value structures.
+
+proc run_tests { lang types } {
+ global gdb_prompt
+
+ foreach {name} {struct_01_01 struct_01_02 struct_01_03 struct_01_04
+ struct_02_01 struct_02_02 struct_02_03 struct_02_04
+ struct_04_01 struct_04_02 struct_04_03 struct_04_04
+ struct_05_01 struct_05_02 struct_05_03 struct_05_04
+ struct_static_02_01 struct_static_02_02 struct_static_02_03 struct_static_02_04
+ struct_static_04_01 struct_static_04_02 struct_static_04_03 struct_static_04_04
+ struct_static_06_01 struct_static_06_02 struct_static_06_03 struct_static_06_04} {
+
+ # Only run static member tests on C++
+ if { $lang == "c" && [regexp "static" $name match] } {
+ continue
+ }
+
+ gdb_test "p/d check_arg_${name} (ref_val_${name})" "= 1"
+
+ set refval [ get_valueof "" "ref_val_${name}" "" ]
+ verbose -log "Refval: ${refval}"
+
+ set test "check return value ${name}"
+ if { ${refval} != "" } {
+
+ set answer [ get_valueof "" "rtn_str_${name} ()" "XXXX"]
+ verbose -log "Answer: ${answer}"
+
+ gdb_assert [string eq ${answer} ${refval}] ${test}
+ } else {
+ unresolved $test
+ }
+ }
+}
+
+# Set up a test prefix, compile the test binary, run to main, and then
+# run some tests.
+
+proc start_gdb_and_run_tests { lang types } {
+ set prefix "types"
+
+ foreach t $types {
+ append prefix "-" "${t}"
+ }
+
+ with_test_prefix $prefix {
+ if { [start_nested_structs_test $lang $types] } {
+ run_tests $lang $prefix
+ }
+ }
+}
+
+foreach ta $int_types {
+ start_gdb_and_run_tests $lang $ta
+}
+
+if [support_complex_tests] {
+ foreach ta $complex_types {
+ start_gdb_and_run_tests $lang $ta
+ }
+}
+
+if ![gdb_skip_float_test] {
+ foreach ta $float_types {
+ start_gdb_and_run_tests $lang $ta
+ }
+
+ foreach ta $int_types {
+ foreach tb $float_types {
+ start_gdb_and_run_tests $lang [list $ta $tb]
+ }
+ }
+
+ foreach ta $float_types {
+ foreach tb $int_types {
+ start_gdb_and_run_tests $lang [list $ta $tb]
+ }
+
+ foreach tb $float_types {
+ start_gdb_and_run_tests $lang [list $ta $tb]
+ }
+ }
+}