2012-03-06 Tristan Gingold <gingold@adacore.com>
authorgingold <gingold@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Mar 2012 10:46:32 +0000 (10:46 +0000)
committergingold <gingold@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Mar 2012 10:46:32 +0000 (10:46 +0000)
* config/vms/vms-c.c (vms_pragma_nomember_alignment): Handle
octaword.
(external_model_kind): Improve documentation.
(vms_pragma_extern_model): Handle relaxed_redef.
(vms_c_register_pragma): Allow expansion for nomember_alignment.

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

gcc/ChangeLog
gcc/config/vms/vms-c.c

index 6578c59..4f629fa 100644 (file)
@@ -1,3 +1,11 @@
+2012-03-06  Tristan Gingold  <gingold@adacore.com>
+
+       * config/vms/vms-c.c (vms_pragma_nomember_alignment): Handle
+       octaword.
+       (external_model_kind): Improve documentation.
+       (vms_pragma_extern_model): Handle relaxed_redef.
+       (vms_c_register_pragma): Allow expansion for nomember_alignment.
+
 2012-03-06  Georg-Johann Lay  <avr@gjlay.de>
 
        * doc/invoke.texi (AVR Options): -mmcu=: Document the XMEGA cores.
index b3e0d95..4a2d19c 100644 (file)
@@ -125,6 +125,8 @@ vms_pragma_nomember_alignment (cpp_reader *pfile ATTRIBUTE_UNUSED)
         maximum_field_alignment = 4 * BITS_PER_UNIT;
       else if (strcmp (arg, "quadword") == 0)
         maximum_field_alignment = 8 * BITS_PER_UNIT;
+      else if (strcmp (arg, "octaword") == 0)
+        maximum_field_alignment = 16 * BITS_PER_UNIT;
       else
         {
           error ("unhandled alignment for '#pragma nomember_alignment'");
@@ -145,17 +147,33 @@ vms_pragma_nomember_alignment (cpp_reader *pfile ATTRIBUTE_UNUSED)
     }
 }
 
-/* The 'extern model' for public data.  */
+/* The 'extern model' for public data.  This drives how the following
+   declarations are handled:
+   1) extern int name;
+   2) int name;
+   3) int name = 5;
+   See below for the behaviour as implemented by the native compiler.
+*/
 
 enum extern_model_kind
 {
-  /* Create one overlaid section per variable.  */
+  /* Create one overlaid section per variable.  All the above declarations (1,
+      2 and 3) are handled the same way: they create an overlaid section named
+      NAME (and initialized only for 3).  No global symbol is created.
+      This is the VAX C behavior.  */
   extern_model_common_block,
 
-  /* Like unix: multiple not-initialized declarations are allowed.  */
+  /* Like unix: multiple not-initialized declarations are allowed.
+     Only one initialized definition (case 3) is allows, but multiple
+     uninitialize definition (case 2) are allowed.
+     For case 2, this creates both a section named NAME and a global symbol.
+     For case 3, this creates a conditional global symbol defenition and a
+     conditional section definition.
+     This is the traditional UNIX C behavior.  */
   extern_model_relaxed_refdef,
 
-  /* Like -fno-common.  */
+  /* Like -fno-common.  Only one definition (cases 2 and 3) are allowed.
+     This is the ANSI-C model.  */
   extern_model_strict_refdef,
 
   /* Declarations creates symbols without storage.  */
@@ -192,6 +210,8 @@ vms_pragma_extern_model (cpp_reader *pfile ATTRIBUTE_UNUSED)
     saved_extern_model = current_extern_model;
   else if (strcmp (arg, "restore") == 0)
     current_extern_model = saved_extern_model;
+  else if (strcmp (arg, "relaxed_refdef") == 0)
+    current_extern_model = extern_model_relaxed_refdef;
   else if (strcmp (arg, "strict_refdef") == 0)
     current_extern_model = extern_model_strict_refdef;
   else if (strcmp (arg, "common_block") == 0)
@@ -274,10 +294,10 @@ vms_c_register_pragma (void)
   c_register_pragma (NULL, "standard", vms_pragma_standard);
   c_register_pragma (NULL, "__member_alignment", vms_pragma_member_alignment);
   c_register_pragma (NULL, "member_alignment", vms_pragma_member_alignment);
-  c_register_pragma (NULL, "__nomember_alignment",
-                     vms_pragma_nomember_alignment);
-  c_register_pragma (NULL, "nomember_alignment",
-                     vms_pragma_nomember_alignment);
+  c_register_pragma_with_expansion (NULL, "__nomember_alignment",
+                                    vms_pragma_nomember_alignment);
+  c_register_pragma_with_expansion (NULL, "nomember_alignment",
+                                    vms_pragma_nomember_alignment);
   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);