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