diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e81d69718d2..eab0ca46c8bb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-11-15 Tristan Gingold + + * c-family/c-pragma.h (pragma_extern_prefix): Declare. + * c-family/c-pragma.c (pragma_extern_prefix): Make it public. + * config/vms/vms-c.c (saved_extern_prefix): New variable. + (vms_pragma_extern_prefix): New function. + (vms_c_register_pragma): Register vms_pragma_extern_prefix. + 2011-11-15 Georg-Johann Lay PR target/49868 diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index 7622f0b155e7..930423bcff62 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -494,7 +494,8 @@ add_to_renaming_pragma_list (tree oldname, tree newname) p->newname = newname; } -static GTY(()) tree pragma_extern_prefix; +/* The current prefix set by #pragma extern_prefix. */ +GTY(()) tree pragma_extern_prefix; /* #pragma extern_prefix "prefix" */ static void diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h index 04af94f3ddfe..86681ae99ccc 100644 --- a/gcc/c-family/c-pragma.h +++ b/gcc/c-family/c-pragma.h @@ -146,4 +146,6 @@ extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *, extern void c_pp_lookup_pragma (unsigned int, const char **, const char **); +extern GTY(()) tree pragma_extern_prefix; + #endif /* GCC_C_PRAGMA_H */ diff --git a/gcc/config/vms/vms-c.c b/gcc/config/vms/vms-c.c index eb4c63577a9e..19291b628777 100644 --- a/gcc/config/vms/vms-c.c +++ b/gcc/config/vms/vms-c.c @@ -227,6 +227,42 @@ vms_pragma_message (cpp_reader *pfile ATTRIBUTE_UNUSED) #endif } +/* Handle '#pragma __extern_prefix' */ + +static GTY(()) tree saved_extern_prefix; + +static void +vms_pragma_extern_prefix (cpp_reader * ARG_UNUSED (dummy)) +{ + enum cpp_ttype tok; + tree x; + + tok = pragma_lex (&x); + if (tok == CPP_NAME) + { + const char *op = IDENTIFIER_POINTER (x); + + if (!strcmp (op, "__save")) + saved_extern_prefix = pragma_extern_prefix; + else if (!strcmp (op, "__restore")) + pragma_extern_prefix = saved_extern_prefix; + else + warning (OPT_Wpragmas, + "malformed '#pragma __extern_prefix', ignoring"); + return; + } + else if (tok != CPP_STRING) + { + warning (OPT_Wpragmas, + "malformed '#pragma __extern_prefix', ignoring"); + } + else + { + /* Note that the length includes the null terminator. */ + pragma_extern_prefix = (TREE_STRING_LENGTH (x) > 1 ? x : NULL); + } +} + /* Add vms-specific pragma. */ void @@ -245,4 +281,5 @@ vms_c_register_pragma (void) c_register_pragma (NULL, "__extern_model", vms_pragma_extern_model); c_register_pragma (NULL, "extern_model", vms_pragma_extern_model); c_register_pragma (NULL, "__message", vms_pragma_message); + c_register_pragma (NULL, "__extern_prefix", vms_pragma_extern_prefix); }