include/elf/
authorNathan Froyd <froydnj@codesourcery.com>
Fri, 10 Oct 2008 20:55:36 +0000 (20:55 +0000)
committerNathan Froyd <froydnj@codesourcery.com>
Fri, 10 Oct 2008 20:55:36 +0000 (20:55 +0000)
* ppc.h: Add Tag_GNU_Power_ABI_Struct_Return.
bfd/
* elf32-ppc.c (ppc_elf_merge_obj_attributes): Merge
Tag_GNU_Power_ABI_Struct_Return.
binutils/
* readelf.c (display_power_gnu_attribute): Decode
Tag_GNU_Power_ABI_Struct_Return.
ld/testsuite/
* ld-powerpc/gnu-attr-12-1.s: New file.
* ld-powerpc/gnu-attr-12-2.s: New file.
* ld-powerpc/gnu-attr-12-11.d: New file.
* ld-powerpc/gnu-attr-12-21.d: New file.
* ld-powerpc/powerpc.exp: Run new dump tests.

12 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-12-1.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-12-11.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-12-2.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/attr-gnu-12-21.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/powerpc.exp

index 2c5e391cc207fc8e34145920ad81ce548a84962d..f0080bb344ccc46cb5593c44f0c4c2273e8238fc 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-10  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * elf32-ppc.c (ppc_elf_merge_obj_attributes): Merge
+       Tag_GNU_Power_ABI_Struct_Return.
+
 2008-10-09  Kai Tietz  <kai.tietz@onevision.com>
 
        * cofflink.c (_bfd_coff_generic_relocate_section): Dump bfd_vma sized addresses instead of long sized.
index 1d9cabd2dc0358926bddc84e9d93db255aff2387..83a927428a92e4b29f92c2ab5005c505c55aea40 100644 (file)
@@ -3964,6 +3964,33 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
           ibfd, obfd, in_abi, out_abi);
     }
 
+  /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
+     and merge non-conflicting ones.  */
+  in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
+  out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
+  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->i == 1 && in_attr->i == 2)
+       _bfd_error_handler
+         (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), obfd, ibfd);
+      else if (out_attr->i == 2 && in_attr->i == 1)
+       _bfd_error_handler
+         (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), ibfd, obfd);
+      else if (in_attr->i > 2)
+       _bfd_error_handler
+         (_("Warning: %B uses unknown small structure return convention %d"), ibfd,
+          in_attr->i);
+      else
+       _bfd_error_handler
+         (_("Warning: %B uses unknown small structure return convention %d"), obfd,
+          out_attr->i);
+    }
+
   /* Merge Tag_compatibility attributes and any common GNU ones.  */
   _bfd_elf_merge_object_attributes (ibfd, obfd);
 
index bc971184506746b3218b0d0a8ae20ba02ec25b5c..a67c2e1c9afe5054273a6ef12117f0c8fdd849f0 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-10  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * readelf.c (display_power_gnu_attribute): Decode
+       Tag_GNU_Power_ABI_Struct_Return.
+
 2008-10-10  Alan Modra  <amodra@bigpond.net.au>
 
        * embedspu.sh: Pass -Wa,-noexecstack to $CC.
index c4bdc1dfd8ddcad82966b2ecd7bf28ec2054576e..51f5ffa21cb7c4acbaa47e7633032bbfc792344c 100644 (file)
@@ -9063,6 +9063,29 @@ display_power_gnu_attribute (unsigned char *p, int tag)
       return p;
    }
 
+  if (tag == Tag_GNU_Power_ABI_Struct_Return)
+    {
+      val = read_uleb128 (p, &len);
+      p += len;
+      printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
+      switch (val)
+       {
+       case 0:
+         printf ("Any\n");
+         break;
+       case 1:
+         printf ("r3/r4\n");
+         break;
+       case 2:
+         printf ("Memory\n");
+         break;
+       default:
+         printf ("??? (%d)\n", val);
+         break;
+       }
+      return p;
+    }
+
   if (tag & 1)
     type = 1; /* String.  */
   else
index 8d8bcdff3a2e66dd180ed8d1a792ed509b079226..964f6cfe5c574dc4669d44e1d0dbb63e871e008c 100644 (file)
@@ -1,3 +1,7 @@
+2008-10-10  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * ppc.h: Add Tag_GNU_Power_ABI_Struct_Return.
+
 2008-10-04  Hans-Peter Nilsson  <hp@axis.com>
 
        * cris.h (R_CRIS_32_GOT_GD, R_CRIS_16_GOT_GD, R_CRIS_32_GD)
index 95cccce24819232075dbdeadcb6e272d6ffbae54..a0c16f1a7c843acdeb2e6c1953add7ef7d7129f2 100644 (file)
@@ -186,6 +186,11 @@ enum
      registers, 3 for SPE registers; 0 for not tagged or not using any
      ABIs affected by the differences.  */
   Tag_GNU_Power_ABI_Vector = 8,
+
+  /* Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes,
+     2 for ABIs using memory; 0 for not tagged or not using any ABIs
+     affected by the differences.  */
+  Tag_GNU_Power_ABI_Struct_Return = 12
 };
 
 #endif /* _ELF_PPC_H */
index a9e1d84148540f64edbdaa902489d6a9cfdffaa9..73a3a38f21077fb617facb028e1354828d9ad8bf 100644 (file)
@@ -1,3 +1,11 @@
+2008-10-10  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * ld-powerpc/gnu-attr-12-1.s: New file.
+       * ld-powerpc/gnu-attr-12-2.s: New file.
+       * ld-powerpc/gnu-attr-12-11.d: New file.
+       * ld-powerpc/gnu-attr-12-21.d: New file.
+       * ld-powerpc/powerpc.exp: Run new dump tests.
+
 2008-10-07  Nick Clifton  <nickc@redhat.com>
 
        * ld-ia64/tlsbin.rd: Update expected output now that --wide does
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-12-1.s b/ld/testsuite/ld-powerpc/attr-gnu-12-1.s
new file mode 100644 (file)
index 0000000..10cbe3b
--- /dev/null
@@ -0,0 +1 @@
+.gnu_attribute 12,1
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-12-11.d b/ld/testsuite/ld-powerpc/attr-gnu-12-11.d
new file mode 100644 (file)
index 0000000..e88c4ba
--- /dev/null
@@ -0,0 +1,10 @@
+#source: attr-gnu-12-1.s
+#source: attr-gnu-12-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+  Tag_GNU_Power_ABI_Struct_Return: r3/r4
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-12-2.s b/ld/testsuite/ld-powerpc/attr-gnu-12-2.s
new file mode 100644 (file)
index 0000000..c39de66
--- /dev/null
@@ -0,0 +1 @@
+.gnu_attribute 12,2
diff --git a/ld/testsuite/ld-powerpc/attr-gnu-12-21.d b/ld/testsuite/ld-powerpc/attr-gnu-12-21.d
new file mode 100644 (file)
index 0000000..ef14e35
--- /dev/null
@@ -0,0 +1,6 @@
+#source: attr-gnu-12-2.s
+#source: attr-gnu-12-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses r3/r4 for small structure returns, .* uses memory
+#target: powerpc*-*-*
index 4e03cf6fb3c2dd2bc5f4b5ef8ed591e60f69593c..af812a042c12b3f3fb555476f3cccdf11cb9b943 100644 (file)
@@ -177,3 +177,6 @@ run_dump_test "attr-gnu-4-41"
 run_dump_test "attr-gnu-8-11"
 run_dump_test "attr-gnu-8-23"
 run_dump_test "attr-gnu-8-31"
+
+run_dump_test "attr-gnu-12-11"
+run_dump_test "attr-gnu-12-21"