X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-pragma.c;h=cc1dd280359a59c7e3855c5b3857429426bf4c3b;hb=d75329f03777b57889207aaea317e8dafa3320a1;hp=fd2f7f714ad7afebbd787b46b033dced8e3dabd1;hpb=ce45a448519f33c37b3ab6819fed86b28c267ab8;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c index fd2f7f714ad..cc1dd280359 100644 --- a/gcc/c-pragma.c +++ b/gcc/c-pragma.c @@ -95,7 +95,7 @@ pop_alignment (tree id) align_stack * entry; if (alignment_stack == NULL) - GCC_BAD("#pragma pack (pop) encountered without matching #pragma pack (push)"); + GCC_BAD ("#pragma pack (pop) encountered without matching #pragma pack (push)"); /* If we got an identifier, strip away everything above the target entry so that the next step will restore the state just below it. */ @@ -122,9 +122,9 @@ pop_alignment (tree id) #else /* not HANDLE_PRAGMA_PACK_PUSH_POP */ #define SET_GLOBAL_ALIGNMENT(ALIGN) (maximum_field_alignment = (ALIGN)) #define push_alignment(ID, N) \ - GCC_BAD("#pragma pack(push[, id], ) is not supported on this target") + GCC_BAD ("#pragma pack(push[, id], ) is not supported on this target") #define pop_alignment(ID) \ - GCC_BAD("#pragma pack(pop[, id], ) is not supported on this target") + GCC_BAD ("#pragma pack(pop[, id], ) is not supported on this target") #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */ /* #pragma pack () @@ -294,6 +294,33 @@ maybe_apply_pragma_weak (tree decl) } } +/* Process all "#pragma weak A = B" directives where we have not seen + a decl for A. */ +void +maybe_apply_pending_pragma_weaks (void) +{ + tree *p, t, alias_id, id, decl, *next; + + for (p = &pending_weaks; (t = *p) ; p = next) + { + next = &TREE_CHAIN (t); + alias_id = TREE_PURPOSE (t); + id = TREE_VALUE (t); + + if (TREE_VALUE (t) == NULL) + continue; + + decl = build_decl (FUNCTION_DECL, alias_id, default_function_type); + + DECL_ARTIFICIAL (decl) = 1; + TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) = 1; + DECL_WEAK (decl) = 1; + + assemble_alias (decl, id); + } +} + /* #pragma weak name [= value] */ static void handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy)) @@ -330,6 +357,11 @@ void maybe_apply_pragma_weak (tree ARG_UNUSED (decl)) { } + +void +maybe_apply_pending_pragma_weaks (void) +{ +} #endif /* HANDLE_PRAGMA_WEAK */ /* GCC supports two #pragma directives for renaming the external @@ -618,7 +650,7 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED) visibility_options.inpragma = 1; } if (c_lex (&x) != CPP_CLOSE_PAREN) - GCC_BAD ("missing '(' after %<#pragma GCC visibility push%> - ignored"); + GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored"); } } if (c_lex (&x) != CPP_EOF) @@ -627,13 +659,20 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED) #endif -/* Front-end wrapper for pragma registration to avoid dragging +/* Front-end wrappers for pragma registration to avoid dragging cpplib.h in almost everywhere. */ void c_register_pragma (const char *space, const char *name, void (*handler) (struct cpp_reader *)) { - cpp_register_pragma (parse_in, space, name, handler); + cpp_register_pragma (parse_in, space, name, handler, 0); +} + +void +c_register_pragma_with_expansion (const char *space, const char *name, + void (*handler) (struct cpp_reader *)) +{ + cpp_register_pragma (parse_in, space, name, handler, 1); } /* Set up front-end pragmas. */ @@ -641,8 +680,12 @@ void init_pragma (void) { #ifdef HANDLE_PRAGMA_PACK +#ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION + c_register_pragma_with_expansion (0, "pack", handle_pragma_pack); +#else c_register_pragma (0, "pack", handle_pragma_pack); #endif +#endif #ifdef HANDLE_PRAGMA_WEAK c_register_pragma (0, "weak", handle_pragma_weak); #endif