aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2011-11-15 10:22:55 +0000
committerTristan Gingold <gingold@gcc.gnu.org>2011-11-15 10:22:55 +0000
commite50e723eec48cdf285b27e51fead37b385d5f891 (patch)
treed4582430bbacc6d392241d140391b5fb7daa194c
parent7c209481147555ddd22296b1eff0fd1833588d35 (diff)
downloadgcc-e50e723eec48cdf285b27e51fead37b385d5f891.zip
gcc-e50e723eec48cdf285b27e51fead37b385d5f891.tar.gz
gcc-e50e723eec48cdf285b27e51fead37b385d5f891.tar.bz2
c-pragma.h (pragma_extern_prefix): Declare.
2011-11-15 Tristan Gingold <gingold@adacore.com> * 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. From-SVN: r181379
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-family/c-pragma.c3
-rw-r--r--gcc/c-family/c-pragma.h2
-rw-r--r--gcc/config/vms/vms-c.c37
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8e81d69..eab0ca4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2011-11-15 Tristan Gingold <gingold@adacore.com>
+
+ * 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 <avr@gjlay.de>
PR target/49868
diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c
index 7622f0b..930423b 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 04af94f..86681ae 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 eb4c635..19291b6 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);
}