xref: /illumos-gate/usr/src/tools/smatch/src/gdbhelpers (revision c85f09cc)
1
2# Don't forget to rebuild sparse with uncommented debug options
3# in the Makefile. Also, gcc 3 is known to screw up with the
4# cpp macros in the debugging info.
5
6
7# If a gdb_show_* function is running at a non-zero recursion
8# level, only a short summary is shown, preventing further
9# recursion. Also note that gdb has only one, global, scope
10# for variables, so we need to be careful with recursions.
11
12
13set $showing_token = 0
14set $showing_ident = 0
15set $showing_symbol = 0
16
17set $ntabs = 0
18
19define gdb_tabs
20	set $tmp = $ntabs
21	while ($tmp--)
22		printf "\t"
23	end
24end
25
26
27# Ptr list handling
28define ptr_entry
29	set $ptr = $arg0
30	set $index = $arg1
31	set $entry = &($arg2)
32
33	set *($entry) = (void *) (~3UL & (unsigned long)$ptr->list[$index])
34end
35
36
37# Ptr list looping skeleton
38define gdb_ptr_list_for_each
39
40	set $my_head = (struct ptr_list *) $arg0
41	set $my_list = $my_head
42
43
44	if ($my_head)
45		while (1)
46			set $my_nr = 0
47			while ($my_nr < $my_list->nr)
48
49				# Put your iterator code here
50				set $my_nr++
51			end
52
53			if (($my_list = $my_list->next) == $my_head)
54				loop_break
55			end
56		end
57	end
58end
59
60# Show symbols in a symbol_list. Non-recursive
61define gdb_ptr_list_for_each_show_symbol
62
63	set $my_head = (struct ptr_list *) $arg0
64	set $my_list = $my_head
65
66
67	if ($my_head)
68		while (1)
69			set $my_nr = 0
70			while ($my_nr < ($my_list)->nr)
71				set $my_symbol = (struct symbol *) ((~3UL) & (unsigned long)($my_list)->list[$my_nr])
72				gdb_show_symbol($my_symbol)
73
74				set $my_nr++
75			end
76
77			set $my_list = ($my_list)->next
78			if ($my_list == $my_head)
79				loop_break
80			end
81		end
82	end
83end
84
85
86#define gdb_show_statement
87
88
89# Recursive
90define gdb_show_ctype
91	printf "modifiers: "
92	if ($arg0->modifiers & MOD_AUTO)
93		printf "MOD_AUTO "
94	end
95	if ($arg0->modifiers & MOD_REGISTER)
96		printf "MOD_REGISTER "
97	end
98	if ($arg0->modifiers & MOD_STATIC)
99		printf "MOD_STATIC "
100	end
101	if ($arg0->modifiers & MOD_EXTERN)
102		printf "MOD_EXTERN "
103	end
104	if ($arg0->modifiers & MOD_CONST)
105		printf "MOD_CONST "
106	end
107	if ($arg0->modifiers & MOD_VOLATILE)
108		printf "MOD_VOLATILE "
109	end
110	if ($arg0->modifiers & MOD_RESTRICT)
111		printf "MOD_RESTRICT "
112	end
113	if ($arg0->modifiers & MOD_ATOMIC)
114		printf "MOD_ATOMIC "
115	end
116	if ($arg0->modifiers & MOD_SIGNED)
117		printf "MOD_SIGNED "
118	end
119	if ($arg0->modifiers & MOD_UNSIGNED)
120		printf "MOD_UNSIGNED "
121	end
122	if ($arg0->modifiers & MOD_CHAR)
123		printf "MOD_CHAR "
124	end
125	if ($arg0->modifiers & MOD_SHORT)
126		printf "MOD_SHORT "
127	end
128	if ($arg0->modifiers & MOD_LONG)
129		printf "MOD_LONG "
130	end
131	if ($arg0->modifiers & MOD_LONGLONG)
132		printf "MOD_LONGLONG "
133	end
134	if ($arg0->modifiers & MOD_LONGLONGLONG)
135		printf "MOD_LONGLONGLONG "
136	end
137	if ($arg0->modifiers & MOD_INLINE)
138		printf "MOD_INLINE "
139	end
140	if ($arg0->modifiers & MOD_ADDRESSABLE)
141		printf "MOD_ADDRESSABLE "
142	end
143	if ($arg0->modifiers & MOD_NOCAST)
144		printf "MOD_NOCAST "
145	end
146	if ($arg0->modifiers & MOD_NODEREF)
147		printf "MOD_NODEREF "
148	end
149	if ($arg0->modifiers & MOD_TOPLEVEL)
150		printf "MOD_TOPLEVEL "
151	end
152	if ($arg0->modifiers & MOD_ASSIGNED)
153		printf "MOD_ASSIGNED "
154	end
155	if ($arg0->modifiers & MOD_TYPE)
156		printf "MOD_TYPE "
157	end
158	if ($arg0->modifiers & MOD_SAFE)
159		printf "MOD_SAFE "
160	end
161	if ($arg0->modifiers & MOD_USERTYPE)
162		printf "MOD_USERTYPE "
163	end
164	if ($arg0->modifiers & MOD_EXPLICITLY_SIGNED)
165		printf "MOD_EXPLICITLY_SIGNED"
166	end
167	if ($arg0->modifiers & MOD_BITWISE)
168		printf "MOD_BITWISE "
169	end
170	if (!$arg0->modifiers)
171		printf "0"
172	end
173
174	printf ", alignment = %d", $arg0->alignment
175	if ($arg0->as)
176		printf ", address_space = %d", $arg0->as
177	end
178	printf "\n"
179
180
181	set $ntabs++
182	if ($arg0->base_type)
183		gdb_tabs
184		printf "base_type = "
185		gdb_show_symbol($arg0->base_type)
186	end
187
188	set $ntabs--
189
190
191end
192
193define gdb_show_symbol
194	printf "(%x) type = ", $arg0
195	output $arg0->type
196	printf ", namespace = "
197	output $arg0->namespace
198	if ($arg0->ident)
199		printf ", ident = %s\n", show_ident($arg0->ident)
200	else
201		printf ", ident = NULL\n"
202	end
203
204#	print "zz"
205
206	gdb_tabs
207	printf "dump:\n"
208	call show_symbol($arg0)
209
210	set $ntabs++
211	if ($arg0->namespace == NS_SYMBOL)
212		gdb_tabs
213		printf "ctype = "
214		gdb_show_ctype(&($arg0->ctype))
215	end
216	set $ntabs--
217end
218
219
220# non-recursive
221define gdb_show_symbols_next_id
222	set $sym = $arg0
223	printf "{\n"
224	set $ntabs++
225	while ($sym)
226		gdb_tabs
227		printf "symbol = "
228		gdb_show_symbol($sym)
229		set $sym = $sym->next_id
230	end
231	set $ntabs--
232	gdb_tabs
233	printf "}\n"
234end
235
236define gdb_show_ident
237	if ($arg0)
238		printf "(%p) '%s'\n", $arg0, show_ident($arg0)
239	else
240		printf "NULL\n"
241	end
242
243	if (! $showing_ident)
244		set $showing_ident = 1
245		set $ntabs++
246
247		set $ident = $arg0
248
249		if ($ident->symbols)
250			gdb_tabs
251			printf "symbols = "
252			gdb_show_symbols_next_id($ident->symbols)
253		end
254
255		set $ntabs--
256		set $showing_ident = 0
257	end
258end
259
260define gdb_show_token
261	printf "%p: '%s', type = ", $arg0, show_token($arg0)
262	output (enum token_type) ($arg0)->pos.type
263	printf "\n"
264
265	if (! $showing_token)
266		set $showing_token = 1
267		set $ntabs++
268
269		set $token = $arg0
270
271		if ($token->pos.type == TOKEN_IDENT)
272			gdb_tabs
273			printf "ident = "
274			gdb_show_ident $token.ident
275		end
276
277		if ($token->pos.type == TOKEN_MACRO_ARGUMENT)
278			gdb_tabs
279			printf "argnum = %d\n", $token->argnum
280		end
281
282		if ($token->pos.type == TOKEN_SPECIAL)
283			gdb_tabs
284			printf "special = \"%s\"\n", show_special($token.special)
285		end
286
287		set $ntabs--
288		set $showing_token = 0
289	end
290end
291
292# non-recursive
293define gdb_show_tokens
294	set $t = $arg0
295	printf "{\n"
296	set $ntabs++
297	while ($t != &eof_token_entry)
298		gdb_tabs
299		printf "token = "
300		gdb_show_token($t)
301		set $t = ($t)->next
302	end
303	set $ntabs--
304	gdb_tabs
305	printf "}\n"
306end
307
308