From d5eaccd71d0eecde192070121e3c66a8f1bee39f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 7 Aug 2008 20:03:25 +0000 Subject: [PATCH] bfd/ * elf-bfd.h (MIPS_ELF_TDATA): New elf_object_id. * elf32-mips.c (bfd_elf32_mkobject): Define. * elf64-mips.c (bfd_elf64_mkobject): Likewise. * elfn32-mips.c (bfd_elf32_mkobject): Likewise. * elfxx-mips.h (_bfd_mips_elf_mkobject): Declare. * elfxx-mips.c (is_mips_elf): New macro. (_bfd_mips_elf_mkobject): New function. (_bfd_mips_elf_final_link): Use is_mips_elf. (_bfd_mips_elf_merge_private_bfd_data): Likewise. --- bfd/ChangeLog | 12 ++++++++++++ bfd/elf-bfd.h | 1 + bfd/elf32-mips.c | 1 + bfd/elf64-mips.c | 1 + bfd/elfn32-mips.c | 1 + bfd/elfxx-mips.c | 21 ++++++++++++++++----- bfd/elfxx-mips.h | 2 ++ 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9b6d8088ed7..98ec7e7a70d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2008-08-07 Richard Sandiford + + * elf-bfd.h (MIPS_ELF_TDATA): New elf_object_id. + * elf32-mips.c (bfd_elf32_mkobject): Define. + * elf64-mips.c (bfd_elf64_mkobject): Likewise. + * elfn32-mips.c (bfd_elf32_mkobject): Likewise. + * elfxx-mips.h (_bfd_mips_elf_mkobject): Declare. + * elfxx-mips.c (is_mips_elf): New macro. + (_bfd_mips_elf_mkobject): New function. + (_bfd_mips_elf_final_link): Use is_mips_elf. + (_bfd_mips_elf_merge_private_bfd_data): Likewise. + 2008-08-07 Richard Sandiford * elfxx-mips.c (mips_elf_record_relocs): Defer allocation of a diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 2d59ea444f8..d1772557b8f 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1408,6 +1408,7 @@ enum elf_object_id ARM_ELF_TDATA, HPPA_ELF_TDATA, I386_ELF_TDATA, + MIPS_ELF_TDATA, PPC32_ELF_TDATA, PPC64_ELF_TDATA, S390_ELF_TDATA, diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 526c222f543..e04e797c806 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1630,6 +1630,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf32_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents +#define bfd_elf32_mkobject _bfd_mips_elf_mkobject #define bfd_elf32_bfd_link_hash_table_create \ _bfd_mips_elf_link_hash_table_create #define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index f79d889bb3f..61db0f8cd17 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -3210,6 +3210,7 @@ const struct elf_size_info mips_elf64_size_info = #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf64_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents +#define bfd_elf64_mkobject _bfd_mips_elf_mkobject #define bfd_elf64_bfd_link_hash_table_create \ _bfd_mips_elf_link_hash_table_create #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 63734f8d5c7..4e8a8d7a58c 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2458,6 +2458,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf32_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents +#define bfd_elf32_mkobject _bfd_mips_elf_mkobject #define bfd_elf32_bfd_link_hash_table_create \ _bfd_mips_elf_link_hash_table_create #define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 4e1481b2b6b..5c87ecde07a 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -243,6 +243,11 @@ struct _mips_elf_section_data #define mips_elf_section_data(sec) \ ((struct _mips_elf_section_data *) elf_section_data (sec)) +#define is_mips_elf(bfd) \ + (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ + && elf_tdata (bfd) != NULL \ + && elf_object_id (bfd) == MIPS_ELF_TDATA) + /* The ABI says that every symbol used by dynamic relocations must have a global GOT entry. Among other things, this provides the dynamic linker with a free, directly-indexed cache. The GOT can therefore @@ -10640,6 +10645,15 @@ error_return: return NULL; } +/* Allocate ABFD's target-dependent data. */ + +bfd_boolean +_bfd_mips_elf_mkobject (bfd *abfd) +{ + return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata), + MIPS_ELF_TDATA); +} + /* Create a MIPS ELF linker hash table. */ struct bfd_link_hash_table * @@ -10936,9 +10950,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info) input_section = p->u.indirect.section; input_bfd = input_section->owner; - if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour - || (get_elf_backend_data (input_bfd) - ->elf_backend_ecoff_debug_swap) == NULL) + if (!is_mips_elf (input_bfd)) { /* I don't know what a non MIPS ELF bfd would be doing with a .mdebug section, but I don't really @@ -11611,8 +11623,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) return FALSE; } - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) + if (!is_mips_elf (ibfd) || !is_mips_elf (obfd)) return TRUE; if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0) diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index 659c418cf4d..5b791731369 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -93,6 +93,8 @@ extern bfd_boolean _bfd_mips_elf_set_section_contents extern bfd_byte *_bfd_elf_mips_get_relocated_section_contents (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *, bfd_boolean, asymbol **); +extern bfd_boolean _bfd_mips_elf_mkobject + (bfd *); extern struct bfd_link_hash_table *_bfd_mips_elf_link_hash_table_create (bfd *); extern struct bfd_link_hash_table *_bfd_mips_vxworks_link_hash_table_create -- 2.30.2