diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 83 | ||||
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/readelf.c | 26 | ||||
-rw-r--r-- | include/elf/ChangeLog | 4 | ||||
-rw-r--r-- | include/elf/ppc.h | 5 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-1.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-11.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-2.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-23.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-3.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/attr-gnu-8-31.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/powerpc.exp | 4 |
14 files changed, 152 insertions, 16 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 27f12d936c..7034943990 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 68804ad806..a85544012d 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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. */ diff --git a/binutils/ChangeLog b/binutils/ChangeLog index e9adcc4917..b4e8f6c619 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -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. diff --git a/binutils/readelf.c b/binutils/readelf.c index abef69c195..0ffc22b051 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -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 diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index e8e12ac509..a9a1e12fba 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -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. diff --git a/include/elf/ppc.h b/include/elf/ppc.h index fe48814d86..5d4462b069 100644 --- a/include/elf/ppc.h +++ b/include/elf/ppc.h @@ -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 */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index db664305f4..ef2004b7c0 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -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 index 0000000000..81c7b7fb4e --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-1.s @@ -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 index 0000000000..7e49d4a7ef --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-11.d @@ -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 index 0000000000..0f18f5f777 --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-2.s @@ -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 index 0000000000..b22e4bda3d --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-23.d @@ -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 index 0000000000..6a1cf4e029 --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-3.s @@ -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 index 0000000000..53e8f997e4 --- /dev/null +++ b/ld/testsuite/ld-powerpc/attr-gnu-8-31.d @@ -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 diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index d65aa1adf8..b1ad367a88 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -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" |