Remove bfd stub function casts.
[deliverable/binutils-gdb.git] / bfd / elf64-mmix.c
index 38d07b3cad8f1ed8d921d4a0dd358ab8034b5329..2132a1b1706c2b17efbe492cf2785d46abb149f9 100644 (file)
@@ -1,5 +1,5 @@
 /* MMIX-specific support for 64-bit ELF.
-   Copyright (C) 2001-2015 Free Software Foundation, Inc.
+   Copyright (C) 2001-2018 Free Software Foundation, Inc.
    Contributed by Hans-Peter Nilsson <hp@bitrange.com>
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -172,7 +172,7 @@ extern void mmix_elf_symbol_processing (bfd *, asymbol *);
 
 /* Only intended to be called from a debugger.  */
 extern void mmix_dump_bpo_gregs
-  (struct bfd_link_info *, bfd_error_handler_type);
+  (struct bfd_link_info *, void (*) (const char *, ...));
 
 static void
 mmix_set_relaxable_size (bfd *, asection *, void *);
@@ -460,7 +460,7 @@ static reloc_howto_type elf_mmix_howto_table[] =
         FALSE,                 /* partial_inplace */
         ~0x0100ffff,           /* src_mask */
         0x0100ffff,            /* dst_mask */
-        TRUE),                 /* pcrel_offset */
+        TRUE),                 /* pcrel_offset */
 
   HOWTO (R_MMIX_CBRANCH_J,     /* type */
         2,                     /* rightshift */
@@ -1190,14 +1190,13 @@ mmix_elf_perform_relocation (asection *isec, reloc_howto_type *howto,
           doesn't cost much, so can be left in at all times.  */
        if (value != gregdata->reloc_request[bpo_index].value)
          {
-           (*_bfd_error_handler)
-             (_("%s: Internal inconsistency error for value for\n\
- linker-allocated global register: linked: 0x%lx%08lx != relaxed: 0x%lx%08lx\n"),
-              bfd_get_filename (isec->owner),
-              (unsigned long) (value >> 32), (unsigned long) value,
-              (unsigned long) (gregdata->reloc_request[bpo_index].value
-                               >> 32),
-              (unsigned long) gregdata->reloc_request[bpo_index].value);
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: Internal inconsistency error for value for\n\
+ linker-allocated global register: linked: %#Lx != relaxed: %#Lx"),
+              isec->owner,
+              value,
+              gregdata->reloc_request[bpo_index].value);
            bfd_set_error (bfd_error_bad_value);
            return bfd_reloc_overflow;
          }
@@ -1261,6 +1260,7 @@ mmix_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   r_type = ELF64_R_TYPE (dst->r_info);
   if (r_type >= (unsigned int) R_MMIX_max)
     {
+      /* xgettext:c-format */
       _bfd_error_handler (_("%B: invalid MMIX reloc number: %d"), abfd, r_type);
       r_type = 0;
     }
@@ -1429,7 +1429,7 @@ mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
                                         rel, 1, relend, howto, 0, contents);
 
-      if (info->relocatable)
+      if (bfd_link_relocatable (info))
        {
          /* This is a relocatable link.  For most relocs we don't have to
             change anything, unless the reloc is against a section
@@ -1516,13 +1516,12 @@ mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       if (r != bfd_reloc_ok)
        {
-         bfd_boolean check_ok = TRUE;
          const char * msg = (const char *) NULL;
 
          switch (r)
            {
            case bfd_reloc_overflow:
-             check_ok = info->callbacks->reloc_overflow
+             info->callbacks->reloc_overflow
                (info, (h ? &h->root : NULL), name, howto->name,
                 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
              break;
@@ -1530,9 +1529,8 @@ mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
            case bfd_reloc_undefined:
              /* We may have sent this message above.  */
              if (! undefined_signalled)
-               check_ok = info->callbacks->undefined_symbol
-                 (info, name, input_bfd, input_section, rel->r_offset,
-                  TRUE);
+               info->callbacks->undefined_symbol
+                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
              undefined_signalled = TRUE;
              break;
 
@@ -1554,11 +1552,8 @@ mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
            }
 
          if (msg)
-           check_ok = info->callbacks->warning
-             (info, msg, name, input_bfd, input_section, rel->r_offset);
-
-         if (! check_ok)
-           return FALSE;
+           (*info->callbacks->warning) (info, msg, name, input_bfd,
+                                        input_section, rel->r_offset);
        }
     }
 
@@ -1616,15 +1611,17 @@ mmix_final_link_relocate (reloc_howto_type *howto, asection *input_section,
          /* Note: This is separated out into two messages in order
             to ease the translation into other languages.  */
          if (symname == NULL || *symname == 0)
-           (*_bfd_error_handler)
-             (_("%s: base-plus-offset relocation against register symbol: (unknown) in %s"),
-              bfd_get_filename (input_section->owner),
-              bfd_get_section_name (symsec->owner, symsec));
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: base-plus-offset relocation against register symbol:"
+                " (unknown) in %A"),
+              input_section->owner, symsec);
          else
-           (*_bfd_error_handler)
-             (_("%s: base-plus-offset relocation against register symbol: %s in %s"),
-              bfd_get_filename (input_section->owner), symname,
-              bfd_get_section_name (symsec->owner, symsec));
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: base-plus-offset relocation against register symbol:"
+                " %s in %A"),
+              input_section->owner, symname, symsec);
          return bfd_reloc_overflow;
        }
       goto do_mmix_reloc;
@@ -1665,15 +1662,17 @@ mmix_final_link_relocate (reloc_howto_type *howto, asection *input_section,
          /* Note: This is separated out into two messages in order
             to ease the translation into other languages.  */
          if (symname == NULL || *symname == 0)
-           (*_bfd_error_handler)
-             (_("%s: register relocation against non-register symbol: (unknown) in %s"),
-              bfd_get_filename (input_section->owner),
-              bfd_get_section_name (symsec->owner, symsec));
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: register relocation against non-register symbol:"
+                " (unknown) in %A"),
+              input_section->owner, symsec);
          else
-           (*_bfd_error_handler)
-             (_("%s: register relocation against non-register symbol: %s in %s"),
-              bfd_get_filename (input_section->owner), symname,
-              bfd_get_section_name (symsec->owner, symsec));
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: register relocation against non-register symbol:"
+                " %s in %A"),
+              input_section->owner, symname, symsec);
 
          /* The bfd_reloc_outofrange return value, though intuitively a
             better value, will not get us an error.  */
@@ -1707,9 +1706,9 @@ mmix_final_link_relocate (reloc_howto_type *howto, asection *input_section,
            && strcmp (bfd_get_section_name (symsec->owner, symsec),
                       MMIX_REG_SECTION_NAME) != 0)
        {
-         (*_bfd_error_handler)
-           (_("%s: directive LOCAL valid only with a register or absolute value"),
-            bfd_get_filename (input_section->owner));
+         _bfd_error_handler
+           (_("%B: directive LOCAL valid only with a register or absolute value"),
+            input_section->owner);
 
          return bfd_reloc_overflow;
        }
@@ -1737,9 +1736,11 @@ mmix_final_link_relocate (reloc_howto_type *howto, asection *input_section,
        if ((bfd_vma) srel >= first_global)
          {
            /* FIXME: Better error message.  */
-           (*_bfd_error_handler)
-             (_("%s: LOCAL directive: Register $%ld is not a local register.  First global register is $%ld."),
-              bfd_get_filename (input_section->owner), (long) srel, (long) first_global);
+           _bfd_error_handler
+             /* xgettext:c-format */
+             (_("%B: LOCAL directive: Register $%Ld is not a local register."
+                "  First global register is $%Ld."),
+              input_section->owner, srel, first_global);
 
            return bfd_reloc_overflow;
          }
@@ -1776,33 +1777,6 @@ mmix_elf_gc_mark_hook (asection *sec,
 
   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
 }
-
-/* Update relocation info for a GC-excluded section.  We could supposedly
-   perform the allocation after GC, but there's no suitable hook between
-   GC (or section merge) and the point when all input sections must be
-   present.  Better to waste some memory and (perhaps) a little time.  */
-
-static bfd_boolean
-mmix_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
-                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
-                       asection *sec,
-                       const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
-{
-  struct bpo_reloc_section_info *bpodata
-    = mmix_elf_section_data (sec)->bpo.reloc;
-  asection *allocated_gregs_section;
-
-  /* If no bpodata here, we have nothing to do.  */
-  if (bpodata == NULL)
-    return TRUE;
-
-  allocated_gregs_section = bpodata->bpo_greg_section;
-
-  mmix_elf_section_data (allocated_gregs_section)->bpo.greg->n_bpo_relocs
-    -= bpodata->n_bpo_relocs_this_section;
-
-  return TRUE;
-}
 \f
 /* Sort register relocs to come before expanding relocs.  */
 
@@ -1862,7 +1836,7 @@ mmix_elf_check_common_relocs  (bfd *abfd,
   for (rel = relocs; rel < rel_end; rel++)
     {
       switch (ELF64_R_TYPE (rel->r_info))
-        {
+       {
          /* This relocation causes a GREG allocation.  We need to count
             them, and we need to create a section for them, so we need an
             object to fake as the owner of that section.  We can't use
@@ -1870,7 +1844,7 @@ mmix_elf_check_common_relocs  (bfd *abfd,
             DSO-related stuff if that member is non-NULL.  */
        case R_MMIX_BASE_PLUS_OFFSET:
          /* We don't do anything with this reloc for a relocatable link.  */
-         if (info->relocatable)
+         if (bfd_link_relocatable (info))
            break;
 
          if (bpo_greg_owner == NULL)
@@ -1994,7 +1968,7 @@ mmix_elf_check_relocs (bfd *abfd,
   if (!mmix_elf_check_common_relocs (abfd, info, sec, relocs))
     return FALSE;
 
-  if (info->relocatable)
+  if (bfd_link_relocatable (info))
     return TRUE;
 
   rel_end = relocs + sec->reloc_count;
@@ -2005,36 +1979,32 @@ mmix_elf_check_relocs (bfd *abfd,
 
       r_symndx = ELF64_R_SYM (rel->r_info);
       if (r_symndx < symtab_hdr->sh_info)
-        h = NULL;
+       h = NULL;
       else
        {
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
          while (h->root.type == bfd_link_hash_indirect
                 || h->root.type == bfd_link_hash_warning)
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
-         /* PR15323, ref flags aren't set for references in the same
-            object.  */
-         h->root.non_ir_ref = 1;
        }
 
       switch (ELF64_R_TYPE (rel->r_info))
        {
-        /* This relocation describes the C++ object vtable hierarchy.
-           Reconstruct it for later use during GC.  */
-        case R_MMIX_GNU_VTINHERIT:
-          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
-            return FALSE;
-          break;
-
-        /* This relocation describes which C++ vtable entries are actually
-           used.  Record for later use during GC.  */
-        case R_MMIX_GNU_VTENTRY:
-          BFD_ASSERT (h != NULL);
-          if (h != NULL
-              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
-            return FALSE;
-          break;
+       /* This relocation describes the C++ object vtable hierarchy.
+          Reconstruct it for later use during GC.  */
+       case R_MMIX_GNU_VTINHERIT:
+         if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+           return FALSE;
+         break;
+
+       /* This relocation describes which C++ vtable entries are actually
+          used.  Record for later use during GC.  */
+       case R_MMIX_GNU_VTENTRY:
+         BFD_ASSERT (h != NULL);
+         if (h != NULL
+             && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+           return FALSE;
+         break;
        }
     }
 
@@ -2114,9 +2084,7 @@ static asymbol *mmix_elf_reg_section_symbol_ptr;
 /* Handle the special section numbers that a symbol may use.  */
 
 void
-mmix_elf_symbol_processing (abfd, asym)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     asymbol *asym;
+mmix_elf_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
 {
   elf_symbol_type *elfsym;
 
@@ -2196,10 +2164,12 @@ mmix_elf_add_symbol_hook (bfd *abfd,
        {
          /* How do we get the asymbol (or really: the filename) from h?
             h->u.def.section->owner is NULL.  */
-         ((*_bfd_error_handler)
-          (_("%s: Error: multiple definition of `%s'; start of %s is set in a earlier linked file\n"),
-           bfd_get_filename (abfd), *namep,
-           *namep + strlen (MMIX_LOC_SECTION_START_SYMBOL_PREFIX)));
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: Error: multiple definition of `%s'; start of %s "
+              "is set in a earlier linked file\n"),
+            abfd, *namep,
+            *namep + strlen (MMIX_LOC_SECTION_START_SYMBOL_PREFIX));
           bfd_set_error (bfd_error_bad_value);
           return FALSE;
        }
@@ -2303,7 +2273,7 @@ mmix_set_relaxable_size (bfd *abfd ATTRIBUTE_UNUSED,
 
   /* For use in relocatable link, we start with a max stubs size.  See
      mmix_elf_relax_section.  */
-  if (info->relocatable && sec->output_section)
+  if (bfd_link_relocatable (info) && sec->output_section)
     mmix_elf_section_data (sec->output_section)->pjs.stubs_size_sum
       += (mmix_elf_section_data (sec)->pjs.n_pushj_relocs
          * MAX_PUSHJ_STUB_SIZE);
@@ -2439,11 +2409,12 @@ _bfd_mmix_after_linker_allocation (bfd *abfd ATTRIBUTE_UNUSED,
   if (gregdata->n_remaining_bpo_relocs_this_relaxation_round
       != gregdata->n_bpo_relocs)
     {
-      (*_bfd_error_handler)
-       (_("Internal inconsistency: remaining %u != max %u.\n\
+      _bfd_error_handler
+       /* xgettext:c-format */
+       (_("Internal inconsistency: remaining %lu != max %lu.\n\
   Please report this bug."),
-        gregdata->n_remaining_bpo_relocs_this_relaxation_round,
-        gregdata->n_bpo_relocs);
+        (unsigned long) gregdata->n_remaining_bpo_relocs_this_relaxation_round,
+        (unsigned long) gregdata->n_bpo_relocs);
       return FALSE;
     }
 
@@ -2491,9 +2462,8 @@ bpo_reloc_request_sort_fn (const void * p1, const void * p2)
    from base-plus-offset relocs.  */
 
 void
-mmix_dump_bpo_gregs (link_info, pf)
-     struct bfd_link_info *link_info;
-     bfd_error_handler_type pf;
+mmix_dump_bpo_gregs (struct bfd_link_info *link_info,
+                    void (*pf) (const char *fmt, ...))
 {
   bfd *bpo_greg_owner;
   asection *bpo_gregs_section;
@@ -2585,7 +2555,7 @@ mmix_elf_relax_section (bfd *abfd,
       || (sec->flags & SEC_CODE) == 0
       || (sec->flags & SEC_LINKER_CREATED) != 0
       /* If no R_MMIX_BASE_PLUS_OFFSET relocs and no PUSHJ-stub relocs,
-         then nothing to do.  */
+        then nothing to do.  */
       || (bpodata == NULL
          && mmix_elf_section_data (sec)->pjs.n_pushj_relocs == 0))
     return TRUE;
@@ -2624,7 +2594,7 @@ mmix_elf_relax_section (bfd *abfd,
       /* We process relocs in a distinctly different way when this is a
         relocatable link (for one, we don't look at symbols), so we avoid
         mixing its code with that for the "normal" relaxation.  */
-      if (link_info->relocatable)
+      if (bfd_link_relocatable (link_info))
        {
          /* The only transformation in a relocatable link is to generate
             a full stub at the location of the stub calculated for the
@@ -2709,8 +2679,21 @@ mmix_elf_relax_section (bfd *abfd,
          indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
          h = elf_sym_hashes (abfd)[indx];
          BFD_ASSERT (h != NULL);
-         if (h->root.type != bfd_link_hash_defined
-             && h->root.type != bfd_link_hash_defweak)
+         if (h->root.type == bfd_link_hash_undefweak)
+           /* FIXME: for R_MMIX_PUSHJ_STUBBABLE, there are alternatives to
+              the canonical value 0 for an unresolved weak symbol to
+              consider: as the debug-friendly approach, resolve to "abort"
+              (or a port-specific function), or as the space-friendly
+              approach resolve to the next instruction (like some other
+              ports, notably ARM and AArch64).  These alternatives require
+              matching code in mmix_elf_perform_relocation or its caller.  */
+           symval = 0;
+         else if (h->root.type == bfd_link_hash_defined
+                  || h->root.type == bfd_link_hash_defweak)
+           symval = (h->root.u.def.value
+                     + h->root.u.def.section->output_section->vma
+                     + h->root.u.def.section->output_offset);
+         else
            {
              /* This appears to be a reference to an undefined symbol.  Just
                 ignore it--it will be caught by the regular reloc processing.
@@ -2724,10 +2707,6 @@ mmix_elf_relax_section (bfd *abfd,
                }
              continue;
            }
-
-         symval = (h->root.u.def.value
-                   + h->root.u.def.section->output_section->vma
-                   + h->root.u.def.section->output_offset);
        }
 
       if (ELF64_R_TYPE (irel->r_info) == (int) R_MMIX_PUSHJ_STUBBABLE)
@@ -2865,6 +2844,8 @@ mmix_elf_relax_section (bfd *abfd,
        }
     }
 
+  BFD_ASSERT(pjsno == mmix_elf_section_data (sec)->pjs.n_pushj_relocs);
+
   if (internal_relocs != NULL
       && elf_section_data (sec)->relocs != internal_relocs)
     free (internal_relocs);
@@ -2890,7 +2871,7 @@ mmix_elf_relax_section (bfd *abfd,
 }
 \f
 #define ELF_ARCH               bfd_arch_mmix
-#define ELF_MACHINE_CODE       EM_MMIX
+#define ELF_MACHINE_CODE       EM_MMIX
 
 /* According to mmix-doc page 36 (paragraph 45), this should be (1LL << 48LL).
    However, that's too much for something somewhere in the linker part of
@@ -2913,7 +2894,6 @@ mmix_elf_relax_section (bfd *abfd,
 #define elf_info_to_howto              mmix_info_to_howto_rela
 #define elf_backend_relocate_section   mmix_elf_relocate_section
 #define elf_backend_gc_mark_hook       mmix_elf_gc_mark_hook
-#define elf_backend_gc_sweep_hook      mmix_elf_gc_sweep_hook
 
 #define elf_backend_link_output_symbol_hook \
        mmix_elf_link_output_symbol_hook
@@ -2921,8 +2901,10 @@ mmix_elf_relax_section (bfd *abfd,
 
 #define elf_backend_check_relocs       mmix_elf_check_relocs
 #define elf_backend_symbol_processing  mmix_elf_symbol_processing
-#define elf_backend_omit_section_dynsym \
-  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
+#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
+
+#define bfd_elf64_bfd_copy_link_hash_symbol_type \
+  _bfd_generic_copy_link_hash_symbol_type
 
 #define bfd_elf64_bfd_is_local_label_name \
        mmix_elf_is_local_label_name
This page took 0.051851 seconds and 4 git commands to generate.