diff options
author | Joseph Myers <jsm@polyomino.org.uk> | 2010-06-16 00:36:00 +0000 |
---|---|---|
committer | Joseph Myers <jsm@polyomino.org.uk> | 2010-06-16 00:36:00 +0000 |
commit | 8a039d745ceafac797c3acc5e0a7ce99f45f4c32 (patch) | |
tree | f779b42bbcc2874b17eb37f8950974489179b544 | |
parent | f4e58af991cad1dc5850a30669c2358b28029a84 (diff) | |
download | gdb-8a039d745ceafac797c3acc5e0a7ce99f45f4c32.tar.gz |
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.
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 2 | ||||
-rw-r--r-- | bfd/elf32-tic6x.c | 88 | ||||
-rw-r--r-- | bfd/elf32-tic6x.h | 2 | ||||
-rw-r--r-- | include/elf/ChangeLog | 9 | ||||
-rw-r--r-- | include/elf/tic6x-attrs.h | 25 | ||||
-rw-r--r-- | include/elf/tic6x.h | 22 |
7 files changed, 159 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d9daae0e3e7..9f4bccbb2d2 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 37e637ca665..0b21e2aa95b 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 73fb706123a..dc837fba236 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 dfb488c731a..e8df4e2ca72 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); diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index bf36e1e1d1d..2442c50861c 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,12 @@ +2010-06-15 Joseph Myers <joseph@codesourcery.com> + + * 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. + 2010-06-11 Tristan Gingold <gingold@adacore.com> * ia64.h (EF_IA_64_VMS_COMCOD, EF_IA_64_VMS_COMCOD_SUCCESS) diff --git a/include/elf/tic6x-attrs.h b/include/elf/tic6x-attrs.h new file mode 100644 index 00000000000..d5b8ee1ae57 --- /dev/null +++ b/include/elf/tic6x-attrs.h @@ -0,0 +1,25 @@ +/* TI C6X ELF attributes. + Copyright 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Define the TAG macro before including this file; it takes a tag + name and value. */ + +TAG(Tag_C6XABI_Tag_CPU_arch, 2) diff --git a/include/elf/tic6x.h b/include/elf/tic6x.h index c4ec19356b0..a9b66ddf395 100644 --- a/include/elf/tic6x.h +++ b/include/elf/tic6x.h @@ -125,4 +125,26 @@ END_RELOC_NUMBERS (R_TIC6X_max) /* Segment cannot be further relocated. */ #define PHA_READONLY 0x2 +/* Build attributes. */ +enum + { +#define TAG(tag, value) tag = value, +#include "elf/tic6x-attrs.h" +#undef TAG + Tag_C6XABI_last + }; + +/* Values for Tag_C6XABI_Tag_CPU_arch. GNU-specific names pending any + ABI defining official names associated with the values. */ +enum + { + C6XABI_Tag_CPU_arch_none = 0, + C6XABI_Tag_CPU_arch_C62X = 1, + C6XABI_Tag_CPU_arch_C67X = 3, + C6XABI_Tag_CPU_arch_C67XP = 4, + C6XABI_Tag_CPU_arch_C64X = 6, + C6XABI_Tag_CPU_arch_C64XP = 7, + C6XABI_Tag_CPU_arch_C674X = 8 + }; + #endif /* _ELF_TIC6X_H */ |