aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2010-06-16 00:36:04 +0000
committerJoseph Myers <joseph@codesourcery.com>2010-06-16 00:36:04 +0000
commit59e6276b64b1a3b248d851e5a3f5acd63e346399 (patch)
tree67703b84ce60420523bc7446757adab7be390419 /bfd
parentc562eb737ab97d1efc460606632f78bbb80169cb (diff)
downloadfsf-binutils-gdb-59e6276b64b1a3b248d851e5a3f5acd63e346399.zip
fsf-binutils-gdb-59e6276b64b1a3b248d851e5a3f5acd63e346399.tar.gz
fsf-binutils-gdb-59e6276b64b1a3b248d851e5a3f5acd63e346399.tar.bz2
bfd:
* elf-bfd.h (LEAST_KNOWN_OBJ_ATTRIBUTE): Decrease to 2. * elf32-tic6x.c (elf32_tic6x_obj_attrs_arg_type, elf32_tic6x_merge_arch_attributes, elf32_tic6x_merge_attributes, elf32_tic6x_merge_private_bfd_data): New. (bfd_elf32_bfd_merge_private_bfd_data, elf_backend_obj_attrs_arg_type, elf_backend_obj_attrs_section, elf_backend_obj_attrs_section_type, elf_backend_obj_attrs_vendor): Define. * elf32-tic6x.h (elf32_tic6x_merge_arch_attributes): Declare. binutils: * readelf.c (display_tic6x_attribute, process_tic6x_specific): New. (process_arch_specific): Call process_tic6x_specific for EM_TI_C6000. gas: * config/tc-tic6x.c: Include elf/tic6x.h. (tic6x_arch_attribute, tic6x_seen_insns): New. (tic6x_arch_table, tic6x_arches): Add attribute values. (tic6x_use_arch): Handle attribute settings. (tic6x_attributes_set_explicitly, s_tic6x_c6xabi_attribute, tic6x_attribute_table, tic6x_attributes, tic6x_convert_symbolic_attribute): New. (md_pseudo_table): Add c6xabi_attribute. (md_assemble): Set tic6x_seen_insns and tic6x_arch_attribute. (tic6x_set_attribute_int, tic6x_set_attributes): New. (tic6x_end): Call tic6x_set_attributes. * config/tc-tic6x.h (CONVERT_SYMBOLIC_ATTRIBUTE): Define. (tic6x_convert_symbolic_attribute): Declare. gas/testsuite: * gas/elf/elf.exp: Set target_machine for tic6x-*-*. * gas/elf/section2.e-tic6x, gas/tic6x/attr-arch-directive-1.d, gas/tic6x/attr-arch-directive-1.s, gas/tic6x/attr-arch-directive-2.d, gas/tic6x/attr-arch-directive-2.s, gas/tic6x/attr-arch-directive-3.d, gas/tic6x/attr-arch-directive-3.s, gas/tic6x/attr-arch-directive-4.d, gas/tic6x/attr-arch-directive-4.s, gas/tic6x/attr-arch-directive-5.d, gas/tic6x/attr-arch-directive-5.s, gas/tic6x/attr-arch-opts-c62x.d, gas/tic6x/attr-arch-opts-c64x+.d, gas/tic6x/attr-arch-opts-c64x.d, gas/tic6x/attr-arch-opts-c674x.d, gas/tic6x/attr-arch-opts-c67x+.d, gas/tic6x/attr-arch-opts-c67x.d, gas/tic6x/attr-arch-opts-none-1.d, gas/tic6x/attr-arch-opts-none-2.d, gas/tic6x/attr-arch-opts-override-1.d, gas/tic6x/attr-arch-opts-override-2.d, gas/tic6x/empty.s: New. include/elf: * tic6x-attrs.h: New. * tic6x.h: Include elf/tic6x-attrs.h for attribute table. (C6XABI_Tag_CPU_arch_none, C6XABI_Tag_CPU_arch_C62X, C6XABI_Tag_CPU_arch_C67X, C6XABI_Tag_CPU_arch_C67XP, C6XABI_Tag_CPU_arch_C64X, C6XABI_Tag_CPU_arch_C64XP, C6XABI_Tag_CPU_arch_C674X): Define. ld: * emulparams/elf32_tic6x_le.sh (ATTRS_SECTIONS): Define. ld/testsuite: * ld-elf/orphan3.d: Allow section names starting '_'. * ld-tic6x/attr-arch-c62x-c62x.d, ld-tic6x/attr-arch-c62x-c64x+.d, ld-tic6x/attr-arch-c62x-c64x.d, ld-tic6x/attr-arch-c62x-c674x.d, ld-tic6x/attr-arch-c62x-c67x+.d, ld-tic6x/attr-arch-c62x-c67x.d, ld-tic6x/attr-arch-c62x.s, ld-tic6x/attr-arch-c64x+-c62x.d, ld-tic6x/attr-arch-c64x+-c64x+.d, ld-tic6x/attr-arch-c64x+-c64x.d, ld-tic6x/attr-arch-c64x+-c674x.d, ld-tic6x/attr-arch-c64x+-c67x+.d, ld-tic6x/attr-arch-c64x+-c67x.d, ld-tic6x/attr-arch-c64x+.s, ld-tic6x/attr-arch-c64x-c62x.d, ld-tic6x/attr-arch-c64x-c64x+.d, ld-tic6x/attr-arch-c64x-c64x.d, ld-tic6x/attr-arch-c64x-c674x.d, ld-tic6x/attr-arch-c64x-c67x+.d, ld-tic6x/attr-arch-c64x-c67x.d, ld-tic6x/attr-arch-c64x.s, ld-tic6x/attr-arch-c674x-c62x.d, ld-tic6x/attr-arch-c674x-c64x+.d, ld-tic6x/attr-arch-c674x-c64x.d, ld-tic6x/attr-arch-c674x-c674x.d, ld-tic6x/attr-arch-c674x-c67x+.d, ld-tic6x/attr-arch-c674x-c67x.d, ld-tic6x/attr-arch-c674x.s, ld-tic6x/attr-arch-c67x+-c62x.d, ld-tic6x/attr-arch-c67x+-c64x+.d, ld-tic6x/attr-arch-c67x+-c64x.d, ld-tic6x/attr-arch-c67x+-c674x.d, ld-tic6x/attr-arch-c67x+-c67x+.d, ld-tic6x/attr-arch-c67x+-c67x.d, ld-tic6x/attr-arch-c67x+.s, ld-tic6x/attr-arch-c67x-c62x.d, ld-tic6x/attr-arch-c67x-c64x+.d, ld-tic6x/attr-arch-c67x-c64x.d, ld-tic6x/attr-arch-c67x-c674x.d, ld-tic6x/attr-arch-c67x-c67x+.d, ld-tic6x/attr-arch-c67x-c67x.d, ld-tic6x/attr-arch-c67x.s: New.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf-bfd.h2
-rw-r--r--bfd/elf32-tic6x.c88
-rw-r--r--bfd/elf32-tic6x.h2
4 files changed, 103 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d9daae0..9f4bccb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,17 @@
2010-06-15 Joseph Myers <joseph@codesourcery.com>
+ * elf-bfd.h (LEAST_KNOWN_OBJ_ATTRIBUTE): Decrease to 2.
+ * elf32-tic6x.c (elf32_tic6x_obj_attrs_arg_type,
+ elf32_tic6x_merge_arch_attributes, elf32_tic6x_merge_attributes,
+ elf32_tic6x_merge_private_bfd_data): New.
+ (bfd_elf32_bfd_merge_private_bfd_data,
+ elf_backend_obj_attrs_arg_type, elf_backend_obj_attrs_section,
+ elf_backend_obj_attrs_section_type, elf_backend_obj_attrs_vendor):
+ Define.
+ * elf32-tic6x.h (elf32_tic6x_merge_arch_attributes): Declare.
+
+2010-06-15 Joseph Myers <joseph@codesourcery.com>
+
* elf-bfd.h (LEAST_KNOWN_OBJ_ATTRIBUTE): Define.
(struct elf_backend_data): Update comment on obj_attrs_order.
* elf-attrs.c (vendor_obj_attr_size, vendor_set_obj_attr_contents,
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 37e637c..0b21e2a 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1417,7 +1417,7 @@ struct bfd_elf_section_data
for any target. Some code assumes that the value 0 is not used and
the field for that attribute can instead be used as a marker to
indicate that attributes have been initialized. */
-#define LEAST_KNOWN_OBJ_ATTRIBUTE 4
+#define LEAST_KNOWN_OBJ_ATTRIBUTE 2
/* The maximum number of known object attributes for any target. */
#define NUM_KNOWN_OBJ_ATTRIBUTES 71
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index 73fb7061..dc837fb 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -1664,6 +1664,89 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
return ok;
}
+static int
+elf32_tic6x_obj_attrs_arg_type (int tag)
+{
+ if (tag == Tag_compatibility)
+ return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
+ else
+ /* Correct for known attributes, arbitrary for others. */
+ return ATTR_TYPE_FLAG_INT_VAL;
+}
+
+/* Merge the Tag_C6XABI_Tag_CPU_arch attribute values ARCH1 and ARCH2
+ and return the merged value. At present, all merges succeed, so no
+ return value for errors is defined. */
+
+int
+elf32_tic6x_merge_arch_attributes (int arch1, int arch2)
+{
+ int min_arch, max_arch;
+
+ min_arch = (arch1 < arch2 ? arch1 : arch2);
+ max_arch = (arch1 > arch2 ? arch1 : arch2);
+
+ /* In most cases, the numerically greatest value is the correct
+ merged value, but merging C64 and C67 results in C674X. */
+ if ((min_arch == C6XABI_Tag_CPU_arch_C67X
+ || min_arch == C6XABI_Tag_CPU_arch_C67XP)
+ && (max_arch == C6XABI_Tag_CPU_arch_C64X
+ || max_arch == C6XABI_Tag_CPU_arch_C64XP))
+ return C6XABI_Tag_CPU_arch_C674X;
+
+ return max_arch;
+}
+
+/* Merge attributes from IBFD and OBFD, returning TRUE if the merge
+ succeeded, FALSE otherwise. */
+
+static bfd_boolean
+elf32_tic6x_merge_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);
+
+ out_attr = elf_known_obj_attributes_proc (obfd);
+
+ /* Use the Tag_null value to indicate the attributes have been
+ initialized. */
+ out_attr[0].i = 1;
+
+ return TRUE;
+ }
+
+ in_attr = elf_known_obj_attributes_proc (ibfd);
+ out_attr = elf_known_obj_attributes_proc (obfd);
+
+ /* No specification yet for handling of unknown attributes, so just
+ ignore them and handle known ones. */
+ out_attr[Tag_C6XABI_Tag_CPU_arch].i
+ = elf32_tic6x_merge_arch_attributes (in_attr[Tag_C6XABI_Tag_CPU_arch].i,
+ out_attr[Tag_C6XABI_Tag_CPU_arch].i);
+
+ /* Merge Tag_compatibility attributes and any common GNU ones. */
+ _bfd_elf_merge_object_attributes (ibfd, obfd);
+
+ return TRUE;
+}
+
+static bfd_boolean
+elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+ if (!_bfd_generic_verify_endian_match (ibfd, obfd))
+ return FALSE;
+
+ if (!elf32_tic6x_merge_attributes (ibfd, obfd))
+ return FALSE;
+
+ return TRUE;
+}
+
#define TARGET_LITTLE_SYM bfd_elf32_tic6x_le_vec
#define TARGET_LITTLE_NAME "elf32-tic6x-le"
@@ -1674,12 +1757,17 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
#define ELF_MAXPAGESIZE 1
#define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
+#define bfd_elf32_bfd_merge_private_bfd_data elf32_tic6x_merge_private_bfd_data
#define bfd_elf32_mkobject elf32_tic6x_mkobject
#define bfd_elf32_new_section_hook elf32_tic6x_new_section_hook
#define elf_backend_can_gc_sections 1
#define elf_backend_default_use_rela_p 1
#define elf_backend_may_use_rel_p 1
#define elf_backend_may_use_rela_p 1
+#define elf_backend_obj_attrs_arg_type elf32_tic6x_obj_attrs_arg_type
+#define elf_backend_obj_attrs_section "__TI_build_attributes"
+#define elf_backend_obj_attrs_section_type SHT_C6000_ATTRIBUTES
+#define elf_backend_obj_attrs_vendor "c6xabi"
#define elf_backend_rela_normal 1
#define elf_backend_relocate_section elf32_tic6x_relocate_section
#define elf_info_to_howto elf32_tic6x_info_to_howto
diff --git a/bfd/elf32-tic6x.h b/bfd/elf32-tic6x.h
index dfb488c..e8df4e2 100644
--- a/bfd/elf32-tic6x.h
+++ b/bfd/elf32-tic6x.h
@@ -19,6 +19,8 @@
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
+extern int elf32_tic6x_merge_arch_attributes (int, int);
+
/* This function is provided for use from the assembler. */
extern void elf32_tic6x_set_use_rela_p (bfd *, bfd_boolean);