Fix some valgrind errors in the TUI
[deliverable/binutils-gdb.git] / gdb / macrocmd.c
CommitLineData
6821892e 1/* C preprocessor macro expansion commands for GDB.
42a4f53d 2 Copyright (C) 2002-2019 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
bb0da2b4 291static gdb::unique_xmalloc_ptr<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;
bb0da2b4 320 return gdb::unique_xmalloc_ptr<char> (result);
d7d9f01e
TT
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;
886a217c
TT
349
350 if (!exp)
351 error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]"));
352
d7d9f01e 353 skip_ws (&exp);
bb0da2b4
PW
354 gdb::unique_xmalloc_ptr<char> name = extract_identifier (&exp, 0);
355 if (name == NULL)
d7d9f01e
TT
356 error (_("Invalid macro name."));
357 if (*exp == '(')
358 {
359 /* Function-like macro. */
360 int alloced = 5;
8d749320 361 char **argv = XNEWVEC (char *, alloced);
d7d9f01e
TT
362
363 new_macro.kind = macro_function_like;
364 new_macro.argc = 0;
365 new_macro.argv = (const char * const *) argv;
366
367 /* Skip the '(' and whitespace. */
368 ++exp;
369 skip_ws (&exp);
370
371 while (*exp != ')')
372 {
373 int i;
374
375 if (new_macro.argc == alloced)
376 {
377 alloced *= 2;
378 argv = (char **) xrealloc (argv, alloced * sizeof (char *));
025bb325 379 /* Must update new_macro as well... */
d7d9f01e
TT
380 new_macro.argv = (const char * const *) argv;
381 }
bb0da2b4 382 argv[new_macro.argc] = extract_identifier (&exp, 1).release ();
d7d9f01e
TT
383 if (! argv[new_macro.argc])
384 error (_("Macro is missing an argument."));
385 ++new_macro.argc;
386
387 for (i = new_macro.argc - 2; i >= 0; --i)
388 {
389 if (! strcmp (argv[i], argv[new_macro.argc - 1]))
390 error (_("Two macro arguments with identical names."));
391 }
392
393 skip_ws (&exp);
394 if (*exp == ',')
395 {
396 ++exp;
397 skip_ws (&exp);
398 }
399 else if (*exp != ')')
400 error (_("',' or ')' expected at end of macro arguments."));
401 }
402 /* Skip the closing paren. */
403 ++exp;
cc704ebe 404 skip_ws (&exp);
d7d9f01e 405
bb0da2b4 406 macro_define_function (macro_main (macro_user_macros), -1, name.get (),
d7d9f01e
TT
407 new_macro.argc, (const char **) new_macro.argv,
408 exp);
409 }
410 else
cc704ebe
TT
411 {
412 skip_ws (&exp);
bb0da2b4
PW
413 macro_define_object (macro_main (macro_user_macros), -1, name.get (),
414 exp);
cc704ebe 415 }
6821892e
JB
416}
417
418
419static void
3088cf40 420macro_undef_command (const char *exp, int from_tty)
6821892e 421{
886a217c
TT
422 if (!exp)
423 error (_("usage: macro undef NAME"));
424
d7d9f01e 425 skip_ws (&exp);
bb0da2b4
PW
426 gdb::unique_xmalloc_ptr<char> name = extract_identifier (&exp, 0);
427 if (name == nullptr)
d7d9f01e 428 error (_("Invalid macro name."));
bb0da2b4 429 macro_undef (macro_main (macro_user_macros), -1, name.get ());
d7d9f01e
TT
430}
431
432
433static void
9a044a89 434print_one_macro (const char *name, const struct macro_definition *macro,
14bc53a8 435 struct macro_source_file *source, int line)
d7d9f01e
TT
436{
437 fprintf_filtered (gdb_stdout, "macro define %s", name);
438 if (macro->kind == macro_function_like)
439 {
440 int i;
b8d56208 441
d7d9f01e
TT
442 fprintf_filtered (gdb_stdout, "(");
443 for (i = 0; i < macro->argc; ++i)
444 fprintf_filtered (gdb_stdout, "%s%s", (i > 0) ? ", " : "",
445 macro->argv[i]);
446 fprintf_filtered (gdb_stdout, ")");
447 }
cc704ebe 448 fprintf_filtered (gdb_stdout, " %s\n", macro->replacement);
6821892e
JB
449}
450
451
452static void
3088cf40 453macro_list_command (const char *exp, int from_tty)
6821892e 454{
14bc53a8 455 macro_for_each (macro_user_macros, print_one_macro);
6821892e
JB
456}
457
6821892e
JB
458/* Initializing the `macrocmd' module. */
459
460void
461_initialize_macrocmd (void)
462{
6821892e
JB
463 /* We introduce a new command prefix, `macro', under which we'll put
464 the various commands for working with preprocessor macros. */
1bedd215
AC
465 add_prefix_cmd ("macro", class_info, macro_command,
466 _("Prefix for commands dealing with C preprocessor macros."),
467 &macrolist, "macro ", 0, &cmdlist);
6821892e 468
1a966eab
AC
469 add_cmd ("expand", no_class, macro_expand_command, _("\
470Fully expand any C/C++ preprocessor macro invocations in EXPRESSION.\n\
471Show the expanded expression."),
472 &macrolist);
6821892e 473 add_alias_cmd ("exp", "expand", no_class, 1, &macrolist);
1a966eab
AC
474 add_cmd ("expand-once", no_class, macro_expand_once_command, _("\
475Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION.\n\
476Show the expanded expression.\n\
477\n\
478This command differs from `macro expand' in that it only expands macro\n\
479invocations that appear directly in EXPRESSION; if expanding a macro\n\
480introduces further macro invocations, those are left unexpanded.\n\
481\n\
482`macro expand-once' helps you see how a particular macro expands,\n\
483whereas `macro expand' shows you how all the macros involved in an\n\
484expression work together to yield a pre-processed expression."),
485 &macrolist);
6821892e
JB
486 add_alias_cmd ("exp1", "expand-once", no_class, 1, &macrolist);
487
5f515954
AB
488 add_info ("macro", info_macro_command,
489 _("Show the definition of MACRO, and it's source location.\n\
71eba9c2 490Usage: info macro [-a|-all] [--] MACRO\n\
491Options: \n\
492 -a, --all Output all definitions of MACRO in the current compilation\
493 unit.\n\
5f515954 494 -- Specify the end of arguments and the beginning of the MACRO."));
71eba9c2 495
5f515954
AB
496 add_info ("macros", info_macros_command,
497 _("Show the definitions of all macros at LINESPEC, or the current \
9b158ba0 498source location.\n\
5f515954 499Usage: info macros [LINESPEC]"));
9b158ba0 500
1a966eab
AC
501 add_cmd ("define", no_class, macro_define_command, _("\
502Define a new C/C++ preprocessor macro.\n\
503The GDB command `macro define DEFINITION' is equivalent to placing a\n\
504preprocessor directive of the form `#define DEFINITION' such that the\n\
505definition is visible in all the inferior's source files.\n\
506For example:\n\
507 (gdb) macro define PI (3.1415926)\n\
508 (gdb) macro define MIN(x,y) ((x) < (y) ? (x) : (y))"),
509 &macrolist);
510
511 add_cmd ("undef", no_class, macro_undef_command, _("\
512Remove the definition of the C/C++ preprocessor macro with the given name."),
513 &macrolist);
514
515 add_cmd ("list", no_class, macro_list_command,
516 _("List all the macros defined using the `macro define' command."),
517 &macrolist);
6821892e 518}
This page took 2.463428 seconds and 4 git commands to generate.