diff options
author | matt rice <ratmice@gmail.com> | 2011-07-21 15:13:30 +0000 |
---|---|---|
committer | matt rice <ratmice@gmail.com> | 2011-07-21 15:13:30 +0000 |
commit | 9b158ba08eb1ad14dc2324b8391263b228fa928a (patch) | |
tree | 29747b586e1e18155aaf1ce9de26781e9468e1ba /gdb/macrocmd.c | |
parent | d17b6f81012b6844de08934193fe7cb7db8cbd5f (diff) | |
download | gdb-9b158ba08eb1ad14dc2324b8391263b228fa928a.zip gdb-9b158ba08eb1ad14dc2324b8391263b228fa928a.tar.gz gdb-9b158ba08eb1ad14dc2324b8391263b228fa928a.tar.bz2 |
PR macros/12999
* macrotab.h (macro_callback_fn): Add new arguments to callback.
* macrotab.c (foreach_macro): Ditto.
(foreach_macro_in_scope): Ditto.
* macrocmd.c (print_macro_callback): New function.
(info_macro_command): Move some code to print_macro_definition.
(print_macro_definition): New function.
(print_one_macro): Add new arguments to callback.
testsuite/
* gdb.base/info-macros.c: New test sources.
* gdb.base/info-macros.exp: New tests.
docs/
* gdb.texinfo (Macros): Add info definitions and info macros commands.
Update text and cindex entries for info macro command.
Diffstat (limited to 'gdb/macrocmd.c')
-rw-r--r-- | gdb/macrocmd.c | 133 |
1 files changed, 111 insertions, 22 deletions
diff --git a/gdb/macrocmd.c b/gdb/macrocmd.c index c77156a..d1ac7fa 100644 --- a/gdb/macrocmd.c +++ b/gdb/macrocmd.c @@ -117,7 +117,10 @@ macro_expand_once_command (char *exp, int from_tty) return; } +/* Outputs the include path of a macro starting at FILE and LINE to STREAM. + Care should be taken that this function does not cause any lookups into + the splay tree so that it can be safely used while iterating. */ static void show_pp_source_pos (struct ui_file *stream, struct macro_source_file *file, @@ -134,36 +137,27 @@ show_pp_source_pos (struct ui_file *stream, } } +/* Outputs a macro for human consumption, detailing the include path + and macro definition. NAME is the name of the macro. + D the definition. FILE the start of the include path, and LINE the + line number in FILE. + Care should be taken that this function does not cause any lookups into + the splay tree so that it can be safely used while iterating. */ static void -info_macro_command (char *name, int from_tty) +print_macro_definition (const char *name, + const struct macro_definition *d, + struct macro_source_file *file, + int line) { - struct macro_scope *ms = NULL; - struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms); - struct macro_definition *d; - - if (! name || ! *name) - error (_("You must follow the `info macro' command with the name" - " of the macro\n" - "whose definition you want to see.")); - - ms = default_macro_scope (); - if (! ms) - error (_("GDB has no preprocessor macro information for that code.")); - - d = macro_lookup_definition (ms->file, ms->line, name); - if (d) - { - int line; - struct macro_source_file *file - = macro_definition_location (ms->file, ms->line, name, &line); - fprintf_filtered (gdb_stdout, "Defined at "); show_pp_source_pos (gdb_stdout, file, line); + if (line != 0) fprintf_filtered (gdb_stdout, "#define %s", name); else fprintf_filtered (gdb_stdout, "-D%s", name); + if (d->kind == macro_function_like) { int i; @@ -177,10 +171,37 @@ info_macro_command (char *name, int from_tty) } fputs_filtered (")", gdb_stdout); } + if (line != 0) fprintf_filtered (gdb_stdout, " %s\n", d->replacement); else fprintf_filtered (gdb_stdout, "=%s\n", d->replacement); +} + +static void +info_macro_command (char *name, int from_tty) +{ + struct macro_scope *ms = NULL; + struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms); + struct macro_definition *d; + + if (! name || ! *name) + error (_("You must follow the `info macro' command with the name" + " of the macro\n" + "whose definition you want to see.")); + + ms = default_macro_scope (); + if (! ms) + error (_("GDB has no preprocessor macro information for that code.")); + + d = macro_lookup_definition (ms->file, ms->line, name); + if (d) + { + int line; + struct macro_source_file *file + = macro_definition_location (ms->file, ms->line, name, &line); + + print_macro_definition (name, d, file, line); } else { @@ -194,6 +215,63 @@ info_macro_command (char *name, int from_tty) do_cleanups (cleanup_chain); } +/* A callback function for usage with macro_for_each and friends. + If USER_DATA is null all macros will be printed. + Otherwise USER_DATA is considered to be a string, printing + only macros who's NAME matches USER_DATA. Other arguments are + routed to print_macro_definition. */ +static void +print_macro_callback (const char *name, const struct macro_definition *macro, + struct macro_source_file *source, int line, + void *user_data) +{ + if (! user_data || strcmp (user_data, name) == 0) + print_macro_definition (name, macro, source, line); +} + +/* Implementation of the "info definitions" command. */ +static void +info_definitions_command (char *name, int from_tty) +{ + struct macro_scope *ms = NULL; + struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms); + + if (! name || ! *name) + error (_("The `info definitions' command requires a macro name as an \ +argument.")); + + ms = default_macro_scope (); + + if (! ms || ! ms->file || ! ms->file->table) + error (_("GDB has no preprocessor macro information for that code.")); + + macro_for_each (ms->file->table, print_macro_callback, name); + do_cleanups (cleanup_chain); +} + +/* Implementation of the "info macros" command. */ +static void +info_macros_command (char *args, int from_tty) +{ + struct macro_scope *ms = NULL; + struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms); + + if (args == NULL) + ms = default_macro_scope (); + else + { + struct symtabs_and_lines sals = decode_line_spec (args, 0); + + if (sals.nelts) + ms = sal_macro_scope (sals.sals[0]); + } + + if (! ms || ! ms->file || ! ms->file->table) + error (_("GDB has no preprocessor macro information for that code.")); + + macro_for_each_in_scope (ms->file, ms->line, print_macro_callback, NULL); + do_cleanups (cleanup_chain); +} /* User-defined macros. */ @@ -359,6 +437,7 @@ macro_undef_command (char *exp, int from_tty) static void print_one_macro (const char *name, const struct macro_definition *macro, + struct macro_source_file *source, int line, void *ignore) { fprintf_filtered (gdb_stdout, "macro define %s", name); @@ -382,7 +461,6 @@ macro_list_command (char *exp, int from_tty) macro_for_each (macro_user_macros, print_one_macro, NULL); } - /* Initializing the `macrocmd' module. */ @@ -420,6 +498,17 @@ expression work together to yield a pre-processed expression."), _("Show the definition of MACRO, and its source location."), &infolist); + add_cmd ("macros", no_class, info_macros_command, + _("Show the definitions of all macros at LINESPEC, or the current \ +source location.\n\ +Usage: info macros [LINESPEC]"), + &infolist); + + add_cmd ("definitions", no_class, info_definitions_command, + _("Show all definitions of MACRO in the current compilation unit.\n\ +Usage: info definitions MACRO"), + &infolist); + add_cmd ("define", no_class, macro_define_command, _("\ Define a new C/C++ preprocessor macro.\n\ The GDB command `macro define DEFINITION' is equivalent to placing a\n\ |