diff options
author | Tom Tromey <tromey@redhat.com> | 2008-12-11 18:30:28 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2008-12-11 18:30:28 +0000 |
commit | 7c8adf682b34f6efbd4113c83d93b31fba4c7cb0 (patch) | |
tree | f6ec61538f02c042f9d5273ee99d2b0914fe7353 /gdb/c-lang.c | |
parent | df131623294b8a9f8ebfbd0fe3780886c19527aa (diff) | |
download | gdb-7c8adf682b34f6efbd4113c83d93b31fba4c7cb0.zip gdb-7c8adf682b34f6efbd4113c83d93b31fba4c7cb0.tar.gz gdb-7c8adf682b34f6efbd4113c83d93b31fba4c7cb0.tar.bz2 |
gdb
PR macros/2564:
* c-exp.y (macro_original_text, expansion_obstack,
expression_macro_scope): New globals.
(scan_macro_expansion): New function.
(scanning_macro_expansion): Likewise.
(finished_macro_expansion): Likewise.
(scan_macro_cleanup): Likewise.
(c_parse): Find macro scope. Initialize obstack.
* c-lang.h (scan_macro_expansion, scanning_macro_expansion,
finished_macro_expansion, expression_macro_lookup_func,
expression_macro_lookup_baton): Remove.
* c-lang.c (scan_macro_expansion, scanning_macro_expansion,
finished_macro_expansion, expression_macro_lookup_func,
expression_macro_lookup_baton): Remove.
(macro_original_text, macro_expanded_text,
c_preprocess_and_parse): Remove.
(c_language_defn, cplus_language_defn, asm_language_defn,
minimal_language_defn): Use c_parse.
gdb/testsuite
* gdb.base/macscp.exp: Print "address.addr".
* gdb.base/macscp1.c (struct outer): New struct.
(address): New global.
Diffstat (limited to 'gdb/c-lang.c')
-rw-r--r-- | gdb/c-lang.c | 113 |
1 files changed, 4 insertions, 109 deletions
diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 067e429..dc7b059 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -185,111 +185,6 @@ c_printstr (struct ui_file *stream, const gdb_byte *string, /* Preprocessing and parsing C and C++ expressions. */ -/* When we find that lexptr (the global var defined in parse.c) is - pointing at a macro invocation, we expand the invocation, and call - scan_macro_expansion to save the old lexptr here and point lexptr - into the expanded text. When we reach the end of that, we call - end_macro_expansion to pop back to the value we saved here. The - macro expansion code promises to return only fully-expanded text, - so we don't need to "push" more than one level. - - This is disgusting, of course. It would be cleaner to do all macro - expansion beforehand, and then hand that to lexptr. But we don't - really know where the expression ends. Remember, in a command like - - (gdb) break *ADDRESS if CONDITION - - we evaluate ADDRESS in the scope of the current frame, but we - evaluate CONDITION in the scope of the breakpoint's location. So - it's simply wrong to try to macro-expand the whole thing at once. */ -static char *macro_original_text; -static char *macro_expanded_text; - - -void -scan_macro_expansion (char *expansion) -{ - /* We'd better not be trying to push the stack twice. */ - gdb_assert (! macro_original_text); - gdb_assert (! macro_expanded_text); - - /* Save the old lexptr value, so we can return to it when we're done - parsing the expanded text. */ - macro_original_text = lexptr; - lexptr = expansion; - - /* Save the expanded text, so we can free it when we're finished. */ - macro_expanded_text = expansion; -} - - -int -scanning_macro_expansion (void) -{ - return macro_original_text != 0; -} - - -void -finished_macro_expansion (void) -{ - /* There'd better be something to pop back to, and we better have - saved a pointer to the start of the expanded text. */ - gdb_assert (macro_original_text); - gdb_assert (macro_expanded_text); - - /* Pop back to the original text. */ - lexptr = macro_original_text; - macro_original_text = 0; - - /* Free the expanded text. */ - xfree (macro_expanded_text); - macro_expanded_text = 0; -} - - -static void -scan_macro_cleanup (void *dummy) -{ - if (macro_original_text) - finished_macro_expansion (); -} - - -/* We set these global variables before calling c_parse, to tell it - how it to find macro definitions for the expression at hand. */ -macro_lookup_ftype *expression_macro_lookup_func; -void *expression_macro_lookup_baton; - - -static int -c_preprocess_and_parse (void) -{ - /* Set up a lookup function for the macro expander. */ - struct macro_scope *scope = 0; - struct cleanup *back_to = make_cleanup (free_current_contents, &scope); - - if (expression_context_block) - scope = sal_macro_scope (find_pc_line (expression_context_pc, 0)); - else - scope = default_macro_scope (); - if (! scope) - scope = user_macro_scope (); - - expression_macro_lookup_func = standard_macro_lookup; - expression_macro_lookup_baton = (void *) scope; - - gdb_assert (! macro_original_text); - make_cleanup (scan_macro_cleanup, 0); - - { - int result = c_parse (); - do_cleanups (back_to); - return result; - } -} - - /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ @@ -395,7 +290,7 @@ const struct language_defn c_language_defn = array_row_major, macro_expansion_c, &exp_descriptor_standard, - c_preprocess_and_parse, + c_parse, c_error, null_post_parser, c_printchar, /* Print a character constant */ @@ -513,7 +408,7 @@ const struct language_defn cplus_language_defn = array_row_major, macro_expansion_c, &exp_descriptor_standard, - c_preprocess_and_parse, + c_parse, c_error, null_post_parser, c_printchar, /* Print a character constant */ @@ -550,7 +445,7 @@ const struct language_defn asm_language_defn = array_row_major, macro_expansion_c, &exp_descriptor_standard, - c_preprocess_and_parse, + c_parse, c_error, null_post_parser, c_printchar, /* Print a character constant */ @@ -592,7 +487,7 @@ const struct language_defn minimal_language_defn = array_row_major, macro_expansion_c, &exp_descriptor_standard, - c_preprocess_and_parse, + c_parse, c_error, null_post_parser, c_printchar, /* Print a character constant */ |