sol2-c.c (solaris_register_pragmas): Use c_register_pragma_with_expansion.
gcc: 2004-11-23 Daniel Jacobowitz <dan@codesourcery.com> Joseph Myers <joseph@codesourcery.com> * config/sol2-c.c (solaris_register_pragmas): Use c_register_pragma_with_expansion. * config/sol2.h (HANDLE_PRAGMA_PACK_WITH_EXPANSION): Define. * c-pragma.c (c_register_pragma): Update call to cpp_register_pragma. (c_register_pragma_with_expansion): New function. (init_pragma): Honor HANDLE_PRAGMA_PACK_WITH_EXPANSION. * c-pragma.h (c_register_pragma_with_expansion): New prototype. * doc/extend.texi (Solaris Pragmas): Mention macro expansion for #pragma align. * doc/tm.texi (c_register_pragma_with_expansion, HANDLE_PRAGMA_PACK_WITH_EXPANSION): Document. gcc/testsuite: 2004-11-23 Daniel Jacobowitz <dan@codesourcery.com> * gcc.dg/pragma-align-2.c: Test macro expansion. * gcc.dg/pragma-pack-2.c: New test. libcpp: 2004-11-23 Daniel Jacobowitz <dan@codesourcery.com> Joseph Myers <joseph@codesourcery.com> * internal.h (struct lexer_state): Add in_deferred_pragma. * directives.c (struct pragma_entry): Add allow_expansion. (insert_pragma_entry): Take allow_expansion flag. (register_pragma): Likewise. (cpp_register_pragma): Likewise. (_cpp_init_internal_pragmas): Update calls to cpp_register_pragma. (do_pragma): Honor allow_expansion. (cpp_handle_deferred_pragma): Set in_deferred_pragma. * include/cpplib.h (cpp_register_pragma): Update prototype. Co-Authored-By: Joseph Myers <joseph@codesourcery.com> From-SVN: r91117
This commit is contained in:
parent
a996709e40
commit
b5b3e36a98
14 changed files with 171 additions and 25 deletions
|
@ -45,6 +45,7 @@ struct pragma_entry
|
|||
struct pragma_entry *next;
|
||||
const cpp_hashnode *pragma; /* Name and length. */
|
||||
bool is_nspace;
|
||||
bool allow_expansion;
|
||||
bool is_internal;
|
||||
union {
|
||||
pragma_cb handler;
|
||||
|
@ -108,9 +109,9 @@ static struct pragma_entry *insert_pragma_entry (cpp_reader *,
|
|||
struct pragma_entry **,
|
||||
const cpp_hashnode *,
|
||||
pragma_cb,
|
||||
bool);
|
||||
bool, bool);
|
||||
static void register_pragma (cpp_reader *, const char *, const char *,
|
||||
pragma_cb, bool);
|
||||
pragma_cb, bool, bool);
|
||||
static int count_registered_pragmas (struct pragma_entry *);
|
||||
static char ** save_registered_pragmas (struct pragma_entry *, char **);
|
||||
static char ** restore_registered_pragmas (cpp_reader *, struct pragma_entry *,
|
||||
|
@ -964,7 +965,7 @@ lookup_pragma_entry (struct pragma_entry *chain, const cpp_hashnode *pragma)
|
|||
static struct pragma_entry *
|
||||
insert_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain,
|
||||
const cpp_hashnode *pragma, pragma_cb handler,
|
||||
bool internal)
|
||||
bool allow_expansion, bool internal)
|
||||
{
|
||||
struct pragma_entry *new;
|
||||
|
||||
|
@ -982,6 +983,7 @@ insert_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain,
|
|||
new->u.space = NULL;
|
||||
}
|
||||
|
||||
new->allow_expansion = allow_expansion;
|
||||
new->is_internal = internal;
|
||||
new->next = *chain;
|
||||
*chain = new;
|
||||
|
@ -990,12 +992,13 @@ insert_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain,
|
|||
|
||||
/* Register a pragma NAME in namespace SPACE. If SPACE is null, it
|
||||
goes in the global namespace. HANDLER is the handler it will call,
|
||||
which must be non-NULL. INTERNAL is true if this is a pragma
|
||||
registered by cpplib itself, false if it is registered via
|
||||
which must be non-NULL. If ALLOW_EXPANSION is set, allow macro
|
||||
expansion while parsing pragma NAME. INTERNAL is true if this is a
|
||||
pragma registered by cpplib itself, false if it is registered via
|
||||
cpp_register_pragma */
|
||||
static void
|
||||
register_pragma (cpp_reader *pfile, const char *space, const char *name,
|
||||
pragma_cb handler, bool internal)
|
||||
pragma_cb handler, bool allow_expansion, bool internal)
|
||||
{
|
||||
struct pragma_entry **chain = &pfile->pragmas;
|
||||
struct pragma_entry *entry;
|
||||
|
@ -1009,7 +1012,8 @@ register_pragma (cpp_reader *pfile, const char *space, const char *name,
|
|||
node = cpp_lookup (pfile, U space, strlen (space));
|
||||
entry = lookup_pragma_entry (*chain, node);
|
||||
if (!entry)
|
||||
entry = insert_pragma_entry (pfile, chain, node, NULL, internal);
|
||||
entry = insert_pragma_entry (pfile, chain, node, NULL,
|
||||
allow_expansion, internal);
|
||||
else if (!entry->is_nspace)
|
||||
goto clash;
|
||||
chain = &entry->u.space;
|
||||
|
@ -1032,17 +1036,20 @@ register_pragma (cpp_reader *pfile, const char *space, const char *name,
|
|||
cpp_error (pfile, CPP_DL_ICE, "#pragma %s is already registered", name);
|
||||
}
|
||||
else
|
||||
insert_pragma_entry (pfile, chain, node, handler, internal);
|
||||
insert_pragma_entry (pfile, chain, node, handler, allow_expansion,
|
||||
internal);
|
||||
}
|
||||
|
||||
/* Register a pragma NAME in namespace SPACE. If SPACE is null, it
|
||||
goes in the global namespace. HANDLER is the handler it will call,
|
||||
which must be non-NULL. This function is exported from libcpp. */
|
||||
which must be non-NULL. If ALLOW_EXPANSION is set, allow macro
|
||||
expansion while parsing pragma NAME. This function is exported
|
||||
from libcpp. */
|
||||
void
|
||||
cpp_register_pragma (cpp_reader *pfile, const char *space, const char *name,
|
||||
pragma_cb handler)
|
||||
pragma_cb handler, bool allow_expansion)
|
||||
{
|
||||
register_pragma (pfile, space, name, handler, false);
|
||||
register_pragma (pfile, space, name, handler, allow_expansion, false);
|
||||
}
|
||||
|
||||
/* Register the pragmas the preprocessor itself handles. */
|
||||
|
@ -1050,12 +1057,14 @@ void
|
|||
_cpp_init_internal_pragmas (cpp_reader *pfile)
|
||||
{
|
||||
/* Pragmas in the global namespace. */
|
||||
register_pragma (pfile, 0, "once", do_pragma_once, true);
|
||||
register_pragma (pfile, 0, "once", do_pragma_once, false, true);
|
||||
|
||||
/* New GCC-specific pragmas should be put in the GCC namespace. */
|
||||
register_pragma (pfile, "GCC", "poison", do_pragma_poison, true);
|
||||
register_pragma (pfile, "GCC", "system_header", do_pragma_system_header, true);
|
||||
register_pragma (pfile, "GCC", "dependency", do_pragma_dependency, true);
|
||||
register_pragma (pfile, "GCC", "poison", do_pragma_poison, false, true);
|
||||
register_pragma (pfile, "GCC", "system_header", do_pragma_system_header,
|
||||
false, true);
|
||||
register_pragma (pfile, "GCC", "dependency", do_pragma_dependency,
|
||||
false, true);
|
||||
}
|
||||
|
||||
/* Return the number of registered pragmas in PE. */
|
||||
|
@ -1176,7 +1185,14 @@ do_pragma (cpp_reader *pfile)
|
|||
numbers in place. */
|
||||
if (pfile->cb.line_change)
|
||||
(*pfile->cb.line_change) (pfile, pragma_token, false);
|
||||
/* Never expand macros if handling a deferred pragma, since
|
||||
the macro definitions now applicable may be different
|
||||
from those at the point the pragma appeared. */
|
||||
if (p->allow_expansion && !pfile->state.in_deferred_pragma)
|
||||
pfile->state.prevent_expansion--;
|
||||
(*p->u.handler) (pfile);
|
||||
if (p->allow_expansion && !pfile->state.in_deferred_pragma)
|
||||
pfile->state.prevent_expansion++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1430,6 +1446,7 @@ cpp_handle_deferred_pragma (cpp_reader *pfile, const cpp_string *s)
|
|||
pfile->context->macro = 0;
|
||||
pfile->context->prev = 0;
|
||||
pfile->cb.line_change = NULL;
|
||||
pfile->state.in_deferred_pragma = true;
|
||||
CPP_OPTION (pfile, defer_pragmas) = false;
|
||||
|
||||
run_directive (pfile, T_PRAGMA, (const char *)s->text, s->len);
|
||||
|
@ -1439,6 +1456,7 @@ cpp_handle_deferred_pragma (cpp_reader *pfile, const cpp_string *s)
|
|||
pfile->cur_token = saved_cur_token;
|
||||
pfile->cur_run = saved_cur_run;
|
||||
pfile->cb.line_change = saved_line_change;
|
||||
pfile->state.in_deferred_pragma = false;
|
||||
CPP_OPTION (pfile, defer_pragmas) = saved_defer_pragmas;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue