This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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]

Add PowerPC .gnu_attribute for the vector ABI


This patch adds merging support for a .gnu_attribute which describes
the vector ABI: "generic", AltiVec, SPE, or don't-care.  I think this
is the most sensible arrangement, since the AltiVec and SPE
alternatives can not coexist.

Tested on powerpc-linux, along with GCC patches to generate it and
GDB patches to use it.  Is this OK?

-- 
Daniel Jacobowitz
CodeSourcery

2007-08-07  Daniel Jacobowitz  <dan@codesourcery.com>

	* elf32-ppc.c (ppc_elf_merge_obj_attributes): Add support for
	Tag_GNU_Power_ABI_Vector.

	* readelf.c (display_power_gnu_attribute): Add support for
	Tag_GNU_Power_ABI_Vector.

	* ppc.h (Tag_GNU_Power_ABI_Vector): New.

	* ld-powerpc/attr-gnu-8-1.s, ld-powerpc/attr-gnu-8-11.d,
	ld-powerpc/attr-gnu-8-3.s, ld-powerpc/attr-gnu-8-31.d: New.

Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.220
diff -u -p -r1.220 elf32-ppc.c
--- bfd/elf32-ppc.c	10 Jul 2007 07:42:30 -0000	1.220
+++ bfd/elf32-ppc.c	7 Aug 2007 15:54:34 -0000
@@ -3601,8 +3601,8 @@ ppc_elf_check_relocs (bfd *abfd,
 static bfd_boolean
 ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
 {
-  obj_attribute *in_attr;
-  obj_attribute *out_attr;
+  obj_attribute *in_attr, *in_attrs;
+  obj_attribute *out_attr, *out_attrs;
 
   if (!elf_known_obj_attributes_proc (obfd)[0].i)
     {
@@ -3616,33 +3616,75 @@ ppc_elf_merge_obj_attributes (bfd *ibfd,
       return TRUE;
     }
 
+  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
+  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
+
   /* Check for conflicting Tag_GNU_Power_ABI_FP attributes and merge
      non-conflicting ones.  */
-  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
-  out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
-  if (in_attr[Tag_GNU_Power_ABI_FP].i != out_attr[Tag_GNU_Power_ABI_FP].i)
-    {
-      out_attr[Tag_GNU_Power_ABI_FP].type = 1;
-      if (out_attr[Tag_GNU_Power_ABI_FP].i == 0)
-	out_attr[Tag_GNU_Power_ABI_FP].i = in_attr[Tag_GNU_Power_ABI_FP].i;
-      else if (in_attr[Tag_GNU_Power_ABI_FP].i == 0)
+  in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
+  out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
+  if (in_attr->i != out_attr->i)
+    {
+      out_attr->type = 1;
+      if (out_attr->i == 0)
+	out_attr->i = in_attr->i;
+      else if (in_attr->i == 0)
 	;
-      else if (out_attr[Tag_GNU_Power_ABI_FP].i == 1
-	       && in_attr[Tag_GNU_Power_ABI_FP].i == 2)
+      else if (out_attr->i == 1 && in_attr->i == 2)
 	_bfd_error_handler
 	  (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
-      else if (out_attr[Tag_GNU_Power_ABI_FP].i == 2
-	       && in_attr[Tag_GNU_Power_ABI_FP].i == 1)
+      else if (out_attr->i == 2 && in_attr->i == 1)
 	_bfd_error_handler
 	  (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
-      else if (in_attr[Tag_GNU_Power_ABI_FP].i > 2)
+      else if (in_attr->i > 2)
 	_bfd_error_handler
 	  (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
-	   in_attr[Tag_GNU_Power_ABI_FP].i);
+	   in_attr->i);
       else
 	_bfd_error_handler
 	  (_("Warning: %B uses unknown floating point ABI %d"), obfd,
-	   out_attr[Tag_GNU_Power_ABI_FP].i);
+	   out_attr->i);
+    }
+
+  /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
+     merge non-conflicting ones.  */
+  in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
+  out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
+  if (in_attr->i != out_attr->i)
+    {
+      const char *in_abi = NULL, *out_abi = NULL;
+
+      switch (in_attr->i)
+	{
+	case 1: in_abi = "generic"; break;
+	case 2: in_abi = "AltiVec"; break;
+	case 3: in_abi = "SPE"; break;
+	}
+
+      switch (out_attr->i)
+	{
+	case 1: out_abi = "generic"; break;
+	case 2: out_abi = "AltiVec"; break;
+	case 3: out_abi = "SPE"; break;
+	}
+
+      out_attr->type = 1;
+      if (out_attr->i == 0)
+	out_attr->i = in_attr->i;
+      else if (in_attr->i == 0)
+	;
+      else if (in_abi == NULL)
+	_bfd_error_handler
+	  (_("Warning: %B uses unknown vector ABI %d"), ibfd,
+	   in_attr->i);
+      else if (out_abi == NULL)
+	_bfd_error_handler
+	  (_("Warning: %B uses unknown vector ABI %d"), obfd,
+	   in_attr->i);
+      else
+	_bfd_error_handler
+	  (_("Warning: %B uses vector ABI \"%s\", %B uses \"%s\""),
+	   ibfd, obfd, in_abi, out_abi);
     }
 
   /* Merge Tag_compatibility attributes and any common GNU ones.  */
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.372
diff -u -p -r1.372 readelf.c
--- binutils/readelf.c	27 Jul 2007 00:48:30 -0000	1.372
+++ binutils/readelf.c	7 Aug 2007 15:54:34 -0000
@@ -8380,6 +8380,32 @@ display_power_gnu_attribute (unsigned ch
       return p;
    }
 
+  if (tag == Tag_GNU_Power_ABI_Vector)
+    {
+      val = read_uleb128 (p, &len);
+      p += len;
+      printf ("  Tag_GNU_Power_ABI_Vector: ");
+      switch (val)
+	{
+	case 0:
+	  printf ("Any\n");
+	  break;
+	case 1:
+	  printf ("Generic\n");
+	  break;
+	case 2:
+	  printf ("AltiVec\n");
+	  break;
+	case 3:
+	  printf ("SPE\n");
+	  break;
+	default:
+	  printf ("??? (%d)\n", val);
+	  break;
+	}
+      return p;
+   }
+
   if (tag & 1)
     type = 1; /* String.  */
   else
Index: include/elf/ppc.h
===================================================================
RCS file: /cvs/src/src/include/elf/ppc.h,v
retrieving revision 1.19
diff -u -p -r1.19 ppc.h
--- include/elf/ppc.h	30 Jun 2007 00:03:40 -0000	1.19
+++ include/elf/ppc.h	7 Aug 2007 15:54:35 -0000
@@ -180,6 +180,11 @@ enum
 			       soft-float; 0 for not tagged or not
 			       using any ABIs affected by the
 			       differences.  */
+
+  /* Value 1 for general purpose registers only, 2 for AltiVec
+     registers, 3 for SPE registers; 0 for not tagged or not using any
+     ABIs affected by the differences.  */
+  Tag_GNU_Power_ABI_Vector = 8,
 };
 
 #endif /* _ELF_PPC_H */
Index: ld/testsuite/ld-powerpc/attr-gnu-8-1.s
===================================================================
RCS file: ld/testsuite/ld-powerpc/attr-gnu-8-1.s
diff -N ld/testsuite/ld-powerpc/attr-gnu-8-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-powerpc/attr-gnu-8-1.s	7 Aug 2007 15:54:35 -0000
@@ -0,0 +1 @@
+.gnu_attribute 8,1
Index: ld/testsuite/ld-powerpc/attr-gnu-8-11.d
===================================================================
RCS file: ld/testsuite/ld-powerpc/attr-gnu-8-11.d
diff -N ld/testsuite/ld-powerpc/attr-gnu-8-11.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-powerpc/attr-gnu-8-11.d	7 Aug 2007 15:54:35 -0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-8-1.s
+#source: attr-gnu-8-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+  Tag_GNU_Power_ABI_Vector: Generic
Index: ld/testsuite/ld-powerpc/attr-gnu-8-3.s
===================================================================
RCS file: ld/testsuite/ld-powerpc/attr-gnu-8-3.s
diff -N ld/testsuite/ld-powerpc/attr-gnu-8-3.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-powerpc/attr-gnu-8-3.s	7 Aug 2007 15:54:35 -0000
@@ -0,0 +1 @@
+.gnu_attribute 8,3
Index: ld/testsuite/ld-powerpc/attr-gnu-8-31.d
===================================================================
RCS file: ld/testsuite/ld-powerpc/attr-gnu-8-31.d
diff -N ld/testsuite/ld-powerpc/attr-gnu-8-31.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-powerpc/attr-gnu-8-31.d	7 Aug 2007 15:54:35 -0000
@@ -0,0 +1,6 @@
+#source: attr-gnu-8-3.s
+#source: attr-gnu-8-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses vector ABI "SPE", .* uses "generic"
+#target: powerpc*-*-*


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