binutils/
[binutils-gdb.git] / gdb / macrocmd.c
blobb48c3c92cbc37ddca7f6501c5f3cd75d182850d0
1 /* C preprocessor macro expansion commands for GDB.
2 Copyright (C) 2002-2013 Free Software Foundation, Inc.
3 Contributed by Red Hat, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
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 #include "linespec.h"
32 /* The `macro' prefix command. */
34 static struct cmd_list_element *macrolist;
36 static void
37 macro_command (char *arg, int from_tty)
39 printf_unfiltered
40 ("\"macro\" must be followed by the name of a macro command.\n");
41 help_list (macrolist, "macro ", -1, gdb_stdout);
46 /* Macro expansion commands. */
49 /* Prints an informational message regarding the lack of macro information. */
50 static void
51 macro_inform_no_debuginfo (void)
53 puts_filtered ("GDB has no preprocessor macro information for that code.\n");
56 static void
57 macro_expand_command (char *exp, int from_tty)
59 struct macro_scope *ms = NULL;
60 char *expanded = NULL;
61 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
63 make_cleanup (free_current_contents, &expanded);
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."));
75 ms = default_macro_scope ();
76 if (ms)
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);
83 else
84 macro_inform_no_debuginfo ();
86 do_cleanups (cleanup_chain);
87 return;
91 static void
92 macro_expand_once_command (char *exp, int from_tty)
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);
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."));
109 ms = default_macro_scope ();
110 if (ms)
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);
117 else
118 macro_inform_no_debuginfo ();
120 do_cleanups (cleanup_chain);
121 return;
124 /* Outputs the include path of a macro starting at FILE and LINE to STREAM.
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)
133 char *fullname;
135 fullname = macro_source_fullname (file);
136 fprintf_filtered (stream, "%s:%d\n", fullname, line);
137 xfree (fullname);
139 while (file->included_by)
141 fullname = macro_source_fullname (file->included_by);
142 fprintf_filtered (gdb_stdout, " included at %s:%d\n", fullname,
143 file->included_at_line);
144 xfree (fullname);
145 file = file->included_by;
149 /* Outputs a macro for human consumption, detailing the include path
150 and macro definition. NAME is the name of the macro.
151 D the definition. FILE the start of the include path, and LINE the
152 line number in FILE.
154 Care should be taken that this function does not cause any lookups into
155 the splay tree so that it can be safely used while iterating. */
156 static void
157 print_macro_definition (const char *name,
158 const struct macro_definition *d,
159 struct macro_source_file *file,
160 int line)
162 fprintf_filtered (gdb_stdout, "Defined at ");
163 show_pp_source_pos (gdb_stdout, file, line);
165 if (line != 0)
166 fprintf_filtered (gdb_stdout, "#define %s", name);
167 else
168 fprintf_filtered (gdb_stdout, "-D%s", name);
170 if (d->kind == macro_function_like)
172 int i;
174 fputs_filtered ("(", gdb_stdout);
175 for (i = 0; i < d->argc; i++)
177 fputs_filtered (d->argv[i], gdb_stdout);
178 if (i + 1 < d->argc)
179 fputs_filtered (", ", gdb_stdout);
181 fputs_filtered (")", gdb_stdout);
184 if (line != 0)
185 fprintf_filtered (gdb_stdout, " %s\n", d->replacement);
186 else
187 fprintf_filtered (gdb_stdout, "=%s\n", d->replacement);
190 /* A callback function for usage with macro_for_each and friends.
191 If USER_DATA is null all macros will be printed.
192 Otherwise USER_DATA is considered to be a string, printing
193 only macros who's NAME matches USER_DATA. Other arguments are
194 routed to print_macro_definition. */
195 static void
196 print_macro_callback (const char *name, const struct macro_definition *macro,
197 struct macro_source_file *source, int line,
198 void *user_data)
200 if (! user_data || strcmp (user_data, name) == 0)
201 print_macro_definition (name, macro, source, line);
204 /* The implementation of the `info macro' command. */
205 static void
206 info_macro_command (char *args, int from_tty)
208 struct macro_scope *ms = NULL;
209 struct cleanup *cleanup_chain;
210 char *name;
211 int show_all_macros_named = 0;
212 char *arg_start = args;
213 int processing_args = 1;
215 while (processing_args
216 && arg_start && *arg_start == '-' && *arg_start != '\0')
218 char *p = skip_to_space (arg_start);
220 if (strncmp (arg_start, "-a", p - arg_start) == 0
221 || strncmp (arg_start, "-all", p - arg_start) == 0)
222 show_all_macros_named = 1;
223 else if (strncmp (arg_start, "--", p - arg_start) == 0)
224 /* Our macro support seems rather C specific but this would
225 seem necessary for languages allowing - in macro names.
226 e.g. Scheme's (defmacro ->foo () "bar\n") */
227 processing_args = 0;
228 else
230 /* Relies on modified 'args' not making it in to history */
231 *p = '\0';
232 error (_("Unrecognized option '%s' to info macro command. "
233 "Try \"help info macro\"."), arg_start);
236 arg_start = skip_spaces (p);
239 name = arg_start;
241 if (! name || ! *name)
242 error (_("You must follow the `info macro' command with the name"
243 " of the macro\n"
244 "whose definition you want to see."));
246 ms = default_macro_scope ();
247 cleanup_chain = make_cleanup (free_current_contents, &ms);
249 if (! ms)
250 macro_inform_no_debuginfo ();
251 else if (show_all_macros_named)
252 macro_for_each (ms->file->table, print_macro_callback, name);
253 else
255 struct macro_definition *d;
257 d = macro_lookup_definition (ms->file, ms->line, name);
258 if (d)
260 int line;
261 struct macro_source_file *file
262 = macro_definition_location (ms->file, ms->line, name, &line);
264 print_macro_definition (name, d, file, line);
266 else
268 fprintf_filtered (gdb_stdout,
269 "The symbol `%s' has no definition as a C/C++"
270 " preprocessor macro\n"
271 "at ", name);
272 show_pp_source_pos (gdb_stdout, ms->file, ms->line);
276 do_cleanups (cleanup_chain);
279 /* Implementation of the "info macros" command. */
280 static void
281 info_macros_command (char *args, int from_tty)
283 struct macro_scope *ms = NULL;
284 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
286 if (args == NULL)
287 ms = default_macro_scope ();
288 else
290 struct symtabs_and_lines sals =
291 decode_line_with_current_source (args, 0);
293 if (sals.nelts)
294 ms = sal_macro_scope (sals.sals[0]);
297 if (! ms || ! ms->file || ! ms->file->table)
298 macro_inform_no_debuginfo ();
299 else
300 macro_for_each_in_scope (ms->file, ms->line, print_macro_callback, NULL);
302 do_cleanups (cleanup_chain);
306 /* User-defined macros. */
308 static void
309 skip_ws (char **expp)
311 while (macro_is_whitespace (**expp))
312 ++*expp;
315 /* Try to find the bounds of an identifier. If an identifier is
316 found, returns a newly allocated string; otherwise returns NULL.
317 EXPP is a pointer to an input string; it is updated to point to the
318 text following the identifier. If IS_PARAMETER is true, this
319 function will also allow "..." forms as used in varargs macro
320 parameters. */
322 static char *
323 extract_identifier (char **expp, int is_parameter)
325 char *result;
326 char *p = *expp;
327 unsigned int len;
329 if (is_parameter && !strncmp (p, "...", 3))
331 /* Ok. */
333 else
335 if (! *p || ! macro_is_identifier_nondigit (*p))
336 return NULL;
337 for (++p;
338 *p && (macro_is_identifier_nondigit (*p) || macro_is_digit (*p));
339 ++p)
343 if (is_parameter && !strncmp (p, "...", 3))
344 p += 3;
346 len = p - *expp;
347 result = (char *) xmalloc (len + 1);
348 memcpy (result, *expp, len);
349 result[len] = '\0';
350 *expp += len;
351 return result;
354 /* Helper function to clean up a temporarily-constructed macro object.
355 This assumes that the contents were all allocated with xmalloc. */
356 static void
357 free_macro_definition_ptr (void *ptr)
359 int i;
360 struct macro_definition *loc = (struct macro_definition *) ptr;
362 for (i = 0; i < loc->argc; ++i)
363 xfree ((char *) loc->argv[i]);
364 xfree ((char *) loc->argv);
365 /* Note that the 'replacement' field is not allocated. */
368 static void
369 macro_define_command (char *exp, int from_tty)
371 struct macro_definition new_macro;
372 char *name = NULL;
373 struct cleanup *cleanup_chain;
375 if (!exp)
376 error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]"));
378 cleanup_chain = make_cleanup (free_macro_definition_ptr, &new_macro);
379 make_cleanup (free_current_contents, &name);
381 memset (&new_macro, 0, sizeof (struct macro_definition));
383 skip_ws (&exp);
384 name = extract_identifier (&exp, 0);
385 if (! name)
386 error (_("Invalid macro name."));
387 if (*exp == '(')
389 /* Function-like macro. */
390 int alloced = 5;
391 char **argv = (char **) xmalloc (alloced * sizeof (char *));
393 new_macro.kind = macro_function_like;
394 new_macro.argc = 0;
395 new_macro.argv = (const char * const *) argv;
397 /* Skip the '(' and whitespace. */
398 ++exp;
399 skip_ws (&exp);
401 while (*exp != ')')
403 int i;
405 if (new_macro.argc == alloced)
407 alloced *= 2;
408 argv = (char **) xrealloc (argv, alloced * sizeof (char *));
409 /* Must update new_macro as well... */
410 new_macro.argv = (const char * const *) argv;
412 argv[new_macro.argc] = extract_identifier (&exp, 1);
413 if (! argv[new_macro.argc])
414 error (_("Macro is missing an argument."));
415 ++new_macro.argc;
417 for (i = new_macro.argc - 2; i >= 0; --i)
419 if (! strcmp (argv[i], argv[new_macro.argc - 1]))
420 error (_("Two macro arguments with identical names."));
423 skip_ws (&exp);
424 if (*exp == ',')
426 ++exp;
427 skip_ws (&exp);
429 else if (*exp != ')')
430 error (_("',' or ')' expected at end of macro arguments."));
432 /* Skip the closing paren. */
433 ++exp;
434 skip_ws (&exp);
436 macro_define_function (macro_main (macro_user_macros), -1, name,
437 new_macro.argc, (const char **) new_macro.argv,
438 exp);
440 else
442 skip_ws (&exp);
443 macro_define_object (macro_main (macro_user_macros), -1, name, exp);
446 do_cleanups (cleanup_chain);
450 static void
451 macro_undef_command (char *exp, int from_tty)
453 char *name;
455 if (!exp)
456 error (_("usage: macro undef NAME"));
458 skip_ws (&exp);
459 name = extract_identifier (&exp, 0);
460 if (! name)
461 error (_("Invalid macro name."));
462 macro_undef (macro_main (macro_user_macros), -1, name);
463 xfree (name);
467 static void
468 print_one_macro (const char *name, const struct macro_definition *macro,
469 struct macro_source_file *source, int line,
470 void *ignore)
472 fprintf_filtered (gdb_stdout, "macro define %s", name);
473 if (macro->kind == macro_function_like)
475 int i;
477 fprintf_filtered (gdb_stdout, "(");
478 for (i = 0; i < macro->argc; ++i)
479 fprintf_filtered (gdb_stdout, "%s%s", (i > 0) ? ", " : "",
480 macro->argv[i]);
481 fprintf_filtered (gdb_stdout, ")");
483 fprintf_filtered (gdb_stdout, " %s\n", macro->replacement);
487 static void
488 macro_list_command (char *exp, int from_tty)
490 macro_for_each (macro_user_macros, print_one_macro, NULL);
494 /* Initializing the `macrocmd' module. */
496 extern initialize_file_ftype _initialize_macrocmd; /* -Wmissing-prototypes */
498 void
499 _initialize_macrocmd (void)
501 /* We introduce a new command prefix, `macro', under which we'll put
502 the various commands for working with preprocessor macros. */
503 add_prefix_cmd ("macro", class_info, macro_command,
504 _("Prefix for commands dealing with C preprocessor macros."),
505 &macrolist, "macro ", 0, &cmdlist);
507 add_cmd ("expand", no_class, macro_expand_command, _("\
508 Fully expand any C/C++ preprocessor macro invocations in EXPRESSION.\n\
509 Show the expanded expression."),
510 &macrolist);
511 add_alias_cmd ("exp", "expand", no_class, 1, &macrolist);
512 add_cmd ("expand-once", no_class, macro_expand_once_command, _("\
513 Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION.\n\
514 Show the expanded expression.\n\
516 This command differs from `macro expand' in that it only expands macro\n\
517 invocations that appear directly in EXPRESSION; if expanding a macro\n\
518 introduces further macro invocations, those are left unexpanded.\n\
520 `macro expand-once' helps you see how a particular macro expands,\n\
521 whereas `macro expand' shows you how all the macros involved in an\n\
522 expression work together to yield a pre-processed expression."),
523 &macrolist);
524 add_alias_cmd ("exp1", "expand-once", no_class, 1, &macrolist);
526 add_cmd ("macro", no_class, info_macro_command,
527 _("Show the definition of MACRO, and it's source location.\n\
528 Usage: info macro [-a|-all] [--] MACRO\n\
529 Options: \n\
530 -a, --all Output all definitions of MACRO in the current compilation\
531 unit.\n\
532 -- Specify the end of arguments and the beginning of the MACRO."),
534 &infolist);
536 add_cmd ("macros", no_class, info_macros_command,
537 _("Show the definitions of all macros at LINESPEC, or the current \
538 source location.\n\
539 Usage: info macros [LINESPEC]"),
540 &infolist);
542 add_cmd ("define", no_class, macro_define_command, _("\
543 Define a new C/C++ preprocessor macro.\n\
544 The GDB command `macro define DEFINITION' is equivalent to placing a\n\
545 preprocessor directive of the form `#define DEFINITION' such that the\n\
546 definition is visible in all the inferior's source files.\n\
547 For example:\n\
548 (gdb) macro define PI (3.1415926)\n\
549 (gdb) macro define MIN(x,y) ((x) < (y) ? (x) : (y))"),
550 &macrolist);
552 add_cmd ("undef", no_class, macro_undef_command, _("\
553 Remove the definition of the C/C++ preprocessor macro with the given name."),
554 &macrolist);
556 add_cmd ("list", no_class, macro_list_command,
557 _("List all the macros defined using the `macro define' command."),
558 &macrolist);