This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[PATCH]: Support GC sections for HC11/HC12
- From: Stephane Carrez <stcarrez at nerim dot fr>
- To: binutils at sources dot redhat dot com
- Date: Wed, 14 Aug 2002 01:16:34 +0200
- Subject: [PATCH]: Support GC sections for HC11/HC12
Hi!
This patch adds the support for garbage collection of sections in HC11/HC12 elf.
Committed on mainline.
Stephane
2002-08-13 Stephane Carrez <stcarrez@nerim.fr>
* 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.
Index: elf32-m68hc11.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m68hc11.c,v
retrieving revision 1.6
diff -u -p -r1.6 elf32-m68hc11.c
--- elf32-m68hc11.c 13 Aug 2002 21:04:21 -0000 1.6
+++ elf32-m68hc11.c 13 Aug 2002 21:12:00 -0000
@@ -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_p
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
#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
Index: elf32-m68hc12.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m68hc12.c,v
retrieving revision 1.5
diff -u -p -r1.5 elf32-m68hc12.c
--- elf32-m68hc12.c 13 Aug 2002 20:56:59 -0000 1.5
+++ elf32-m68hc12.c 13 Aug 2002 21:12:00 -0000
@@ -41,6 +41,15 @@ static int m68hc12_addr_is_banked PARAMS
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_p
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
#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