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