]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* elf32-ppc.c (ppc_elf_merge_obj_attributes): Add support for
authorDaniel Jacobowitz <drow@false.org>
Thu, 25 Oct 2007 15:20:24 +0000 (15:20 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 25 Oct 2007 15:20:24 +0000 (15:20 +0000)
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-2.s, ld-powerpc/attr-gnu-8-23.d,
ld-powerpc/attr-gnu-8-3.s, ld-powerpc/attr-gnu-8-31.d: New.
* ld-powerpc/powerpc.exp: Run new tests.

14 files changed:
bfd/ChangeLog
bfd/elf32-ppc.c
binutils/ChangeLog
binutils/readelf.c
include/elf/ChangeLog
include/elf/ppc.h
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/attr-gnu-8-1.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-8-11.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-8-2.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-8-23.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-8-3.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-8-31.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/powerpc.exp

index 27f12d936cca578da3557c65014d7c3e9f449d82..7034943990e22dd29269fca2db4f44f3613cef4a 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-25  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * elf32-ppc.c (ppc_elf_merge_obj_attributes): Add support for
+       Tag_GNU_Power_ABI_Vector.
+
 2007-10-25  Joseph Myers  <joseph@codesourcery.com>
 
        * elfxx-mips.c (_bfd_mips_elf_modify_segment_map): Do not add
index 68804ad806c56b1063160638d122b79b103c10d5..a85544012d87ceb66a81c63f965c49b49b2d1a28 100644 (file)
@@ -3603,8 +3603,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)
     {
@@ -3618,33 +3618,84 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
       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)
+  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[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)
+      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)
+       ;
+      /* For now, allow generic to transition to AltiVec or SPE
+        without a warning.  If GCC marked files with their stack
+        alignment and used don't-care markings for files which are
+        not affected by the vector ABI, we could warn about this
+        case too.  */
+      else if (out_attr->i == 1)
+       out_attr->i = in_attr->i;
+      else if (in_attr->i == 1)
+       ;
+      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 e9adcc49176b57175836005df1fa76d83f558a86..b4e8f6c619edc531961ccbe625d6a7f0c33dde92 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-25  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * readelf.c (display_power_gnu_attribute): Add support for
+       Tag_GNU_Power_ABI_Vector.
+
 2007-10-25  Carlos Eduardo Seo  <cseo@linux.vnet.ibm.com>
 
        * readelf.c (get_note_type): Handle NT_PPC_VMX.
index abef69c1958de1e4d67ab19d6d3b26f2bc6949f0..0ffc22b051300fa03250ea86adf590851db0685d 100644 (file)
@@ -8553,6 +8553,32 @@ display_power_gnu_attribute (unsigned char *p, int tag)
       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 e8e12ac5092d72e3e1cd2dac96b80d62b4c0f6a1..a9a1e12fba81ac17be93873991757d5a8eca8490 100644 (file)
@@ -1,3 +1,7 @@
+2007-10-25  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * ppc.h (Tag_GNU_Power_ABI_Vector): New.
+
 2007-10-19  Nick Clifton  <nickc@redhat.com>
 
        * mn10300.h: Add R_MN10300_SYM_DIFF reloc.
index fe48814d86f208a93df8d90c870a4e5eb0c31c65..5d4462b0694ee8aae4dfeeac49d6cbeead658b97 100644 (file)
@@ -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 db664305f4e31b050bc8fa7893622f38b4144599..ef2004b7c088fc40abfb41cc7c3e8649da30e42e 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-25  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * ld-powerpc/attr-gnu-8-1.s, ld-powerpc/attr-gnu-8-11.d,
+       ld-powerpc/attr-gnu-8-2.s, ld-powerpc/attr-gnu-8-23.d,
+       ld-powerpc/attr-gnu-8-3.s, ld-powerpc/attr-gnu-8-31.d: New.
+       * ld-powerpc/powerpc.exp: Run new tests.
+
 2007-10-19  Nick Clifton  <nickc@redhat.com>
 
        * ld-mn10300: New test directory.
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-1.s b/ld/testsuite/ld-powerpc/attr-gnu-8-1.s
new file mode 100644 (file)
index 0000000..81c7b7f
--- /dev/null
@@ -0,0 +1 @@
+.gnu_attribute 8,1
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-11.d b/ld/testsuite/ld-powerpc/attr-gnu-8-11.d
new file mode 100644 (file)
index 0000000..7e49d4a
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-2.s b/ld/testsuite/ld-powerpc/attr-gnu-8-2.s
new file mode 100644 (file)
index 0000000..0f18f5f
--- /dev/null
@@ -0,0 +1 @@
+.gnu_attribute 8,2
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-23.d b/ld/testsuite/ld-powerpc/attr-gnu-8-23.d
new file mode 100644 (file)
index 0000000..b22e4bd
--- /dev/null
@@ -0,0 +1,6 @@
+#source: attr-gnu-8-2.s
+#source: attr-gnu-8-3.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses vector ABI "SPE", .* uses "AltiVec"
+#target: powerpc*-*-*
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-3.s b/ld/testsuite/ld-powerpc/attr-gnu-8-3.s
new file mode 100644 (file)
index 0000000..6a1cf4e
--- /dev/null
@@ -0,0 +1 @@
+.gnu_attribute 8,3
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-8-31.d b/ld/testsuite/ld-powerpc/attr-gnu-8-31.d
new file mode 100644 (file)
index 0000000..53e8f99
--- /dev/null
@@ -0,0 +1,10 @@
+#source: attr-gnu-8-3.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: SPE
index d65aa1adf8a2c1069448f9bb812b11ea35c753f5..b1ad367a88cbb6d73fc9f50c196ff65b1c8375e1 100644 (file)
@@ -165,3 +165,7 @@ run_dump_test "attr-gnu-4-20"
 run_dump_test "attr-gnu-4-21"
 run_dump_test "attr-gnu-4-22"
 run_dump_test "attr-gnu-4-31"
+
+run_dump_test "attr-gnu-8-11"
+run_dump_test "attr-gnu-8-23"
+run_dump_test "attr-gnu-8-31"