*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / macrocmd.c
CommitLineData
6821892e 1/* C preprocessor macro expansion commands for GDB.
9b254dd1 2 Copyright (C) 2002, 2007, 2008 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"
25#include "command.h"
26#include "gdbcmd.h"
d7d9f01e 27#include "gdb_string.h"
6821892e
JB
28
29\f
30/* The `macro' prefix command. */
31
32static struct cmd_list_element *macrolist;
33
34static void
35macro_command (char *arg, int from_tty)
36{
37 printf_unfiltered
38 ("\"macro\" must be followed by the name of a macro command.\n");
39 help_list (macrolist, "macro ", -1, gdb_stdout);
40}
41
42
43\f
44/* Macro expansion commands. */
45
46
47static void
48macro_expand_command (char *exp, int from_tty)
49{
50 struct macro_scope *ms = NULL;
51 char *expanded = NULL;
52 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
53 make_cleanup (free_current_contents, &expanded);
54
55 /* You know, when the user doesn't specify any expression, it would be
56 really cool if this defaulted to the last expression evaluated.
57 Then it would be easy to ask, "Hey, what did I just evaluate?" But
58 at the moment, the `print' commands don't save the last expression
59 evaluated, just its value. */
60 if (! exp || ! *exp)
8a3fe4f8 61 error (_("You must follow the `macro expand' command with the"
6821892e 62 " expression you\n"
8a3fe4f8 63 "want to expand."));
6821892e
JB
64
65 ms = default_macro_scope ();
66 if (ms)
67 {
68 expanded = macro_expand (exp, standard_macro_lookup, ms);
69 fputs_filtered ("expands to: ", gdb_stdout);
70 fputs_filtered (expanded, gdb_stdout);
71 fputs_filtered ("\n", gdb_stdout);
72 }
73 else
74 fputs_filtered ("GDB has no preprocessor macro information for "
75 "that code.\n",
76 gdb_stdout);
77
78 do_cleanups (cleanup_chain);
79 return;
80}
81
82
83static void
84macro_expand_once_command (char *exp, int from_tty)
85{
86 struct macro_scope *ms = NULL;
87 char *expanded = NULL;
88 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
89 make_cleanup (free_current_contents, &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)
8a3fe4f8 97 error (_("You must follow the `macro expand-once' command with"
6821892e 98 " the expression\n"
8a3fe4f8 99 "you want to expand."));
6821892e
JB
100
101 ms = default_macro_scope ();
102 if (ms)
103 {
104 expanded = macro_expand_once (exp, standard_macro_lookup, ms);
105 fputs_filtered ("expands to: ", gdb_stdout);
106 fputs_filtered (expanded, gdb_stdout);
107 fputs_filtered ("\n", gdb_stdout);
108 }
109 else
110 fputs_filtered ("GDB has no preprocessor macro information for "
111 "that code.\n",
112 gdb_stdout);
113
114 do_cleanups (cleanup_chain);
115 return;
116}
117
118
119static void
120show_pp_source_pos (struct ui_file *stream,
121 struct macro_source_file *file,
122 int line)
123{
124 fprintf_filtered (stream, "%s:%d\n", file->filename, line);
125
126 while (file->included_by)
127 {
128 fprintf_filtered (gdb_stdout, " included at %s:%d\n",
129 file->included_by->filename,
130 file->included_at_line);
131 file = file->included_by;
132 }
133}
134
135
136static void
475b0867 137info_macro_command (char *name, int from_tty)
6821892e
JB
138{
139 struct macro_scope *ms = NULL;
140 struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
141 struct macro_definition *d;
142
143 if (! name || ! *name)
8a3fe4f8 144 error (_("You must follow the `info macro' command with the name"
6821892e 145 " of the macro\n"
8a3fe4f8 146 "whose definition you want to see."));
6821892e
JB
147
148 ms = default_macro_scope ();
149 if (! ms)
8a3fe4f8 150 error (_("GDB has no preprocessor macro information for that code."));
6821892e
JB
151
152 d = macro_lookup_definition (ms->file, ms->line, name);
153 if (d)
154 {
155 int line;
156 struct macro_source_file *file
157 = macro_definition_location (ms->file, ms->line, name, &line);
158
159 fprintf_filtered (gdb_stdout, "Defined at ");
160 show_pp_source_pos (gdb_stdout, file, line);
161 fprintf_filtered (gdb_stdout, "#define %s", name);
162 if (d->kind == macro_function_like)
163 {
164 int i;
165
166 fputs_filtered ("(", gdb_stdout);
167 for (i = 0; i < d->argc; i++)
168 {
169 fputs_filtered (d->argv[i], gdb_stdout);
170 if (i + 1 < d->argc)
171 fputs_filtered (", ", gdb_stdout);
172 }
173 fputs_filtered (")", gdb_stdout);
174 }
175 fprintf_filtered (gdb_stdout, " %s\n", d->replacement);
176 }
177 else
178 {
179 fprintf_filtered (gdb_stdout,
180 "The symbol `%s' has no definition as a C/C++"
181 " preprocessor macro\n"
182 "at ", name);
183 show_pp_source_pos (gdb_stdout, ms->file, ms->line);
184 }
185
186 do_cleanups (cleanup_chain);
187}
188
189
190\f
191/* User-defined macros. */
192
d7d9f01e
TT
193static void
194skip_ws (char **expp)
195{
196 while (macro_is_whitespace (**expp))
197 ++*expp;
198}
199
2fae03e8
TT
200/* Try to find the bounds of an identifier. If an identifier is
201 found, returns a newly allocated string; otherwise returns NULL.
202 EXPP is a pointer to an input string; it is updated to point to the
203 text following the identifier. If IS_PARAMETER is true, this
204 function will also allow "..." forms as used in varargs macro
205 parameters. */
206
d7d9f01e 207static char *
2fae03e8 208extract_identifier (char **expp, int is_parameter)
d7d9f01e
TT
209{
210 char *result;
211 char *p = *expp;
212 unsigned int len;
2fae03e8
TT
213
214 if (is_parameter && !strncmp (p, "...", 3))
215 {
216 /* Ok. */
217 }
218 else
219 {
220 if (! *p || ! macro_is_identifier_nondigit (*p))
221 return NULL;
222 for (++p;
223 *p && (macro_is_identifier_nondigit (*p) || macro_is_digit (*p));
224 ++p)
225 ;
226 }
227
228 if (is_parameter && !strncmp (p, "...", 3))
229 p += 3;
230
d7d9f01e
TT
231 len = p - *expp;
232 result = (char *) xmalloc (len + 1);
233 memcpy (result, *expp, len);
234 result[len] = '\0';
235 *expp += len;
236 return result;
237}
238
239/* Helper function to clean up a temporarily-constructed macro object.
240 This assumes that the contents were all allocated with xmalloc. */
241static void
242free_macro_definition_ptr (void *ptr)
243{
244 int i;
245 struct macro_definition *loc = (struct macro_definition *) ptr;
246 for (i = 0; i < loc->argc; ++i)
247 xfree ((char *) loc->argv[i]);
248 xfree ((char *) loc->argv);
249 /* Note that the 'replacement' field is not allocated. */
250}
6821892e
JB
251
252static void
253macro_define_command (char *exp, int from_tty)
254{
d7d9f01e
TT
255 struct macro_definition new_macro;
256 char *name = NULL;
886a217c
TT
257 struct cleanup *cleanup_chain;
258
259 if (!exp)
260 error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]"));
261
262 cleanup_chain = make_cleanup (free_macro_definition_ptr, &new_macro);
d7d9f01e
TT
263 make_cleanup (free_current_contents, &name);
264
265 memset (&new_macro, 0, sizeof (struct macro_definition));
266
267 skip_ws (&exp);
2fae03e8 268 name = extract_identifier (&exp, 0);
d7d9f01e
TT
269 if (! name)
270 error (_("Invalid macro name."));
271 if (*exp == '(')
272 {
273 /* Function-like macro. */
274 int alloced = 5;
275 char **argv = (char **) xmalloc (alloced * sizeof (char *));
276
277 new_macro.kind = macro_function_like;
278 new_macro.argc = 0;
279 new_macro.argv = (const char * const *) argv;
280
281 /* Skip the '(' and whitespace. */
282 ++exp;
283 skip_ws (&exp);
284
285 while (*exp != ')')
286 {
287 int i;
288
289 if (new_macro.argc == alloced)
290 {
291 alloced *= 2;
292 argv = (char **) xrealloc (argv, alloced * sizeof (char *));
293 /* Must update new_macro as well... */
294 new_macro.argv = (const char * const *) argv;
295 }
2fae03e8 296 argv[new_macro.argc] = extract_identifier (&exp, 1);
d7d9f01e
TT
297 if (! argv[new_macro.argc])
298 error (_("Macro is missing an argument."));
299 ++new_macro.argc;
300
301 for (i = new_macro.argc - 2; i >= 0; --i)
302 {
303 if (! strcmp (argv[i], argv[new_macro.argc - 1]))
304 error (_("Two macro arguments with identical names."));
305 }
306
307 skip_ws (&exp);
308 if (*exp == ',')
309 {
310 ++exp;
311 skip_ws (&exp);
312 }
313 else if (*exp != ')')
314 error (_("',' or ')' expected at end of macro arguments."));
315 }
316 /* Skip the closing paren. */
317 ++exp;
318
319 macro_define_function (macro_main (macro_user_macros), -1, name,
320 new_macro.argc, (const char **) new_macro.argv,
321 exp);
322 }
323 else
324 macro_define_object (macro_main (macro_user_macros), -1, name, exp);
325
326 do_cleanups (cleanup_chain);
6821892e
JB
327}
328
329
330static void
331macro_undef_command (char *exp, int from_tty)
332{
d7d9f01e 333 char *name;
886a217c
TT
334
335 if (!exp)
336 error (_("usage: macro undef NAME"));
337
d7d9f01e 338 skip_ws (&exp);
2fae03e8 339 name = extract_identifier (&exp, 0);
d7d9f01e
TT
340 if (! name)
341 error (_("Invalid macro name."));
342 macro_undef (macro_main (macro_user_macros), -1, name);
343 xfree (name);
344}
345
346
347static void
9a044a89
TT
348print_one_macro (const char *name, const struct macro_definition *macro,
349 void *ignore)
d7d9f01e
TT
350{
351 fprintf_filtered (gdb_stdout, "macro define %s", name);
352 if (macro->kind == macro_function_like)
353 {
354 int i;
355 fprintf_filtered (gdb_stdout, "(");
356 for (i = 0; i < macro->argc; ++i)
357 fprintf_filtered (gdb_stdout, "%s%s", (i > 0) ? ", " : "",
358 macro->argv[i]);
359 fprintf_filtered (gdb_stdout, ")");
360 }
361 /* Note that we don't need a leading space here -- "macro define"
362 provided it. */
363 fprintf_filtered (gdb_stdout, "%s\n", macro->replacement);
6821892e
JB
364}
365
366
367static void
368macro_list_command (char *exp, int from_tty)
369{
9a044a89 370 macro_for_each (macro_user_macros, print_one_macro, NULL);
6821892e
JB
371}
372
373
374\f
375/* Initializing the `macrocmd' module. */
376
a78f21af 377extern initialize_file_ftype _initialize_macrocmd; /* -Wmissing-prototypes */
b9362cc7 378
6821892e
JB
379void
380_initialize_macrocmd (void)
381{
382 struct cmd_list_element *c;
383
384 /* We introduce a new command prefix, `macro', under which we'll put
385 the various commands for working with preprocessor macros. */
1bedd215
AC
386 add_prefix_cmd ("macro", class_info, macro_command,
387 _("Prefix for commands dealing with C preprocessor macros."),
388 &macrolist, "macro ", 0, &cmdlist);
6821892e 389
1a966eab
AC
390 add_cmd ("expand", no_class, macro_expand_command, _("\
391Fully expand any C/C++ preprocessor macro invocations in EXPRESSION.\n\
392Show the expanded expression."),
393 &macrolist);
6821892e 394 add_alias_cmd ("exp", "expand", no_class, 1, &macrolist);
1a966eab
AC
395 add_cmd ("expand-once", no_class, macro_expand_once_command, _("\
396Expand C/C++ preprocessor macro invocations appearing directly in EXPRESSION.\n\
397Show the expanded expression.\n\
398\n\
399This command differs from `macro expand' in that it only expands macro\n\
400invocations that appear directly in EXPRESSION; if expanding a macro\n\
401introduces further macro invocations, those are left unexpanded.\n\
402\n\
403`macro expand-once' helps you see how a particular macro expands,\n\
404whereas `macro expand' shows you how all the macros involved in an\n\
405expression work together to yield a pre-processed expression."),
406 &macrolist);
6821892e
JB
407 add_alias_cmd ("exp1", "expand-once", no_class, 1, &macrolist);
408
1a966eab
AC
409 add_cmd ("macro", no_class, info_macro_command,
410 _("Show the definition of MACRO, and its source location."),
411 &infolist);
412
413 add_cmd ("define", no_class, macro_define_command, _("\
414Define a new C/C++ preprocessor macro.\n\
415The GDB command `macro define DEFINITION' is equivalent to placing a\n\
416preprocessor directive of the form `#define DEFINITION' such that the\n\
417definition is visible in all the inferior's source files.\n\
418For example:\n\
419 (gdb) macro define PI (3.1415926)\n\
420 (gdb) macro define MIN(x,y) ((x) < (y) ? (x) : (y))"),
421 &macrolist);
422
423 add_cmd ("undef", no_class, macro_undef_command, _("\
424Remove the definition of the C/C++ preprocessor macro with the given name."),
425 &macrolist);
426
427 add_cmd ("list", no_class, macro_list_command,
428 _("List all the macros defined using the `macro define' command."),
429 &macrolist);
6821892e 430}
This page took 0.618167 seconds and 4 git commands to generate.