1 /* This testcase is part of GDB, the GNU debugger.
3 Copyright 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 /* Test program partial trace data visualization. */
26 typedef struct TEST_STRUCT
{
38 struct small_struct_b
: public small_struct
42 typedef int test_array
[4];
44 /* Global variables to be collected. */
50 test_struct globalstruct
;
53 small_struct g_smallstruct
;
54 small_struct_b g_smallstruct_b
;
58 const char g_const_string
[] = "hello world";
59 char g_string_unavail
[sizeof (g_const_string
)];
60 char g_string_partial
[sizeof (g_const_string
)];
61 const char *g_string_p
;
63 /* Used to check that <unavailable> is not the same as 0 in array
64 element repetitions. */
72 struct tuple tarray
[8];
74 /* Test for overcollection. GDB used to merge memory ranges to
75 collect if they were close enough --- say, collect `a' and 'c'
76 below, and you'd get 'b' as well. This had been presumably done to
77 cater for some target's inefficient trace buffer layout, but it is
78 really not GDB's business to assume how the target manages its
79 buffer. If the target wants to overcollect, that's okay, since it
80 knows what is and what isn't safe to touch (think memory mapped
81 registers), and knows it's buffer layout.
83 The test assumes these three variables are laid out consecutively
84 in memory. Unfortunately, we can't use an array instead, since the
85 agent expression generator does not even do constant folding,
86 meaning that anything that's more complicated than collecting a
87 global will generate an agent expression action to evaluate on the
88 target, instead of a simple "collect memory" action. */
108 static StructA static_struct_a
;
119 StructRef (unsigned int val
) : ref(d
) {}
130 struct StructB struct_b
;
131 struct StructA
StructB::static_struct_a
;
133 StructRef
g_structref(0x12345678);
134 StructRef
*g_structref_p
= &g_structref
;
142 Base(void) { x
= 2; };
145 class Middle
: public virtual Base
151 Middle(void): Base() { y
= 3; };
154 class Derived
: public virtual Middle
{
159 Derived(void): Middle() { z
= 4; };
162 Derived derived_unavail
;
163 Derived derived_partial
;
164 Derived derived_whole
;
169 virtual ~Virtual() {}
172 Virtual virtual_partial
;
173 Virtual
*virtualp
= &virtual_partial
;
175 /* Test functions. */
178 begin () /* called before anything else */
183 end () /* called after everything else */
192 i
+= globalc
+ globali
+ globalf
+ globald
;
193 i
+= globalstruct
.memberc
+ globalstruct
.memberi
;
194 i
+= globalstruct
.memberf
+ globalstruct
.memberd
;
197 return i
; /* set globals_test_func tracepoint here */
201 main (int argc
, char **argv
, char **envp
)
204 test_struct mystruct
;
208 /* Assign collectable values to global variables. */
213 globalstruct
.memberc
= 81;
214 globalstruct
.memberi
= 82;
215 globalstruct
.memberf
= 83.3;
216 globalstruct
.memberd
= 84.4;
217 globalp
= &globalstruct
;
219 for (i
= 0; i
< 15; i
++)
222 mystruct
.memberc
= 101;
223 mystruct
.memberi
= 102;
224 mystruct
.memberf
= 103.3;
225 mystruct
.memberd
= 104.4;
232 memset (&struct_b
, 0xaa, sizeof struct_b
);
233 memset (&struct_b
.static_struct_a
, 0xaa, sizeof struct_b
.static_struct_a
);
234 struct_b
.string
= g_const_string
;
235 memcpy (g_string_unavail
, g_const_string
, sizeof (g_const_string
));
236 memcpy (g_string_partial
, g_const_string
, sizeof (g_const_string
));
237 g_string_p
= g_const_string
;
240 /* Call test functions, so they can be traced and data collected. */
242 i
+= globals_test_func ();
244 /* Set 'em back to zero, so that the collected values will be
245 distinctly different from the "realtime" (end of test) values. */
251 globalstruct
.memberc
= 0;
252 globalstruct
.memberi
= 0;
253 globalstruct
.memberf
= 0;
254 globalstruct
.memberd
= 0;
256 for (i
= 0; i
< 15; i
++)
259 memset (&struct_b
, 0, sizeof struct_b
);
260 memset (&struct_b
.static_struct_a
, 0, sizeof struct_b
.static_struct_a
);
261 struct_b
.string
= NULL
;
262 memset (g_string_unavail
, 0, sizeof (g_string_unavail
));
263 memset (g_string_partial
, 0, sizeof (g_string_partial
));
270 g_structref
.clear ();
271 g_structref_p
= NULL
;