]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.base/infcall-nested-structs.exp.tcl
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / infcall-nested-structs.exp.tcl
1 # This testcase is part of GDB, the GNU debugger.
2
3 # Copyright 2018-2023 Free Software Foundation, Inc.
4
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 # Some targets can't call functions, so don't even bother with this
19 # test.
20
21 if [target_info exists gdb,cannot_call_functions] {
22 unsupported "this target can not call functions"
23 continue
24 }
25
26 set int_types { tc ts ti tl tll }
27 set float_types { tf td tld }
28 set complex_types { tfc tdc tldc }
29
30 set compile_flags {debug}
31 if [support_complex_tests] {
32 lappend compile_flags "additional_flags=-DTEST_COMPLEX"
33 lappend compile_flags "additional_flags=-Wno-psabi"
34 }
35
36 if { $lang == "c++" && [test_compiler_info clang*] } {
37 # Clang rightly deduces that the static member tests are
38 # tautological comparisons, so we need to inhibit that
39 # particular warning in order to build.
40 lappend compile_flags "additional_flags=-Wno-tautological-compare"
41 }
42
43 # Given N (0..25), return the corresponding alphabetic letter in upper
44 # case.
45
46 proc I2A { n } {
47 return [string range "ABCDEFGHIJKLMNOPQRSTUVWXYZ" $n $n]
48 }
49
50 # Compile a variant of nested-structs.c using TYPES to specify the
51 # types of the struct fields within the source. Run up to main.
52 # Also updates the global "testfile" to reflect the most recent build.
53
54 proc start_nested_structs_test { lang types } {
55 global testfile
56 global srcfile
57 global binfile
58 global subdir
59 global srcdir
60 global compile_flags
61
62 standard_testfile infcall-nested-structs.c
63
64 # Create the additional flags
65 set flags $compile_flags
66 lappend flags $lang
67 lappend flags "additional_flags=-O2"
68
69 for {set n 0} {$n<[llength ${types}]} {incr n} {
70 set m [I2A ${n}]
71 set t [lindex ${types} $n]
72 lappend flags "additional_flags=-Dt${m}=${t}"
73 append testfile "-" "$t"
74 }
75
76 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "${flags}"] != "" } {
77 unresolved "failed to compile"
78 return 0
79 }
80
81 # Start with a fresh gdb.
82 clean_restart ${binfile}
83
84 # Make certain that the output is consistent
85 gdb_test_no_output "set print sevenbit-strings"
86 gdb_test_no_output "set print address off"
87 gdb_test_no_output "set print pretty off"
88 gdb_test_no_output "set width 0"
89 gdb_test_no_output "set print elements 300"
90
91 # Advance to main
92 if { ![runto_main] } then {
93 return 0
94 }
95
96 # Now continue forward to a suitable location to run the tests.
97 # Some targets only enable the FPU on first use, so ensure that we
98 # have used the FPU before we make calls from GDB to code that
99 # could use the FPU.
100 gdb_breakpoint [gdb_get_line_number "Break Here"] temporary
101 gdb_continue_to_breakpoint "breakpt" ".* Break Here\\. .*"
102
103 return 1
104 }
105
106 # Assuming GDB is stopped at main within a test binary, run some tests
107 # passing structures, and reading return value structures.
108
109 proc run_tests { lang types } {
110 global gdb_prompt
111
112 foreach {name} {struct_01_01 struct_01_02 struct_01_03 struct_01_04
113 struct_02_01 struct_02_02 struct_02_03 struct_02_04
114 struct_04_01 struct_04_02 struct_04_03 struct_04_04
115 struct_05_01 struct_05_02 struct_05_03 struct_05_04
116 struct_static_02_01 struct_static_02_02 struct_static_02_03 struct_static_02_04
117 struct_static_04_01 struct_static_04_02 struct_static_04_03 struct_static_04_04
118 struct_static_06_01 struct_static_06_02 struct_static_06_03 struct_static_06_04} {
119
120 # Only run static member tests on C++
121 if { $lang == "c" && [regexp "static" $name match] } {
122 continue
123 }
124
125 gdb_test "p/d check_arg_${name} (ref_val_${name})" "= 1"
126
127 set refval [ get_valueof "" "ref_val_${name}" "" ]
128 verbose -log "Refval: ${refval}"
129
130 set test "check return value ${name}"
131 if { ${refval} != "" } {
132
133 set answer [ get_valueof "" "rtn_str_${name} ()" "XXXX"]
134 verbose -log "Answer: ${answer}"
135
136 gdb_assert [string eq ${answer} ${refval}] ${test}
137 } else {
138 unresolved $test
139 }
140 }
141 }
142
143 # Set up a test prefix, compile the test binary, run to main, and then
144 # run some tests.
145
146 proc start_gdb_and_run_tests { lang types } {
147 set prefix "types"
148
149 foreach t $types {
150 append prefix "-" "${t}"
151 }
152
153 with_test_prefix $prefix {
154 if { [start_nested_structs_test $lang $types] } {
155 run_tests $lang $prefix
156 }
157 }
158 }
159
160 foreach ta $int_types {
161 start_gdb_and_run_tests $lang $ta
162 }
163
164 if [support_complex_tests] {
165 foreach ta $complex_types {
166 start_gdb_and_run_tests $lang $ta
167 }
168 }
169
170 if ![gdb_skip_float_test] {
171 foreach ta $float_types {
172 start_gdb_and_run_tests $lang $ta
173 }
174
175 foreach ta $int_types {
176 foreach tb $float_types {
177 start_gdb_and_run_tests $lang [list $ta $tb]
178 }
179 }
180
181 foreach ta $float_types {
182 foreach tb $int_types {
183 start_gdb_and_run_tests $lang [list $ta $tb]
184 }
185
186 foreach tb $float_types {
187 start_gdb_and_run_tests $lang [list $ta $tb]
188 }
189 }
190 }