This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Generic object attributes patch
On Fri, 29 Jun 2007, Nick Clifton wrote:
> Hi Joseph,
>
> > Tested with cross to arm-none-eabi. OK to commit?
>
> Please could you test a couple more targets first, just to be safe - an x86
> linux target and maybe a COFF based target. Just to make sure that there are
> no gotchas. Assuming that those tests pass then this patch is approved.
Thanks, I've tested on i686-pc-linux-gnu native and crosses to arm-eabi
and arm-coff with no regressions and committed this patch. As the
MIPS-specific attributes had been approved I've committed those as well.
Pending review are the Power-specific attributes from
<http://sourceware.org/ml/binutils/2007-06/msg00301.html> (that part of
the patch appended below), and the ARM-specific merging fix from
<http://sourceware.org/ml/binutils/2007-06/msg00327.html>.
bfd:
2007-06-29 Joseph Myers <joseph@codesourcery.com>
* elf32-ppc.c (ppc_elf_merge_obj_attributes): New.
(ppc_elf_merge_private_bfd_data): Call it.
binutils:
2007-06-29 Joseph Myers <joseph@codesourcery.com>
* readelf.c (display_power_gnu_attribute, process_power_specific):
New.
(process_arch_specific): Call process_power_specific.
include/elf:
2007-06-29 Joseph Myers <joseph@codesourcery.com>
* ppc.h (Tag_GNU_Power_ABI_FP): Define.
ld/testsuite:
2007-06-29 Joseph Myers <joseph@codesourcery.com>
* ld-powerpc/attr-gnu-4-0.s, ld-powerpc/attr-gnu-4-00.d,
ld-powerpc/attr-gnu-4-01.d, ld-powerpc/attr-gnu-4-02.d,
ld-powerpc/attr-gnu-4-1.s, ld-powerpc/attr-gnu-4-10.d,
ld-powerpc/attr-gnu-4-11.d, ld-powerpc/attr-gnu-4-12.d,
ld-powerpc/attr-gnu-4-13.d, ld-powerpc/attr-gnu-4-2.s,
ld-powerpc/attr-gnu-4-20.d, ld-powerpc/attr-gnu-4-21.d,
ld-powerpc/attr-gnu-4-22.d, ld-powerpc/attr-gnu-4-3.s,
ld-powerpc/attr-gnu-4-31.d: New.
* ld-powerpc/powerpc.exp: Run these new tests.
diff -rupN binutils-mainline/bfd/elf32-ppc.c binutils-mainline-ppc/bfd/elf32-ppc.c
--- binutils-mainline/bfd/elf32-ppc.c 2007-06-29 16:32:39.000000000 +0000
+++ binutils-mainline-ppc/bfd/elf32-ppc.c 2007-06-29 16:29:47.000000000 +0000
@@ -3594,6 +3594,62 @@ ppc_elf_check_relocs (bfd *abfd,
return TRUE;
}
+
+/* Merge object attributes from IBFD into OBFD. Raise an error if
+ there are conflicting attributes. */
+static bfd_boolean
+ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
+{
+ obj_attribute *in_attr;
+ obj_attribute *out_attr;
+
+ if (!elf_known_obj_attributes_proc (obfd)[0].i)
+ {
+ /* This is the first object. Copy the attributes. */
+ _bfd_elf_copy_obj_attributes (ibfd, obfd);
+
+ /* Use the Tag_null value to indicate the attributes have been
+ initialized. */
+ elf_known_obj_attributes_proc (obfd)[0].i = 1;
+
+ return TRUE;
+ }
+
+ /* 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)
+ ;
+ else if (out_attr[Tag_GNU_Power_ABI_FP].i == 1
+ && in_attr[Tag_GNU_Power_ABI_FP].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)
+ _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)
+ _bfd_error_handler
+ (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
+ in_attr[Tag_GNU_Power_ABI_FP].i);
+ else
+ _bfd_error_handler
+ (_("Warning: %B uses unknown floating point ABI %d"), obfd,
+ out_attr[Tag_GNU_Power_ABI_FP].i);
+ }
+
+ /* Merge Tag_compatibility attributes and any common GNU ones. */
+ _bfd_elf_merge_object_attributes (ibfd, obfd);
+
+ return TRUE;
+}
+
/* Merge backend specific data from an object file to the output
object file when linking. */
@@ -3612,6 +3668,9 @@ ppc_elf_merge_private_bfd_data (bfd *ibf
if (! _bfd_generic_verify_endian_match (ibfd, obfd))
return FALSE;
+ if (!ppc_elf_merge_obj_attributes (ibfd, obfd))
+ return FALSE;
+
new_flags = elf_elfheader (ibfd)->e_flags;
old_flags = elf_elfheader (obfd)->e_flags;
if (!elf_flags_init (obfd))
diff -rupN binutils-mainline/binutils/readelf.c binutils-mainline-ppc/binutils/readelf.c
--- binutils-mainline/binutils/readelf.c 2007-06-29 16:33:06.000000000 +0000
+++ binutils-mainline-ppc/binutils/readelf.c 2007-06-29 16:29:47.000000000 +0000
@@ -8347,6 +8347,57 @@ display_gnu_attribute (unsigned char *p,
}
static unsigned char *
+display_power_gnu_attribute (unsigned char *p, int tag)
+{
+ int type;
+ unsigned int len;
+ int val;
+
+ if (tag == Tag_GNU_Power_ABI_FP)
+ {
+ val = read_uleb128 (p, &len);
+ p += len;
+ printf (" Tag_GNU_Power_ABI_FP: ");
+ switch (val)
+ {
+ case 0:
+ printf ("Hard or soft float\n");
+ break;
+ case 1:
+ printf ("Hard float\n");
+ break;
+ case 2:
+ printf ("Soft float\n");
+ break;
+ default:
+ printf ("??? (%d)\n", val);
+ break;
+ }
+ return p;
+ }
+
+ if (tag & 1)
+ type = 1; /* String. */
+ else
+ type = 2; /* uleb128. */
+ printf (" Tag_unknown_%d: ", tag);
+
+ if (type == 1)
+ {
+ printf ("\"%s\"\n", p);
+ p += strlen ((char *)p) + 1;
+ }
+ else
+ {
+ val = read_uleb128 (p, &len);
+ p += len;
+ printf ("%d (0x%x)\n", val, val);
+ }
+
+ return p;
+}
+
+static unsigned char *
display_mips_gnu_attribute (unsigned char *p, int tag)
{
int type;
@@ -8540,6 +8591,13 @@ process_arm_specific (FILE *file)
}
static int
+process_power_specific (FILE *file)
+{
+ return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
+ display_power_gnu_attribute);
+}
+
+static int
process_mips_specific (FILE *file)
{
Elf_Internal_Dyn *entry;
@@ -9317,6 +9375,9 @@ process_arch_specific (FILE *file)
case EM_MIPS_RS3_LE:
return process_mips_specific (file);
break;
+ case EM_PPC:
+ return process_power_specific (file);
+ break;
default:
break;
}
diff -rupN binutils-mainline/include/elf/ppc.h binutils-mainline-ppc/include/elf/ppc.h
--- binutils-mainline/include/elf/ppc.h 2007-06-29 16:33:17.000000000 +0000
+++ binutils-mainline-ppc/include/elf/ppc.h 2007-06-29 16:29:47.000000000 +0000
@@ -171,4 +171,15 @@ END_RELOC_NUMBERS (R_PPC_max)
builds when those objects \
are not to be furhter \
relocated. */
+
+/* Object attribute tags. */
+enum
+{
+ /* 0-3 are generic. */
+ Tag_GNU_Power_ABI_FP = 4, /* Value 1 for hard-float, 2 for
+ soft-float; 0 for not tagged or not
+ using any ABIs affected by the
+ differences. */
+};
+
#endif /* _ELF_PPC_H */
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-0.s binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-0.s
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-0.s 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-0.s 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1 @@
+.gnu_attribute 4,0
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-00.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-00.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-00.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-00.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,7 @@
+#source: attr-gnu-4-0.s
+#source: attr-gnu-4-0.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-01.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-01.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-01.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-01.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-0.s
+#source: attr-gnu-4-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Hard float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-02.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-02.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-02.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-02.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-0.s
+#source: attr-gnu-4-2.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Soft float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-1.s binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-1.s
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-1.s 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-1.s 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1 @@
+.gnu_attribute 4,1
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-10.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-10.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-10.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-10.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-1.s
+#source: attr-gnu-4-0.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Hard float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-11.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-11.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-11.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-11.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-1.s
+#source: attr-gnu-4-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Hard float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-12.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-12.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-12.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-12.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,6 @@
+#source: attr-gnu-4-1.s
+#source: attr-gnu-4-2.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses hard float, .* uses soft float
+#target: powerpc*-*-*
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-13.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-13.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-13.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-13.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,6 @@
+#source: attr-gnu-4-1.s
+#source: attr-gnu-4-3.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses unknown floating point ABI 3
+#target: powerpc*-*-*
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-2.s binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-2.s
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-2.s 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-2.s 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1 @@
+.gnu_attribute 4,2
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-20.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-20.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-20.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-20.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-2.s
+#source: attr-gnu-4-0.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Soft float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-21.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-21.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-21.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-21.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,6 @@
+#source: attr-gnu-4-2.s
+#source: attr-gnu-4-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses hard float, .* uses soft float
+#target: powerpc*-*-*
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-22.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-22.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-22.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-22.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,10 @@
+#source: attr-gnu-4-2.s
+#source: attr-gnu-4-2.s
+#as: -a32
+#ld: -r -melf32ppc
+#readelf: -A
+#target: powerpc*-*-*
+
+Attribute Section: gnu
+File Attributes
+ Tag_GNU_Power_ABI_FP: Soft float
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-3.s binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-3.s
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-3.s 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-3.s 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1 @@
+.gnu_attribute 4,3
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-31.d binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-31.d
--- binutils-mainline/ld/testsuite/ld-powerpc/attr-gnu-4-31.d 1970-01-01 00:00:00.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/attr-gnu-4-31.d 2007-06-29 16:29:47.000000000 +0000
@@ -0,0 +1,6 @@
+#source: attr-gnu-4-3.s
+#source: attr-gnu-4-1.s
+#as: -a32
+#ld: -r -melf32ppc
+#warning: Warning: .* uses unknown floating point ABI 3
+#target: powerpc*-*-*
diff -rupN binutils-mainline/ld/testsuite/ld-powerpc/powerpc.exp binutils-mainline-ppc/ld/testsuite/ld-powerpc/powerpc.exp
--- binutils-mainline/ld/testsuite/ld-powerpc/powerpc.exp 2007-06-29 16:33:38.000000000 +0000
+++ binutils-mainline-ppc/ld/testsuite/ld-powerpc/powerpc.exp 2007-06-29 16:29:47.000000000 +0000
@@ -147,3 +147,15 @@ if [ supports_ppc64 ] then {
}
run_dump_test "plt1"
+
+run_dump_test "attr-gnu-4-00"
+run_dump_test "attr-gnu-4-01"
+run_dump_test "attr-gnu-4-02"
+run_dump_test "attr-gnu-4-10"
+run_dump_test "attr-gnu-4-11"
+run_dump_test "attr-gnu-4-12"
+run_dump_test "attr-gnu-4-13"
+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"
--
Joseph S. Myers
joseph@codesourcery.com