merge from gcc
[deliverable/binutils-gdb.git] / bfd / elf32-m68hc1x.c
index b31fc7b454b6cae20a7bfe9b8d5ce6af06030283..709b8f45edc5f59429e4a37ff2eae4b79d188822 100644 (file)
@@ -33,31 +33,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    bfd_hash_lookup ((table), (string), (create), (copy)))
 
 static struct elf32_m68hc11_stub_hash_entry* m68hc12_add_stub
-  PARAMS((const char *stub_name,
-          asection *section,
-          struct m68hc11_elf_link_hash_table *htab));
+  (const char *stub_name,
+   asection *section,
+   struct m68hc11_elf_link_hash_table *htab);
 
 static struct bfd_hash_entry *stub_hash_newfunc
-  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
+  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
 
-static void m68hc11_elf_set_symbol
-  PARAMS ((bfd* abfd, struct bfd_link_info *info,
-           const char* name, bfd_vma value, asection* sec));
+static void m68hc11_elf_set_symbol (bfd* abfd, struct bfd_link_info *info,
+                                    const char* name, bfd_vma value,
+                                    asection* sec);
 
 static bfd_boolean m68hc11_elf_export_one_stub
-  PARAMS((struct bfd_hash_entry *gen_entry, PTR in_arg));
+  (struct bfd_hash_entry *gen_entry, void *in_arg);
 
 static bfd_boolean m68hc11_get_relocation_value
-  PARAMS ((bfd* abfd,
-           struct bfd_link_info* info,
-           asection **local_sections,
-           Elf_Internal_Sym* local_syms,
-           Elf_Internal_Rela* rel,
-           const char** name,
-           bfd_vma* relocation,
-           bfd_boolean* is_far));
+  (bfd* abfd,
+   struct bfd_link_info* info,
+   asection **local_sections,
+   Elf_Internal_Sym* local_syms,
+   Elf_Internal_Rela* rel,
+   const char** name,
+   bfd_vma* relocation,
+   bfd_boolean* is_far);
 
-static void scan_sections_for_abi PARAMS ((bfd*, asection*, PTR));
+static void scan_sections_for_abi (bfd*, asection*, PTR);
 
 struct m68hc11_scan_param
 {
@@ -69,8 +69,7 @@ struct m68hc11_scan_param
 /* Create a 68HC11/68HC12 ELF linker hash table.  */
 
 struct m68hc11_elf_link_hash_table*
-m68hc11_elf_hash_table_create (abfd)
-     bfd *abfd;
+m68hc11_elf_hash_table_create (bfd *abfd)
 {
   struct m68hc11_elf_link_hash_table *ret;
   bfd_size_type amt = sizeof (struct m68hc11_elf_link_hash_table);
@@ -109,8 +108,7 @@ m68hc11_elf_hash_table_create (abfd)
 /* Free the derived linker hash table.  */
 
 void
-m68hc11_elf_bfd_link_hash_table_free (hash)
-     struct bfd_link_hash_table *hash;
+m68hc11_elf_bfd_link_hash_table_free (struct bfd_link_hash_table *hash)
 {
   struct m68hc11_elf_link_hash_table *ret
     = (struct m68hc11_elf_link_hash_table *) hash;
@@ -125,10 +123,8 @@ m68hc11_elf_bfd_link_hash_table_free (hash)
 /* Initialize an entry in the stub hash table.  */
 
 static struct bfd_hash_entry *
-stub_hash_newfunc (entry, table, string)
-     struct bfd_hash_entry *entry;
-     struct bfd_hash_table *table;
-     const char *string;
+stub_hash_newfunc (struct bfd_hash_entry *entry, struct bfd_hash_table *table,
+                   const char *string)
 {
   /* Allocate the structure if it has not already been allocated by a
      subclass.  */
@@ -161,10 +157,8 @@ stub_hash_newfunc (entry, table, string)
    stub entry are initialised.  */
 
 static struct elf32_m68hc11_stub_hash_entry *
-m68hc12_add_stub (stub_name, section, htab)
-     const char *stub_name;
-     asection *section;
-     struct m68hc11_elf_link_hash_table *htab;
+m68hc12_add_stub (const char *stub_name, asection *section,
+                  struct m68hc11_elf_link_hash_table *htab)
 {
   struct elf32_m68hc11_stub_hash_entry *stub_entry;
 
@@ -195,14 +189,12 @@ m68hc12_add_stub (stub_name, section, htab)
    the trampoline handler.  */
 
 bfd_boolean
-elf32_m68hc11_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     const Elf_Internal_Sym *sym;
-     const char **namep ATTRIBUTE_UNUSED;
-     flagword *flagsp ATTRIBUTE_UNUSED;
-     asection **secp ATTRIBUTE_UNUSED;
-     bfd_vma *valp ATTRIBUTE_UNUSED;
+elf32_m68hc11_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
+                               const Elf_Internal_Sym *sym,
+                               const char **namep ATTRIBUTE_UNUSED,
+                               flagword *flagsp ATTRIBUTE_UNUSED,
+                               asection **secp ATTRIBUTE_UNUSED,
+                               bfd_vma *valp ATTRIBUTE_UNUSED)
 {
   if (sym->st_other & STO_M68HC12_FAR)
     {
@@ -234,9 +226,7 @@ elf32_m68hc11_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
    0 when no stubs will be needed, and 1 on success.  */
 
 int
-elf32_m68hc11_setup_section_lists (output_bfd, info)
-     bfd *output_bfd;
-     struct bfd_link_info *info;
+elf32_m68hc11_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *input_bfd;
   unsigned int bfd_count;
@@ -326,11 +316,9 @@ elf32_m68hc11_setup_section_lists (output_bfd, info)
    instruction.  */
 
 bfd_boolean
-elf32_m68hc11_size_stubs (output_bfd, stub_bfd, info, add_stub_section)
-     bfd *output_bfd;
-     bfd *stub_bfd;
-     struct bfd_link_info *info;
-     asection * (*add_stub_section) PARAMS ((const char *, asection *));
+elf32_m68hc11_size_stubs (bfd *output_bfd, bfd *stub_bfd,
+                          struct bfd_link_info *info,
+                          asection * (*add_stub_section) (const char*, asection*))
 {
   bfd *input_bfd;
   asection *section;
@@ -367,76 +355,29 @@ elf32_m68hc11_size_stubs (output_bfd, stub_bfd, info, add_stub_section)
        input_bfd = input_bfd->link_next, bfd_indx++)
     {
       Elf_Internal_Shdr *symtab_hdr;
-      Elf_Internal_Shdr *shndx_hdr;
-      Elf_Internal_Sym *isym;
-      Elf32_External_Sym *extsyms, *esym, *end_sy;
-      Elf_External_Sym_Shndx *shndx_buf, *shndx;
-      bfd_size_type sec_size;
 
       /* We'll need the symbol table in a second.  */
       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
       if (symtab_hdr->sh_info == 0)
        continue;
 
-      /* We need an array of the local symbols attached to the input bfd.
-        Unfortunately, we're going to have to read & swap them in.  */
-      sec_size = symtab_hdr->sh_info;
-      sec_size *= sizeof (Elf_Internal_Sym);
-      local_syms = (Elf_Internal_Sym *) bfd_malloc (sec_size);
+      /* We need an array of the local symbols attached to the input bfd.  */
+      local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
+      if (local_syms == NULL)
+       {
+         local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
+                                            symtab_hdr->sh_info, 0,
+                                            NULL, NULL, NULL);
+         /* Cache them for elf_link_input_bfd.  */
+         symtab_hdr->contents = (unsigned char *) local_syms;
+       }
       if (local_syms == NULL)
-       goto error_ret_free_local;
-
-      all_local_syms[bfd_indx] = local_syms;
-      sec_size = symtab_hdr->sh_info;
-      sec_size *= sizeof (Elf32_External_Sym);
-
-      /* Get the cached copy.  */
-      if (symtab_hdr->contents != NULL)
-        extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
-      else
-        {
-          /* Go get them off disk.  */
-          bfd_size_type amt = symtab_hdr->sh_size;
-          extsyms = (Elf32_External_Sym *) bfd_malloc (amt);
-          if (extsyms == NULL)
-            goto error_ret_free_local;
-
-          if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
-              || bfd_bread ((PTR) extsyms, amt, input_bfd) != amt)
-            {
-            error_ret_free_ext_syms:
-              free (extsyms);
-              goto error_ret_free_local;
-            }
-        }
-      shndx_buf = NULL;
-      shndx_hdr = &elf_tdata (input_bfd)->symtab_shndx_hdr;
-      if (shndx_hdr->sh_size != 0)
         {
-          bfd_size_type amt;
-
-          amt = symtab_hdr->sh_info * sizeof (Elf_External_Sym_Shndx);
-          shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
-          if (shndx_buf == NULL)
-            goto error_ret_free_ext_syms;
-          if (bfd_seek (input_bfd, shndx_hdr->sh_offset, SEEK_SET) != 0
-              || bfd_bread ((PTR) shndx_buf, amt, input_bfd) != amt)
-            {
-              free (shndx_buf);
-              goto error_ret_free_ext_syms;
-            }
-          shndx_hdr->contents = (PTR) shndx_buf;
+          free (all_local_syms);
+         return FALSE;
         }
 
-      /* Swap the local symbols in.  */
-      for (esym = extsyms, end_sy = esym + symtab_hdr->sh_info,
-            isym = local_syms, shndx = shndx_buf;
-          esym < end_sy;
-          esym++, isym++, shndx = (shndx ? shndx + 1 : NULL))
-       bfd_elf32_swap_symbol_in (input_bfd, esym, shndx, isym);
-
-      /* Now we can free the external symbols.  */
-      free (shndx_buf);
+      all_local_syms[bfd_indx] = local_syms;
     }
 
   for (input_bfd = info->input_bfds, bfd_indx = 0;
@@ -608,19 +549,17 @@ elf32_m68hc11_size_stubs (output_bfd, stub_bfd, info, add_stub_section)
 
       bfd_hash_traverse (htab->stub_hash_table, htab->size_one_stub, htab);
     }
-  free (htab->all_local_syms);
+  free (all_local_syms);
   return TRUE;
 
  error_ret_free_local:
-  free (htab->all_local_syms);
+  free (all_local_syms);
   return FALSE;
 }
 
 /* Export the trampoline addresses in the symbol table.  */
 static bfd_boolean
-m68hc11_elf_export_one_stub (gen_entry, in_arg)
-     struct bfd_hash_entry *gen_entry;
-     PTR in_arg;
+m68hc11_elf_export_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 {
   struct bfd_link_info *info;
   struct m68hc11_elf_link_hash_table *htab;
@@ -650,12 +589,8 @@ m68hc11_elf_export_one_stub (gen_entry, in_arg)
 
 /* Export a symbol or set its value and section.  */
 static void
-m68hc11_elf_set_symbol (abfd, info, name, value, sec)
-     bfd* abfd;
-     struct bfd_link_info *info;
-     const char* name;
-     bfd_vma value;
-     asection* sec;
+m68hc11_elf_set_symbol (bfd *abfd, struct bfd_link_info *info,
+                        const char *name, bfd_vma value, asection *sec)
 {
   struct elf_link_hash_entry *h;
 
@@ -686,9 +621,7 @@ m68hc11_elf_set_symbol (abfd, info, name, value, sec)
    linker.  */
 
 bfd_boolean
-elf32_m68hc11_build_stubs (abfd, info)
-     bfd* abfd;
-     struct bfd_link_info *info;
+elf32_m68hc11_build_stubs (bfd *abfd, struct bfd_link_info *info)
 {
   asection *stub_sec;
   struct bfd_hash_table *table;
@@ -741,8 +674,7 @@ elf32_m68hc11_build_stubs (abfd, info)
 }
 
 void
-m68hc11_elf_get_bank_parameters (info)
-     struct bfd_link_info *info;
+m68hc11_elf_get_bank_parameters (struct bfd_link_info *info)
 {
   unsigned i;
   struct m68hc11_page_info *pinfo;
@@ -802,9 +734,7 @@ m68hc11_elf_get_bank_parameters (info)
 /* Return 1 if the address is in banked memory.
    This can be applied to a virtual address and to a physical address.  */
 int
-m68hc11_addr_is_banked (pinfo, addr)
-     struct m68hc11_page_info *pinfo;
-     bfd_vma addr;
+m68hc11_addr_is_banked (struct m68hc11_page_info *pinfo, bfd_vma addr)
 {
   if (addr >= pinfo->bank_virtual)
     return 1;
@@ -818,9 +748,7 @@ m68hc11_addr_is_banked (pinfo, addr)
 /* Return the physical address seen by the processor, taking
    into account banked memory.  */
 bfd_vma
-m68hc11_phys_addr (pinfo, addr)
-     struct m68hc11_page_info *pinfo;
-     bfd_vma addr;
+m68hc11_phys_addr (struct m68hc11_page_info *pinfo, bfd_vma addr)
 {
   if (addr < pinfo->bank_virtual)
     return addr;
@@ -834,9 +762,7 @@ m68hc11_phys_addr (pinfo, addr)
 
 /* Return the page number corresponding to an address in banked memory.  */
 bfd_vma
-m68hc11_phys_page (pinfo, addr)
-     struct m68hc11_page_info *pinfo;
-     bfd_vma addr;
+m68hc11_phys_page (struct m68hc11_page_info *pinfo, bfd_vma addr)
 {
   if (addr < pinfo->bank_virtual)
     return 0;
@@ -852,15 +778,13 @@ m68hc11_phys_page (pinfo, addr)
    which the linker should otherwise ignore.  */
 
 bfd_reloc_status_type
-m68hc11_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
-                          output_bfd, error_message)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     arelent *reloc_entry;
-     asymbol *symbol ATTRIBUTE_UNUSED;
-     PTR data ATTRIBUTE_UNUSED;
-     asection *input_section;
-     bfd *output_bfd;
-     char **error_message ATTRIBUTE_UNUSED;
+m68hc11_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED,
+                          arelent *reloc_entry,
+                          asymbol *symbol ATTRIBUTE_UNUSED,
+                          void *data ATTRIBUTE_UNUSED,
+                          asection *input_section,
+                          bfd *output_bfd,
+                          char **error_message ATTRIBUTE_UNUSED)
 {
   if (output_bfd != NULL)
     reloc_entry->address += input_section->output_offset;
@@ -868,15 +792,13 @@ m68hc11_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
 }
 
 bfd_reloc_status_type
-m68hc11_elf_special_reloc (abfd, reloc_entry, symbol, data, input_section,
-                           output_bfd, error_message)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     arelent *reloc_entry;
-     asymbol *symbol;
-     PTR data ATTRIBUTE_UNUSED;
-     asection *input_section;
-     bfd *output_bfd;
-     char **error_message ATTRIBUTE_UNUSED;
+m68hc11_elf_special_reloc (bfd *abfd ATTRIBUTE_UNUSED,
+                           arelent *reloc_entry,
+                           asymbol *symbol,
+                           void *data ATTRIBUTE_UNUSED,
+                           asection *input_section,
+                           bfd *output_bfd,
+                           char **error_message ATTRIBUTE_UNUSED)
 {
   if (output_bfd != (bfd *) NULL
       && (symbol->flags & BSF_SECTION_SYM) == 0
@@ -897,12 +819,11 @@ m68hc11_elf_special_reloc (abfd, reloc_entry, symbol, data, input_section,
 }
 
 asection *
-elf32_m68hc11_gc_mark_hook (sec, info, rel, h, sym)
-     asection *sec;
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     Elf_Internal_Rela *rel;
-     struct elf_link_hash_entry *h;
-     Elf_Internal_Sym *sym;
+elf32_m68hc11_gc_mark_hook (asection *sec,
+                            struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                            Elf_Internal_Rela *rel,
+                            struct elf_link_hash_entry *h,
+                            Elf_Internal_Sym *sym)
 {
   if (h != NULL)
     {
@@ -930,11 +851,10 @@ elf32_m68hc11_gc_mark_hook (sec, info, rel, h, sym)
 }
 
 bfd_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;
+elf32_m68hc11_gc_sweep_hook (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;
@@ -945,11 +865,8 @@ elf32_m68hc11_gc_sweep_hook (abfd, info, sec, relocs)
    virtual table relocs for gc.  */
 
 bfd_boolean
-elf32_m68hc11_check_relocs (abfd, info, sec, relocs)
-     bfd * abfd;
-     struct bfd_link_info * info;
-     asection * sec;
-     const Elf_Internal_Rela * relocs;
+elf32_m68hc11_check_relocs (bfd *abfd, struct bfd_link_info *info,
+                            asection *sec, const Elf_Internal_Rela *relocs)
 {
   Elf_Internal_Shdr *           symtab_hdr;
   struct elf_link_hash_entry ** sym_hashes;
@@ -1002,17 +919,12 @@ elf32_m68hc11_check_relocs (abfd, info, sec, relocs)
 }
 
 static bfd_boolean
-m68hc11_get_relocation_value (abfd, info, local_sections, local_syms,
-                              rel, name,
-                              relocation, is_far)
-     bfd *abfd;
-     struct bfd_link_info *info;
-     asection **local_sections;
-     Elf_Internal_Sym* local_syms;
-     Elf_Internal_Rela* rel;
-     const char** name;
-     bfd_vma* relocation;
-     bfd_boolean* is_far;
+m68hc11_get_relocation_value (bfd *abfd, struct bfd_link_info *info,
+                              asection **local_sections,
+                              Elf_Internal_Sym *local_syms,
+                              Elf_Internal_Rela *rel,
+                              const char **name,
+                              bfd_vma *relocation, bfd_boolean *is_far)
 {
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
@@ -1103,16 +1015,12 @@ m68hc11_get_relocation_value (abfd, info, local_sections, local_syms,
 
 /* Relocate a 68hc11/68hc12 ELF section.  */
 bfd_boolean
-elf32_m68hc11_relocate_section (output_bfd, info, input_bfd, input_section,
-                                contents, relocs, local_syms, local_sections)
-     bfd *output_bfd ATTRIBUTE_UNUSED;
-     struct bfd_link_info *info;
-     bfd *input_bfd;
-     asection *input_section;
-     bfd_byte *contents;
-     Elf_Internal_Rela *relocs;
-     Elf_Internal_Sym *local_syms;
-     asection **local_sections;
+elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+                                struct bfd_link_info *info,
+                                bfd *input_bfd, asection *input_section,
+                                bfd_byte *contents, Elf_Internal_Rela *relocs,
+                                Elf_Internal_Sym *local_syms,
+                                asection **local_sections)
 {
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
@@ -1336,9 +1244,7 @@ elf32_m68hc11_relocate_section (output_bfd, info, input_bfd, input_section,
 /* Set and control ELF flags in ELF header.  */
 
 bfd_boolean
-_bfd_m68hc11_elf_set_private_flags (abfd, flags)
-     bfd *abfd;
-     flagword flags;
+_bfd_m68hc11_elf_set_private_flags (bfd *abfd, flagword flags)
 {
   BFD_ASSERT (!elf_flags_init (abfd)
              || elf_elfheader (abfd)->e_flags == flags);
@@ -1352,9 +1258,7 @@ _bfd_m68hc11_elf_set_private_flags (abfd, flags)
    object file when linking.  */
 
 bfd_boolean
-_bfd_m68hc11_elf_merge_private_bfd_data (ibfd, obfd)
-     bfd *ibfd;
-     bfd *obfd;
+_bfd_m68hc11_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
   flagword old_flags;
   flagword new_flags;
@@ -1422,8 +1326,8 @@ _bfd_m68hc11_elf_merge_private_bfd_data (ibfd, obfd)
 
   elf_elfheader (obfd)->e_flags = new_flags;
 
-  new_flags &= ~EF_M68HC11_ABI;
-  old_flags &= ~EF_M68HC11_ABI;
+  new_flags &= ~(EF_M68HC11_ABI | EF_M68HC11_MACH_MASK);
+  old_flags &= ~(EF_M68HC11_ABI | EF_M68HC11_MACH_MASK);
 
   /* Warn about any other mismatches */
   if (new_flags != old_flags)
@@ -1445,9 +1349,7 @@ _bfd_m68hc11_elf_merge_private_bfd_data (ibfd, obfd)
 }
 
 bfd_boolean
-_bfd_m68hc11_elf_print_private_bfd_data (abfd, ptr)
-     bfd *abfd;
-     PTR ptr;
+_bfd_m68hc11_elf_print_private_bfd_data (bfd *abfd, void *ptr)
 {
   FILE *file = (FILE *) ptr;
 
@@ -1486,10 +1388,8 @@ _bfd_m68hc11_elf_print_private_bfd_data (abfd, ptr)
   return TRUE;
 }
 
-static void scan_sections_for_abi (abfd, asect, arg)
-     bfd* abfd ATTRIBUTE_UNUSED;
-     asection* asect;
-     PTR arg;
+static void scan_sections_for_abi (bfd *abfd ATTRIBUTE_UNUSED,
+                                   asection *asect, void *arg)
 {
   struct m68hc11_scan_param* p = (struct m68hc11_scan_param*) arg;
 
@@ -1500,9 +1400,7 @@ static void scan_sections_for_abi (abfd, asect, arg)
 /* Tweak the OSABI field of the elf header.  */
 
 void
-elf32_m68hc11_post_process_headers (abfd, link_info)
-     bfd *abfd;
-     struct bfd_link_info *link_info;
+elf32_m68hc11_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
 {
   struct m68hc11_scan_param param;
 
This page took 0.029906 seconds and 4 git commands to generate.