diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-06-11 18:37:34 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-06-11 18:37:34 +0000 |
commit | 25692381cdcb8d2b29ef37fa6f7a2707d0943053 (patch) | |
tree | 202ae75e58b19cf2da840d299ec67598a6eef33b /libcpp | |
parent | fa683b760a396a8b6c03304f009306eb48da1b70 (diff) | |
download | gcc-25692381cdcb8d2b29ef37fa6f7a2707d0943053.tar.gz |
* include/cpplib.h (struct cpp_callbacks): Add user_builtin_macro
callback.
(enum cpp_builtin_type): Add BT_FIRST_USER and BT_LAST_USER.
(cpp_macro_definition): Remove const qual from second argument.
* macro.c (enter_macro_context): Call user_builtin_macro callback for
NODE_BUILTIN !NODE_USED macros.
(warn_of_redefinition): Likewise. Remove const qual from second
argument.
(cpp_macro_definition): Likewise.
* pch.c (write_macdef, save_macros): Call user_builtin_macro callback
for NODE_BUILTIN !NODE_USED macros.
* c-family/c-cppbuiltin.c: Include cpp-id-data.h.
(lazy_hex_fp_values, lazy_hex_fp_value_count): New variables.
(lazy_hex_fp_value): New function.
(builtin_define_with_hex_fp_value): Provide definitions lazily.
* Makefile.in (c-family/c-cppbuiltin.o): Depend on $(CPP_ID_DATA_H).
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160626 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 14 | ||||
-rw-r--r-- | libcpp/include/cpplib.h | 9 | ||||
-rw-r--r-- | libcpp/macro.c | 31 | ||||
-rw-r--r-- | libcpp/pch.c | 10 |
4 files changed, 52 insertions, 12 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index d52da05f937..2b3d224913f 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,17 @@ +2010-06-11 Jakub Jelinek <jakub@redhat.com> + + * include/cpplib.h (struct cpp_callbacks): Add user_builtin_macro + callback. + (enum cpp_builtin_type): Add BT_FIRST_USER and BT_LAST_USER. + (cpp_macro_definition): Remove const qual from second argument. + * macro.c (enter_macro_context): Call user_builtin_macro callback for + NODE_BUILTIN !NODE_USED macros. + (warn_of_redefinition): Likewise. Remove const qual from second + argument. + (cpp_macro_definition): Likewise. + * pch.c (write_macdef, save_macros): Call user_builtin_macro callback + for NODE_BUILTIN !NODE_USED macros. + 2010-06-10 Joseph Myers <joseph@codesourcery.com> * include/cpplib.h (struct cpp_options): Remove show_column. diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index ba79262f6cd..87d368e2925 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -509,6 +509,9 @@ struct cpp_callbacks /* Called whenever a macro is expanded or tested. Second argument is the location of the start of the current expansion. */ void (*used) (cpp_reader *, source_location, cpp_hashnode *); + + /* Callback that can change a user builtin into normal macro. */ + bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *); }; #ifdef VMS @@ -599,7 +602,9 @@ enum cpp_builtin_type BT_STDC, /* `__STDC__' */ BT_PRAGMA, /* `_Pragma' operator */ BT_TIMESTAMP, /* `__TIMESTAMP__' */ - BT_COUNTER /* `__COUNTER__' */ + BT_COUNTER, /* `__COUNTER__' */ + BT_FIRST_USER, /* User defined builtin macros. */ + BT_LAST_USER = BT_FIRST_USER + 31 }; #define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE)) @@ -726,7 +731,7 @@ extern const cpp_token *cpp_get_token (cpp_reader *); extern const cpp_token *cpp_get_token_with_location (cpp_reader *, source_location *); extern const unsigned char *cpp_macro_definition (cpp_reader *, - const cpp_hashnode *); + cpp_hashnode *); extern void _cpp_backup_tokens (cpp_reader *, unsigned int); extern const cpp_token *cpp_peek_token (cpp_reader *, int); diff --git a/libcpp/macro.c b/libcpp/macro.c index cbb0b0e7159..31de4156c64 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -65,7 +65,7 @@ static bool create_iso_definition (cpp_reader *, cpp_macro *); static cpp_token *alloc_expansion_token (cpp_reader *, cpp_macro *); static cpp_token *lex_expansion_token (cpp_reader *, cpp_macro *); -static bool warn_of_redefinition (cpp_reader *, const cpp_hashnode *, +static bool warn_of_redefinition (cpp_reader *, cpp_hashnode *, const cpp_macro *); static bool parse_params (cpp_reader *, cpp_macro *); static void check_trad_stringification (cpp_reader *, const cpp_macro *, @@ -835,7 +835,9 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node, if ((node->flags & NODE_BUILTIN) && !(node->flags & NODE_USED)) { node->flags |= NODE_USED; - if (pfile->cb.used_define) + if ((!pfile->cb.user_builtin_macro + || !pfile->cb.user_builtin_macro (pfile, node)) + && pfile->cb.used_define) pfile->cb.used_define (pfile, pfile->directive_line, node); } @@ -1430,7 +1432,7 @@ _cpp_backup_tokens (cpp_reader *pfile, unsigned int count) /* Returns nonzero if a macro redefinition warning is required. */ static bool -warn_of_redefinition (cpp_reader *pfile, const cpp_hashnode *node, +warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node, const cpp_macro *macro2) { const cpp_macro *macro1; @@ -1442,7 +1444,11 @@ warn_of_redefinition (cpp_reader *pfile, const cpp_hashnode *node, /* Suppress warnings for builtins that lack the NODE_WARN flag. */ if (node->flags & NODE_BUILTIN) - return false; + { + if (!pfile->cb.user_builtin_macro + || !pfile->cb.user_builtin_macro (pfile, node)) + return false; + } /* Redefinitions of conditional (context-sensitive) macros, on the other hand, must be allowed silently. */ @@ -1982,19 +1988,26 @@ check_trad_stringification (cpp_reader *pfile, const cpp_macro *macro, Caller is expected to generate the "#define" bit if needed. The returned text is temporary, and automatically freed later. */ const unsigned char * -cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node) +cpp_macro_definition (cpp_reader *pfile, cpp_hashnode *node) { unsigned int i, len; - const cpp_macro *macro = node->value.macro; + const cpp_macro *macro; unsigned char *buffer; if (node->type != NT_MACRO || (node->flags & NODE_BUILTIN)) { - cpp_error (pfile, CPP_DL_ICE, - "invalid hash type %d in cpp_macro_definition", node->type); - return 0; + if (node->type != NT_MACRO + || !pfile->cb.user_builtin_macro + || !pfile->cb.user_builtin_macro (pfile, node)) + { + cpp_error (pfile, CPP_DL_ICE, + "invalid hash type %d in cpp_macro_definition", + node->type); + return 0; + } } + macro = node->value.macro; /* Calculate length. */ len = NODE_LEN (node) + 2; /* ' ' and NUL. */ if (macro->fun_like) diff --git a/libcpp/pch.c b/libcpp/pch.c index 2fb7ba543e7..a6d8cea38d3 100644 --- a/libcpp/pch.c +++ b/libcpp/pch.c @@ -58,7 +58,9 @@ write_macdef (cpp_reader *pfile, cpp_hashnode *hn, void *file_p) return 1; case NT_MACRO: - if ((hn->flags & NODE_BUILTIN)) + if ((hn->flags & NODE_BUILTIN) + && (!pfile->cb.user_builtin_macro + || !pfile->cb.user_builtin_macro (pfile, hn))) return 1; { @@ -759,6 +761,12 @@ static int save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p) { struct save_macro_data *data = (struct save_macro_data *)data_p; + + if ((h->flags & NODE_BUILTIN) + && h->type == NT_MACRO + && r->cb.user_builtin_macro) + r->cb.user_builtin_macro (r, h); + if (h->type != NT_VOID && (h->flags & NODE_BUILTIN) == 0) { |