This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[ia64/vms]: Reimplement common_object


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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]