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