diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e90e90dafc..cc54f3c0e5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2002-08-13 Stephane Carrez + + * elf32-m68hc11.c (elf32_m68hc11_gc_mark_hook): New for section GC. + (elf32_m68hc11_gc_sweep_hook): Likewise. + (elf_backend_gc_mark_hook): Define for GC section support. + (elf_backend_gc_sweep_hook): Likewise. + (elf_backend_can_gc_sections): Likewise. + + * elf32-m68hc12.c: Likewise. + 2002-08-13 Stephane Carrez * elf32-m68hc11.c (_bfd_m68hc11_elf_print_private_bfd_data): New. diff --git a/bfd/elf32-m68hc11.c b/bfd/elf32-m68hc11.c index b18b24a086..7741115dd8 100644 --- a/bfd/elf32-m68hc11.c +++ b/bfd/elf32-m68hc11.c @@ -35,6 +35,15 @@ PARAMS ((bfd *abfd, arelent *reloc_entry, asymbol *symbol, PTR data, asection *input_section, bfd *output_bfd, char **error_message)); +/* GC mark and sweep. */ +static asection *elf32_m68hc11_gc_mark_hook +PARAMS ((bfd *abfd, struct bfd_link_info *info, + Elf_Internal_Rela *rel, struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym)); +static boolean elf32_m68hc11_gc_sweep_hook +PARAMS ((bfd *abfd, struct bfd_link_info *info, + asection *sec, const Elf_Internal_Rela *relocs)); + boolean _bfd_m68hc11_elf_merge_private_bfd_data PARAMS ((bfd*, bfd*)); boolean _bfd_m68hc11_elf_set_private_flags PARAMS ((bfd*, flagword)); boolean _bfd_m68hc11_elf_print_private_bfd_data PARAMS ((bfd*, PTR)); @@ -379,6 +388,57 @@ m68hc11_info_to_howto_rel (abfd, cache_ptr, dst) cache_ptr->howto = &elf_m68hc11_howto_table[r_type]; } +static asection * +elf32_m68hc11_gc_mark_hook (abfd, info, rel, h, sym) + bfd *abfd; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + Elf_Internal_Rela *rel; + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; +{ + if (h != NULL) + { + switch (ELF32_R_TYPE (rel->r_info)) + { + default: + switch (h->root.type) + { + case bfd_link_hash_defined: + case bfd_link_hash_defweak: + return h->root.u.def.section; + + case bfd_link_hash_common: + return h->root.u.c.p->section; + + default: + break; + } + } + } + else + { + if (!(elf_bad_symtab (abfd) + && ELF_ST_BIND (sym->st_info) != STB_LOCAL) + && !((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE) + && sym->st_shndx != SHN_COMMON)) + { + return bfd_section_from_elf_index (abfd, sym->st_shndx); + } + } + return NULL; +} + +static boolean +elf32_m68hc11_gc_sweep_hook (abfd, info, sec, relocs) + bfd *abfd ATTRIBUTE_UNUSED; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; +{ + /* We don't use got and plt entries for 68hc11/68hc12. */ + return true; +} + /* Set and control ELF flags in ELF header. */ @@ -522,9 +582,11 @@ _bfd_m68hc11_elf_print_private_bfd_data (abfd, ptr) #define elf_info_to_howto 0 #define elf_info_to_howto_rel m68hc11_info_to_howto_rel +#define elf_backend_gc_mark_hook elf32_m68hc11_gc_mark_hook +#define elf_backend_gc_sweep_hook elf32_m68hc11_gc_sweep_hook #define elf_backend_object_p 0 #define elf_backend_final_write_processing 0 - +#define elf_backend_can_gc_sections 1 #define bfd_elf32_bfd_merge_private_bfd_data \ _bfd_m68hc11_elf_merge_private_bfd_data #define bfd_elf32_bfd_set_private_flags _bfd_m68hc11_elf_set_private_flags diff --git a/bfd/elf32-m68hc12.c b/bfd/elf32-m68hc12.c index 23e3e9ef9f..f0f41462a6 100644 --- a/bfd/elf32-m68hc12.c +++ b/bfd/elf32-m68hc12.c @@ -41,6 +41,15 @@ static int m68hc12_addr_is_banked PARAMS ((bfd_vma)); static bfd_vma m68hc12_phys_addr PARAMS ((bfd_vma)); static bfd_vma m68hc12_phys_page PARAMS ((bfd_vma)); +/* GC mark and sweep. */ +static asection *elf32_m68hc11_gc_mark_hook +PARAMS ((bfd *abfd, struct bfd_link_info *info, + Elf_Internal_Rela *rel, struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym)); +static boolean elf32_m68hc11_gc_sweep_hook +PARAMS ((bfd *abfd, struct bfd_link_info *info, + asection *sec, const Elf_Internal_Rela *relocs)); + boolean _bfd_m68hc12_elf_merge_private_bfd_data PARAMS ((bfd*, bfd*)); boolean _bfd_m68hc12_elf_set_private_flags PARAMS ((bfd*, flagword)); boolean _bfd_m68hc12_elf_print_private_bfd_data PARAMS ((bfd*, PTR)); @@ -582,6 +591,57 @@ m68hc11_info_to_howto_rel (abfd, cache_ptr, dst) cache_ptr->howto = &elf_m68hc11_howto_table[r_type]; } +static asection * +elf32_m68hc11_gc_mark_hook (abfd, info, rel, h, sym) + bfd *abfd; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + Elf_Internal_Rela *rel; + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; +{ + if (h != NULL) + { + switch (ELF32_R_TYPE (rel->r_info)) + { + default: + switch (h->root.type) + { + case bfd_link_hash_defined: + case bfd_link_hash_defweak: + return h->root.u.def.section; + + case bfd_link_hash_common: + return h->root.u.c.p->section; + + default: + break; + } + } + } + else + { + if (!(elf_bad_symtab (abfd) + && ELF_ST_BIND (sym->st_info) != STB_LOCAL) + && !((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE) + && sym->st_shndx != SHN_COMMON)) + { + return bfd_section_from_elf_index (abfd, sym->st_shndx); + } + } + return NULL; +} + +static boolean +elf32_m68hc11_gc_sweep_hook (abfd, info, sec, relocs) + bfd *abfd ATTRIBUTE_UNUSED; + struct bfd_link_info *info ATTRIBUTE_UNUSED; + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; +{ + /* We don't use got and plt entries for 68hc11/68hc12. */ + return true; +} + /* Set and control ELF flags in ELF header. */ @@ -720,8 +780,11 @@ _bfd_m68hc12_elf_print_private_bfd_data (abfd, ptr) #define elf_info_to_howto 0 #define elf_info_to_howto_rel m68hc11_info_to_howto_rel +#define elf_backend_gc_mark_hook elf32_m68hc11_gc_mark_hook +#define elf_backend_gc_sweep_hook elf32_m68hc11_gc_sweep_hook #define elf_backend_object_p 0 #define elf_backend_final_write_processing 0 +#define elf_backend_can_gc_sections 1 #define bfd_elf32_bfd_merge_private_bfd_data \ _bfd_m68hc12_elf_merge_private_bfd_data