diff mbox

[ia64/vms] : Reimplement common_object

Message ID 4E34678F-E42B-422E-8A62-DA8D987F705E@adacore.com
State New
Headers show

Commit Message

Tristan Gingold March 30, 2012, 1:25 p.m. UTC
Hi,

this attribute is used for some specialized Ada constructs available only on VMS.
The current implementation is flawed when there are two (or more) variables with the same common_object.
This patch uses the same mechanism as the one used by Alpha VMS.

Manually tested on ia64-hp-openvms.

Committed on trunk.

Tristan.

2012-03-30  Tristan Gingold  <gingold@adacore.com>

	* config/ia64/ia64.c (ia64_section_type_flags): Remove
	common_object attribute handling.
	(SECTION_VMS_OVERLAY): Remove
	(ia64_vms_common_object_attribute): Replace abort with an assert.
	Do not set DECL_SECTION_NAME.
	(ia64_vms_output_aligned_decl_common): Handle common_object
	attribute.
	(ia64_vms_elf_asm_named_section): Remove.
	* config/ia64/vms.h (TARGET_ASM_NAMED_SECTION): Remove.
diff mbox

Patch

Index: gcc/config/ia64/ia64.c
===================================================================
--- gcc/config/ia64/ia64.c	(revision 186009)
+++ gcc/config/ia64/ia64.c	(working copy)
@@ -740,9 +740,6 @@ 
   return NULL_TREE;
 }
 
-/* The section must have global and overlaid attributes.  */
-#define SECTION_VMS_OVERLAY SECTION_MACH_DEP
-
 /* Part of the low level implementation of DEC Ada pragma Common_Object which
    enables the shared use of variables stored in overlaid linker areas
    corresponding to the use of Fortran COMMON.  */
@@ -753,24 +750,18 @@ 
 				  bool *no_add_attrs)
 {
     tree decl = *node;
-    tree id, val;
-    if (! DECL_P (decl))
-      abort ();
+    tree id;
+
+    gcc_assert (DECL_P (decl));
   
     DECL_COMMON (decl) = 1;
     id = TREE_VALUE (args);
-    if (TREE_CODE (id) == IDENTIFIER_NODE)
-      val = build_string (IDENTIFIER_LENGTH (id), IDENTIFIER_POINTER (id));
-    else if (TREE_CODE (id) == STRING_CST)
-      val = id;
-    else
+    if (TREE_CODE (id) != IDENTIFIER_NODE && TREE_CODE (id) != STRING_CST)
       {
-	warning (OPT_Wattributes,
-		 "%qE attribute requires a string constant argument", name);
+	error ("%qE attribute requires a string constant argument", name);
 	*no_add_attrs = true;
 	return NULL_TREE;
       }
-    DECL_SECTION_NAME (decl) = val;
     return NULL_TREE;
 }
 
@@ -783,50 +774,31 @@ 
 {
   tree attr = DECL_ATTRIBUTES (decl);
 
-  /* As common_object attribute set DECL_SECTION_NAME check it before
-     looking up the attribute.  */
-  if (DECL_SECTION_NAME (decl) && attr)
+  if (attr)
     attr = lookup_attribute ("common_object", attr);
-  else
-    attr = NULL_TREE;
-
-  if (!attr)
+  if (attr)
     {
-      /*  Code from elfos.h.  */
-      fprintf (file, "%s", COMMON_ASM_OP);
-      assemble_name (file, name);
-      fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
-	       size, align / BITS_PER_UNIT);
-    }
-  else
-    {
-      ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
-      ASM_OUTPUT_LABEL (file, name);
-      ASM_OUTPUT_SKIP (file, size ? size : 1);
-    }
-}
+      tree id = TREE_VALUE (TREE_VALUE (attr));
+      const char *name;
 
-/* Definition of TARGET_ASM_NAMED_SECTION for VMS.  */
+      if (TREE_CODE (id) == IDENTIFIER_NODE)
+        name = IDENTIFIER_POINTER (id);
+      else if (TREE_CODE (id) == STRING_CST)
+        name = TREE_STRING_POINTER (id);
+      else
+        abort ();
 
-void
-ia64_vms_elf_asm_named_section (const char *name, unsigned int flags,
-				tree decl)
-{
-  if (!(flags & SECTION_VMS_OVERLAY))
-    {
-      default_elf_asm_named_section (name, flags, decl);
-      return;
+      fprintf (file, "\t.vms_common\t\"%s\",", name);
     }
-  if (flags != (SECTION_VMS_OVERLAY | SECTION_WRITE))
-    abort ();
+  else
+    fprintf (file, "%s", COMMON_ASM_OP);
 
-  if (flags & SECTION_DECLARED)
-    {
-      fprintf (asm_out_file, "\t.section\t%s\n", name);
-      return;
-    }
+  /*  Code from elfos.h.  */
+  assemble_name (file, name);
+  fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u",
+           size, align / BITS_PER_UNIT);
 
-  fprintf (asm_out_file, "\t.section\t%s,\"awgO\"\n", name);
+  fputc ('\n', file);
 }
 
 static void
@@ -10536,12 +10508,6 @@ 
       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
     flags = SECTION_SMALL;
 
-#if TARGET_ABI_OPEN_VMS
-  if (decl && DECL_ATTRIBUTES (decl)
-      && lookup_attribute ("common_object", DECL_ATTRIBUTES (decl)))
-    flags |= SECTION_VMS_OVERLAY;
-#endif
-
   flags |= default_section_type_flags (decl, name, reloc);
   return flags;
 }
Index: gcc/config/ia64/vms.h
===================================================================
--- gcc/config/ia64/vms.h	(revision 186009)
+++ gcc/config/ia64/vms.h	(working copy)
@@ -121,9 +121,6 @@ 
 #undef TARGET_VALID_POINTER_MODE
 #define TARGET_VALID_POINTER_MODE ia64_vms_valid_pointer_mode
 
-#undef TARGET_ASM_NAMED_SECTION
-#define TARGET_ASM_NAMED_SECTION ia64_vms_elf_asm_named_section
-
 /* Define this macro if it is advisable to hold scalars in registers
    in a wider mode than that declared by the program.  In such cases,
    the value is constrained to be within the bounds of the declared