gdb/
[deliverable/binutils-gdb.git] / gdb / macrocmd.c
1 /* C preprocessor macro expansion commands for GDB.
2 Copyright (C) 2002, 2007-2012 Free Software Foundation, Inc.
3 Contributed by Red Hat, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20
21 #include "defs.h"
22 #include "macrotab.h"
23 #include "macroexp.h"
24 #include "macroscope.h"
25 #include "cli/cli-utils.h"
26 #include "command.h"
27 #include "gdbcmd.h"
28 #include "gdb_string.h"
29
30 \f
31 /* The `macro' prefix command. */
32
33 static struct cmd_list_element *macrolist;
34
35 static void
36 macro_command (char *arg, int from_tty)
37 {
38 printf_unfiltered
39 ("\"macro\" must be followed by the name of a macro command.\n");
40 help_list (macrolist, "macro ", -1, gdb_stdout);
41 }
42
43
44 \f
45 /* Macro expansion commands. */
46
47
48 /* Prints an informational message regarding the lack of macro information. */
49 static void macro_inform_no_debuginfo()
50 {
51 fputs_filtered ("GDB has no preprocessor macro information for "
52 "that code.",
53 gdb_stdout);
54 }
55
56 static void
57 macro_expand_command (char *exp, int from_tty)
58 {
59 struct macro_scope *ms = NULL;
60 char *expanded = NULL;
61 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
62
63 make_cleanup (free_current_contents, &expanded);
64
65 /* You know, when the user doesn't specify any expression, it would be
66 really cool if this defaulted to the last expression evaluated.
67 Then it would be easy to ask, "Hey, what did I just evaluate?" But
68 at the moment, the `print' commands don't save the last expression
69 evaluated, just its value. */
70 if (! exp || ! *exp)
71 error (_("You must follow the `macro expand' command with the"
72 " expression you\n"
73 "want to expand."));
74
75 ms = default_macro_scope ();
76 if (ms)
77 {
78 expanded = macro_expand (exp, standard_macro_lookup, ms);
79 fputs_filtered ("expands to: ", gdb_stdout);
80 fputs_filtered (expanded, gdb_stdout);
81 fputs_filtered ("\n", gdb_stdout);
82 }
83 else
84 macro_inform_no_debuginfo ();
85
86 do_cleanups (cleanup_chain);
87 return;
88 }
89
90
91 static void
92 macro_expand_once_command (char *exp, int from_tty)
93 {
94 struct macro_scope *ms = NULL;
95 char *expanded = NULL;
96 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
97 make_cleanup (free_current_contents, &expanded);
98
99 /* You know, when the user doesn't specify any expression, it would be
100 really cool if this defaulted to the last expression evaluated.
101 And it should set the once-expanded text as the new `last
102 expression'. That way, you could just hit return over and over and
103 see the expression expanded one level at a time. */
104 if (! exp || ! *exp)
105 error (_("You must follow the `macro expand-once' command with"
106 " the expression\n"
107 "you want to expand."));
108
109 ms = default_macro_scope ();
110 if (ms)
111 {
112 expanded = macro_expand_once (exp, standard_macro_lookup, ms);
113 fputs_filtered ("expands to: ", gdb_stdout);
114 fputs_filtered (expanded, gdb_stdout);
115 fputs_filtered ("\n", gdb_stdout);
116 }
117 else
118 macro_inform_no_debuginfo ();
119
120 do_cleanups (cleanup_chain);
121 return;
122 }
123
124 /* Outputs the include path of a macro starting at FILE and LINE to STREAM.
125
126 Care should be taken that this function does not cause any lookups into
127 the splay tree so that it can be safely used while iterating. */
128 static void
129 show_pp_source_pos (struct ui_file *stream,
130 struct macro_source_file *file,
131 int line)
132 {
133 fprintf_filtered (stream, "%s:%d\n", file->filename, line);
134
135 while (file->included_by)
136 {
137 fprintf_filtered (gdb_stdout, " included at %s:%d\n",
138 file->included_by->filename,
139 file->included_at_line);
140 file = file->included_by;
141 }
142 }
143
144 /* Outputs a macro for human consumption, detailing the include path
145 and macro definition. NAME is the name of the macro.
146 D the definition. FILE the start of the include path, and LINE the
147 line number in FILE.
148
149 Care should be taken that this function does not cause any lookups into
150 the splay tree so that it can be safely used while iterating. */
151 static void
152 print_macro_definition (const char *name,
153 const struct macro_definition *d,
154 struct macro_source_file *file,
155 int line)
156 {
157 fprintf_filtered (gdb_stdout, "Defined at ");
158 show_pp_source_pos (gdb_stdout, file, line);
159
160 if (line != 0)
161 fprintf_filtered (gdb_stdout, "#define %s", name);
162 else
163 fprintf_filtered (gdb_stdout, "-D%s", name);
164
165 if (d->kind == macro_function_like)
166 {
167 int i;
168
169 fputs_filtered ("(", gdb_stdout);
170 for (i = 0; i < d->argc; i++)
171 {
172 fputs_filtered (d->argv[i], gdb_stdout);
173 if (i + 1 < d->argc)
174 fputs_filtered (", ", gdb_stdout);
175 }
176 fputs_filtered (")", gdb_stdout);
177 }
178
179 if (line != 0)
180 fprintf_filtered (gdb_stdout, " %s\n", d->replacement);
181 else
182 fprintf_filtered (gdb_stdout, "=%s\n", d->replacement);
183 }
184
185 /* A callback function for usage with macro_for_each and friends.
186 If USER_DATA is null all macros will be printed.
187 Otherwise USER_DATA is considered to be a string, printing
188 only macros who's NAME matches USER_DATA. Other arguments are
189 routed to print_macro_definition. */
190 static void
191 print_macro_callback (const char *name, const struct macro_definition *macro,
192 struct macro_source_file *source, int line,
193 void *user_data)
194 {
195 if (! user_data || strcmp (user_data, name) == 0)
196 print_macro_definition (name, macro, source, line);
197 }
198
199 /* The implementation of the `info macro' command. */
200 static void
201 info_macro_command (char *args, int from_tty)
202 {
203 struct macro_scope *ms = NULL;
204 struct cleanup *cleanup_chain;
205 char *name;
206 int show_all_macros_named = 0;
207 char *arg_start = args;
208 int processing_args = 1;
209
210 while (processing_args
211 && arg_start && *arg_start == '-' && *arg_start != '\0')
212 {
213 char *p = skip_to_space (arg_start);
214
215 if (strncmp (arg_start, "-a", p - arg_start) == 0
216 || strncmp (arg_start, "-all", p - arg_start) == 0)
217 show_all_macros_named = 1;
218 else if (strncmp (arg_start, "--", p - arg_start) == 0)
219 /* Our macro support seems rather C specific but this would
220 seem necessary for languages allowing - in macro names.
221 e.g. Scheme's (defmacro ->foo () "bar\n") */
222 processing_args = 0;
223 else
224 {
225 /* Relies on modified 'args' not making it in to history */
226 *p = '\0';
227 error (_("Unrecognized option '%s' to info macro command. "
228 "Try \"help info macro\"."), arg_start);
229 }
230
231 arg_start = skip_spaces (p);
232 }
233
234 name = arg_start;
235
236 if (! name || ! *name)
237 error (_("You must follow the `info macro' command with the name"
238 " of the macro\n"
239 "whose definition you want to see."));
240
241 ms = default_macro_scope ();
242 cleanup_chain = make_cleanup (free_current_contents, &ms);
243
244 if (! ms)
245 macro_inform_no_debuginfo ();
246 else if (show_all_macros_named)
247 macro_for_each (ms->file->table, print_macro_callback, name);
248 else
249 {
250 struct macro_definition *d;
251
252 d = macro_lookup_definition (ms->file, ms->line, name);
253 if (d)
254 {
255 int line;
256 struct macro_source_file *file
257 = macro_definition_location (ms->file, ms->line, name, &line);
258
259 print_macro_definition (name, d, file, line);
260 }
261 else
262 {
263 fprintf_filtered (gdb_stdout,
264 "The symbol `%s' has no definition as a C/C++"
265 " preprocessor macro\n"
266 "at ", name);
267 show_pp_source_pos (gdb_stdout, ms->file, ms->line);
268 }
269 }
270
271 do_cleanups (cleanup_chain);
272 }
273
274 /* Implementation of the "info macros" command. */
275 static void
276 info_macros_command (char *args, int from_tty)
277 {
278 struct macro_scope *ms = NULL;
279 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
280
281 if (args == NULL)
282 ms = default_macro_scope ();
283 else
284 {
285 struct symtabs_and_lines sals = decode_line_spec (args, 0);
286
287 if (sals.nelts)
288 ms = sal_macro_scope (sals.sals[0]);
289 }
290
291 if (! ms || ! ms->file || ! ms->file->table)
292 macro_inform_no_debuginfo ();
293 else
294 macro_for_each_in_scope (ms->file, ms->line, print_macro_callback, NULL);
295
296 do_cleanups (cleanup_chain);
297 }
298
299 \f
300 /* User-defined macros. */
301
302 static void
303 skip_ws (char **expp)
304 {
305 while (macro_is_whitespace (**expp))
306 ++*expp;
307 }
308
309 /* Try to find the bounds of an identifier. If an identifier is
310 found, returns a newly allocated string; otherwise returns NULL.
311 EXPP is a pointer to an input string; it is updated to point to the
312 text following the identifier. If IS_PARAMETER is true, this
313 function will also allow "..." forms as used in varargs macro
314 parameters. */
315
316 static char *
317 extract_identifier (char **expp, int is_parameter)
318 {
319 char *result;
320 char *p = *expp;
321 unsigned int len;
322
323 if (is_parameter && !strncmp (p, "...", 3))
324 {
325 /* Ok. */
326 }
327 else
328 {
329 if (! *p || ! macro_is_identifier_nondigit (*p))
330 return NULL;
331 for (++p;
332 *p && (macro_is_identifier_nondigit (*p) || macro_is_digit (*p));
333 ++p)
334 ;
335 }
336
337 if (is_parameter && !strncmp (p, "...", 3))
338 p += 3;
339
340 len = p - *expp;
341 result = (char *) xmalloc (len + 1);
342 memcpy (result, *expp, len);
343 result[len] = '\0';
344 *expp += len;
345 return result;
346 }
347
348 /* Helper function to clean up a temporarily-constructed macro object.
349 This assumes that the contents were all allocated with xmalloc. */
350 static void
351 free_macro_definition_ptr (void *ptr)
352 {
353 int i;
354 struct macro_definition *loc = (struct macro_definition *) ptr;
355
356 for (i = 0; i < loc->argc; ++i)
357 xfree ((char *) loc->argv[i]);
358 xfree ((char *) loc->argv);
359 /* Note that the 'replacement' field is not allocated. */
360 }
361
362 static void
363 macro_define_command (char *exp, int from_tty)
364 {
365 struct macro_definition new_macro;
366 char *name = NULL;
367 struct cleanup *cleanup_chain;
368
369 if (!exp)
370 error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]"));
371
372 cleanup_chain = make_cleanup (free_macro_definition_ptr, &new_macro);
373 make_cleanup (free_current_contents, &name);
374
375 memset (&new_macro, 0, sizeof (struct macro_definition));
376
377 skip_ws (&exp);
378 name = extract_identifier (&exp, 0);
379 if (! name)
380 error (_("Invalid macro name."));
381 if (*exp == '(')
382 {
383 /* Function-like macro. */
384 int alloced = 5;
385 char **argv = (char **) xmalloc (alloced * sizeof (char *));
386
387 new_macro.kind = macro_function_like;
388 new_macro.argc = 0;
389 new_macro.argv = (const char * const *) argv;
390
391 /* Skip the '(' and whitespace. */
392 ++exp;
393 skip_ws (&exp);
394
395 while (*exp != ')')
396 {
397 int i;
398
399 if (new_macro.argc == alloced)
400 {
401 alloced *= 2;
402 argv = (char **) xrealloc (argv, alloced * sizeof (char *));
403 /* Must update new_macro as well... */
404 new_macro.argv = (const char * const *) argv;
405 }
406 argv[new_macro.argc] = extract_identifier (&exp, 1);
407 if (! argv[new_macro.argc])
408 error (_("Macro is missing an argument."));
409 ++new_macro.argc;
410
411 for (i = new_macro.argc - 2; i >= 0; --i)
412 {
413 if (! strcmp (argv[i], argv[new_macro.argc - 1]))
414 error (_("Two macro arguments with identical names."));
415 }
416
417 skip_ws (&exp);
418 if (*exp == ',')
419 {
420 ++exp;
421 skip_ws (&exp);
422 }
423 else if (*exp != ')')
424 error (_("',' or ')' expected at end of macro arguments."));
425 }
426 /* Skip the closing paren. */
427 ++exp;
428 skip_ws (&exp);
429
430 macro_define_function (macro_main (macro_user_macros), -1, name,
431 new_macro.argc, (const char **) new_macro.argv,
432 exp);
433 }
434 else
435 {
436 skip_ws (&exp);
437 macro_define_object (macro_main (macro_user_macros), -1, name, exp);
438 }
439
440 do_cleanups (cleanup_chain);
441 }
442
443
444 static void
445 macro_undef_command (char *exp, int from_tty)
446 {
447 char *name;
448
449 if (!exp)
450 error (_("usage: macro undef NAME"));
451
452 skip_ws (&exp);
453 name = extract_identifier (&exp, 0);
454 if (! name)
455 error (_("Invalid macro name."));
456 macro_undef (macro_main (macro_user_macros), -1, name);
457 xfree (name);
458 }
459
460
461 static void
462 print_one_macro (const char *name, const struct macro_definition *macro,
463 struct macro_source_file *source, int line,
464 void *ignore)
465 {
466 fprintf_filtered (gdb_stdout, "macro define %s", name);
467 if (macro->kind == macro_function_like)
468 {
469 int i;
470
471 fprintf_filtered (gdb_stdout, "(");
472 for (i = 0; i < macro->argc; ++i)
473 fprintf_filtered (gdb_stdout, "%s%s", (i > 0) ? ", " : "",
474 macro->argv[i]);
475 fprintf_filtered (gdb_stdout, ")");
476 }
477 fprintf_filtered (gdb_stdout, " %s\n", macro->replacement);
478 }
479
480
481 static void
482 macro_list_command (char *exp, int from_tty)
483 {
484 macro_for_each (macro_user_macros, print_one_macro, NULL);
485 }
486
487 \f
488 /* Initializing the `macrocmd' module. */
489
490 extern initialize_file_ftype _initialize_macrocmd; /* -Wmissing-prototypes */
491
492 void
493 _initialize_macrocmd (void)
494 {
495 /* We introduce a new command prefix, `macro', under which we'll put
496 the various commands for working with preprocessor macros. */
497 add_prefix_cmd ("macro", class_info, macro_command,
498 _("Prefix for commands dealing with C preprocessor macros."),
499 &macrolist, "macro ", 0, &cmdlist);
500
501 add_cmd ("expand", no_class, macro_expand_command, _("\
502 Fully expand any C/C++ preprocessor macro invocations in EXPRESSION.\n\
503 Show the expanded expression."),
504 &macrolist);
505 add_alias_cmd ("exp", "expand", no_class, 1, &macrolist);
506 add_cmd ("expand-once", no_class, macro_expand_once_command, _("\
507 Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION.\n\
508 Show the expanded expression.\n\
509 \n\
510 This command differs from `macro expand' in that it only expands macro\n\
511 invocations that appear directly in EXPRESSION; if expanding a macro\n\
512 introduces further macro invocations, those are left unexpanded.\n\
513 \n\
514 `macro expand-once' helps you see how a particular macro expands,\n\
515 whereas `macro expand' shows you how all the macros involved in an\n\
516 expression work together to yield a pre-processed expression."),
517 &macrolist);
518 add_alias_cmd ("exp1", "expand-once", no_class, 1, &macrolist);
519
520 add_cmd ("macro", no_class, info_macro_command,
521 _("Show the definition of MACRO, and it's source location.\n\
522 Usage: info macro [-a|-all] [--] MACRO\n\
523 Options: \n\
524 -a, --all Output all definitions of MACRO in the current compilation\
525 unit.\n\
526 -- Specify the end of arguments and the beginning of the MACRO."),
527
528 &infolist);
529
530 add_cmd ("macros", no_class, info_macros_command,
531 _("Show the definitions of all macros at LINESPEC, or the current \
532 source location.\n\
533 Usage: info macros [LINESPEC]"),
534 &infolist);
535
536 add_cmd ("define", no_class, macro_define_command, _("\
537 Define a new C/C++ preprocessor macro.\n\
538 The GDB command `macro define DEFINITION' is equivalent to placing a\n\
539 preprocessor directive of the form `#define DEFINITION' such that the\n\
540 definition is visible in all the inferior's source files.\n\
541 For example:\n\
542 (gdb) macro define PI (3.1415926)\n\
543 (gdb) macro define MIN(x,y) ((x) < (y) ? (x) : (y))"),
544 &macrolist);
545
546 add_cmd ("undef", no_class, macro_undef_command, _("\
547 Remove the definition of the C/C++ preprocessor macro with the given name."),
548 &macrolist);
549
550 add_cmd ("list", no_class, macro_list_command,
551 _("List all the macros defined using the `macro define' command."),
552 &macrolist);
553 }
This page took 0.057225 seconds and 4 git commands to generate.