This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Add PowerPC .gnu_attribute for the vector ABI
- From: Daniel Jacobowitz <drow at false dot org>
- To: binutils at sourceware dot org
- Date: Tue, 7 Aug 2007 12:00:11 -0400
- Subject: 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*-*-*