2011-11-15 Tristan Gingold <gingold@adacore.com>
authorgingold <gingold@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Nov 2011 10:22:55 +0000 (10:22 +0000)
committergingold <gingold@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Nov 2011 10:22:55 +0000 (10:22 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181379 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-family/c-pragma.c
gcc/c-family/c-pragma.h
gcc/config/vms/vms-c.c

index 8e81d69..eab0ca4 100644 (file)
@@ -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
index 7622f0b..930423b 100644 (file)
@@ -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
index 04af94f..86681ae 100644 (file)
@@ -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 */
index eb4c635..19291b6 100644 (file)
@@ -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);
 }