cpplib.h (struct cpp_callbacks): Add user_builtin_macro callback.

* 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).

From-SVN: r160626
This commit is contained in:
Jakub Jelinek
2010-06-11 20:37:34 +02:00
committed by Jakub Jelinek
parent 7b14477e38
commit 8e680db5b6
7 changed files with 130 additions and 14 deletions

View File

@@ -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.

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)
{