1 /* C preprocessor macro expansion commands for GDB.
2 Copyright (C) 2002-2024 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/>. */
23 #include "macroscope.h"
24 #include "cli/cli-style.h"
25 #include "cli/cli-utils.h"
27 #include "cli/cli-cmds.h"
31 /* The `macro' prefix command. */
33 static struct cmd_list_element
*macrolist
;
36 /* Macro expansion commands. */
39 /* Prints an informational message regarding the lack of macro information. */
41 macro_inform_no_debuginfo (void)
43 gdb_puts ("GDB has no preprocessor macro information for that code.\n");
47 macro_expand_command (const char *exp
, int from_tty
)
49 /* You know, when the user doesn't specify any expression, it would be
50 really cool if this defaulted to the last expression evaluated.
51 Then it would be easy to ask, "Hey, what did I just evaluate?" But
52 at the moment, the `print' commands don't save the last expression
53 evaluated, just its value. */
55 error (_("You must follow the `macro expand' command with the"
59 gdb::unique_xmalloc_ptr
<macro_scope
> ms
= default_macro_scope ();
63 gdb::unique_xmalloc_ptr
<char> expanded
= macro_expand (exp
, *ms
);
65 gdb_puts ("expands to: ");
66 gdb_puts (expanded
.get ());
70 macro_inform_no_debuginfo ();
75 macro_expand_once_command (const char *exp
, int from_tty
)
77 /* You know, when the user doesn't specify any expression, it would be
78 really cool if this defaulted to the last expression evaluated.
79 And it should set the once-expanded text as the new `last
80 expression'. That way, you could just hit return over and over and
81 see the expression expanded one level at a time. */
83 error (_("You must follow the `macro expand-once' command with"
85 "you want to expand."));
87 gdb::unique_xmalloc_ptr
<macro_scope
> ms
= default_macro_scope ();
91 gdb::unique_xmalloc_ptr
<char> expanded
= macro_expand_once (exp
, *ms
);
93 gdb_puts ("expands to: ");
94 gdb_puts (expanded
.get ());
98 macro_inform_no_debuginfo ();
101 /* Outputs the include path of a macro starting at FILE and LINE to STREAM.
103 Care should be taken that this function does not cause any lookups into
104 the splay tree so that it can be safely used while iterating. */
106 show_pp_source_pos (struct ui_file
*stream
,
107 struct macro_source_file
*file
,
110 std::string fullname
= macro_source_fullname (file
);
111 gdb_printf (stream
, "%ps:%d\n",
112 styled_string (file_name_style
.style (),
116 while (file
->included_by
)
118 fullname
= macro_source_fullname (file
->included_by
);
119 gdb_puts (_(" included at "), stream
);
120 fputs_styled (fullname
.c_str (), file_name_style
.style (), stream
);
121 gdb_printf (stream
, ":%d\n", file
->included_at_line
);
122 file
= file
->included_by
;
126 /* Outputs a macro for human consumption, detailing the include path
127 and macro definition. NAME is the name of the macro.
128 D the definition. FILE the start of the include path, and LINE the
131 Care should be taken that this function does not cause any lookups into
132 the splay tree so that it can be safely used while iterating. */
134 print_macro_definition (const char *name
,
135 const struct macro_definition
*d
,
136 struct macro_source_file
*file
,
139 gdb_printf ("Defined at ");
140 show_pp_source_pos (gdb_stdout
, file
, line
);
143 gdb_printf ("#define %s", name
);
145 gdb_printf ("-D%s", name
);
147 if (d
->kind
== macro_function_like
)
152 for (i
= 0; i
< d
->argc
; i
++)
154 gdb_puts (d
->argv
[i
]);
162 gdb_printf (" %s\n", d
->replacement
);
164 gdb_printf ("=%s\n", d
->replacement
);
167 /* The implementation of the `info macro' command. */
169 info_macro_command (const char *args
, int from_tty
)
171 gdb::unique_xmalloc_ptr
<struct macro_scope
> ms
;
173 int show_all_macros_named
= 0;
174 const char *arg_start
= args
;
175 int processing_args
= 1;
177 while (processing_args
178 && arg_start
&& *arg_start
== '-' && *arg_start
!= '\0')
180 const char *p
= skip_to_space (arg_start
);
182 if (strncmp (arg_start
, "-a", p
- arg_start
) == 0
183 || strncmp (arg_start
, "-all", p
- arg_start
) == 0)
184 show_all_macros_named
= 1;
185 else if (strncmp (arg_start
, "--", p
- arg_start
) == 0)
186 /* Our macro support seems rather C specific but this would
187 seem necessary for languages allowing - in macro names.
188 e.g. Scheme's (defmacro ->foo () "bar\n") */
191 report_unrecognized_option_error ("info macro", arg_start
);
193 arg_start
= skip_spaces (p
);
198 if (! name
|| ! *name
)
199 error (_("You must follow the `info macro' command with the name"
201 "whose definition you want to see."));
203 ms
= default_macro_scope ();
206 macro_inform_no_debuginfo ();
207 else if (show_all_macros_named
)
208 macro_for_each (ms
->file
->table
, [&] (const char *macro_name
,
209 const macro_definition
*macro
,
210 macro_source_file
*source
,
213 if (strcmp (name
, macro_name
) == 0)
214 print_macro_definition (name
, macro
, source
, line
);
218 struct macro_definition
*d
;
220 d
= macro_lookup_definition (ms
->file
, ms
->line
, name
);
224 struct macro_source_file
*file
225 = macro_definition_location (ms
->file
, ms
->line
, name
, &line
);
227 print_macro_definition (name
, d
, file
, line
);
231 gdb_printf ("The symbol `%s' has no definition as a C/C++"
232 " preprocessor macro\n"
234 show_pp_source_pos (gdb_stdout
, ms
->file
, ms
->line
);
239 /* Implementation of the "info macros" command. */
241 info_macros_command (const char *args
, int from_tty
)
243 gdb::unique_xmalloc_ptr
<struct macro_scope
> ms
;
246 ms
= default_macro_scope ();
249 std::vector
<symtab_and_line
> sals
250 = decode_line_with_current_source (args
, 0);
253 ms
= sal_macro_scope (sals
[0]);
256 if (! ms
|| ! ms
->file
|| ! ms
->file
->table
)
257 macro_inform_no_debuginfo ();
259 macro_for_each_in_scope (ms
->file
, ms
->line
, print_macro_definition
);
263 /* User-defined macros. */
266 skip_ws (const char **expp
)
268 while (macro_is_whitespace (**expp
))
272 /* Try to find the bounds of an identifier. If an identifier is
273 found, returns a newly allocated string; otherwise returns NULL.
274 EXPP is a pointer to an input string; it is updated to point to the
275 text following the identifier. If IS_PARAMETER is true, this
276 function will also allow "..." forms as used in varargs macro
279 static gdb::unique_xmalloc_ptr
<char>
280 extract_identifier (const char **expp
, int is_parameter
)
283 const char *p
= *expp
;
286 if (is_parameter
&& startswith (p
, "..."))
292 if (! *p
|| ! macro_is_identifier_nondigit (*p
))
295 *p
&& (macro_is_identifier_nondigit (*p
) || macro_is_digit (*p
));
300 if (is_parameter
&& startswith (p
, "..."))
304 result
= (char *) xmalloc (len
+ 1);
305 memcpy (result
, *expp
, len
);
308 return gdb::unique_xmalloc_ptr
<char> (result
);
311 struct temporary_macro_definition
: public macro_definition
313 temporary_macro_definition ()
316 kind
= macro_object_like
;
319 replacement
= nullptr;
322 ~temporary_macro_definition ()
326 for (i
= 0; i
< argc
; ++i
)
327 xfree ((char *) argv
[i
]);
328 xfree ((char *) argv
);
329 /* Note that the 'replacement' field is not allocated. */
334 macro_define_command (const char *exp
, int from_tty
)
336 temporary_macro_definition new_macro
;
339 error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]"));
342 gdb::unique_xmalloc_ptr
<char> name
= extract_identifier (&exp
, 0);
344 error (_("Invalid macro name."));
347 /* Function-like macro. */
349 char **argv
= XNEWVEC (char *, alloced
);
351 new_macro
.kind
= macro_function_like
;
353 new_macro
.argv
= (const char * const *) argv
;
355 /* Skip the '(' and whitespace. */
363 if (new_macro
.argc
== alloced
)
366 argv
= (char **) xrealloc (argv
, alloced
* sizeof (char *));
367 /* Must update new_macro as well... */
368 new_macro
.argv
= (const char * const *) argv
;
370 argv
[new_macro
.argc
] = extract_identifier (&exp
, 1).release ();
371 if (! argv
[new_macro
.argc
])
372 error (_("Macro is missing an argument."));
375 for (i
= new_macro
.argc
- 2; i
>= 0; --i
)
377 if (! strcmp (argv
[i
], argv
[new_macro
.argc
- 1]))
378 error (_("Two macro arguments with identical names."));
387 else if (*exp
!= ')')
388 error (_("',' or ')' expected at end of macro arguments."));
390 /* Skip the closing paren. */
394 macro_define_function (macro_main (macro_user_macros
), -1, name
.get (),
395 new_macro
.argc
, (const char **) new_macro
.argv
,
401 macro_define_object (macro_main (macro_user_macros
), -1, name
.get (),
408 macro_undef_command (const char *exp
, int from_tty
)
411 error (_("usage: macro undef NAME"));
414 gdb::unique_xmalloc_ptr
<char> name
= extract_identifier (&exp
, 0);
416 error (_("Invalid macro name."));
417 macro_undef (macro_main (macro_user_macros
), -1, name
.get ());
422 print_one_macro (const char *name
, const struct macro_definition
*macro
,
423 struct macro_source_file
*source
, int line
)
425 gdb_printf ("macro define %s", name
);
426 if (macro
->kind
== macro_function_like
)
431 for (i
= 0; i
< macro
->argc
; ++i
)
432 gdb_printf ("%s%s", (i
> 0) ? ", " : "",
436 gdb_printf (" %s\n", macro
->replacement
);
441 macro_list_command (const char *exp
, int from_tty
)
443 macro_for_each (macro_user_macros
, print_one_macro
);
446 /* Initializing the `macrocmd' module. */
448 void _initialize_macrocmd ();
450 _initialize_macrocmd ()
452 /* We introduce a new command prefix, `macro', under which we'll put
453 the various commands for working with preprocessor macros. */
454 add_basic_prefix_cmd ("macro", class_info
,
455 _("Prefix for commands dealing with C preprocessor macros."),
456 ¯olist
, 0, &cmdlist
);
458 cmd_list_element
*macro_expand_cmd
459 = add_cmd ("expand", no_class
, macro_expand_command
, _("\
460 Fully expand any C/C++ preprocessor macro invocations in EXPRESSION.\n\
461 Show the expanded expression."),
463 add_alias_cmd ("exp", macro_expand_cmd
, no_class
, 1, ¯olist
);
465 cmd_list_element
*macro_expand_once_cmd
466 = add_cmd ("expand-once", no_class
, macro_expand_once_command
, _("\
467 Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION.\n\
468 Show the expanded expression.\n\
470 This command differs from `macro expand' in that it only expands macro\n\
471 invocations that appear directly in EXPRESSION; if expanding a macro\n\
472 introduces further macro invocations, those are left unexpanded.\n\
474 `macro expand-once' helps you see how a particular macro expands,\n\
475 whereas `macro expand' shows you how all the macros involved in an\n\
476 expression work together to yield a pre-processed expression."),
478 add_alias_cmd ("exp1", macro_expand_once_cmd
, no_class
, 1, ¯olist
);
480 add_info ("macro", info_macro_command
,
481 _("Show the definition of MACRO, and it's source location.\n\
482 Usage: info macro [-a|-all] [--] MACRO\n\
484 -a, --all Output all definitions of MACRO in the current compilation\
486 -- Specify the end of arguments and the beginning of the MACRO."));
488 add_info ("macros", info_macros_command
,
489 _("Show the definitions of all macros at LINESPEC, or the current \
491 Usage: info macros [LINESPEC]"));
493 add_cmd ("define", no_class
, macro_define_command
, _("\
494 Define a new C/C++ preprocessor macro.\n\
495 The GDB command `macro define DEFINITION' is equivalent to placing a\n\
496 preprocessor directive of the form `#define DEFINITION' such that the\n\
497 definition is visible in all the inferior's source files.\n\
499 (gdb) macro define PI (3.1415926)\n\
500 (gdb) macro define MIN(x,y) ((x) < (y) ? (x) : (y))"),
503 add_cmd ("undef", no_class
, macro_undef_command
, _("\
504 Remove the definition of the C/C++ preprocessor macro with the given name."),
507 add_cmd ("list", no_class
, macro_list_command
,
508 _("List all the macros defined using the `macro define' command."),