diff options
author | Stephane Carrez <stcarrez@nerim.fr> | 2002-08-13 21:15:47 +0000 |
---|---|---|
committer | Stephane Carrez <stcarrez@nerim.fr> | 2002-08-13 21:15:47 +0000 |
commit | 9b701e44033cddad5dcfcee0914b83f303433228 (patch) | |
tree | e2e31a8e3ce0664d8b712af8d0cc5e1b7575324f /bfd/elf32-m68hc12.c | |
parent | 7a897be4b19baf265c0f88678756ab0496a77d23 (diff) | |
download | fsf-binutils-gdb-9b701e44033cddad5dcfcee0914b83f303433228.zip fsf-binutils-gdb-9b701e44033cddad5dcfcee0914b83f303433228.tar.gz fsf-binutils-gdb-9b701e44033cddad5dcfcee0914b83f303433228.tar.bz2 |
* 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.
Diffstat (limited to 'bfd/elf32-m68hc12.c')
-rw-r--r-- | bfd/elf32-m68hc12.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/bfd/elf32-m68hc12.c b/bfd/elf32-m68hc12.c index 23e3e9e..f0f4146 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 |