i386: Also check R12-R15 registers when optimizing testq to testb
[deliverable/binutils-gdb.git] / bfd / elf64-alpha.c
index db4001cce19e30dca138fe6297780fea5ccb3805..f312a6e03d640691927260cdc8e581378b5342c1 100644 (file)
@@ -1,5 +1,5 @@
 /* Alpha specific support for 64-bit ELF
-   Copyright (C) 1996-2018 Free Software Foundation, Inc.
+   Copyright (C) 1996-2019 Free Software Foundation, Inc.
    Contributed by Richard Henderson <rth@tamu.edu>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -27,6 +27,7 @@
 #include "bfd.h"
 #include "libbfd.h"
 #include "elf-bfd.h"
+#include "ecoff-bfd.h"
 
 #include "elf/alpha.h"
 
@@ -1100,8 +1101,8 @@ elf64_alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
 
 /* Given an Alpha ELF reloc type, fill in an arelent structure.  */
 
-static void
-elf64_alpha_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+static bfd_boolean
+elf64_alpha_info_to_howto (bfd *abfd, arelent *cache_ptr,
                           Elf_Internal_Rela *dst)
 {
   unsigned r_type = ELF64_R_TYPE(dst->r_info);
@@ -1109,12 +1110,13 @@ elf64_alpha_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
   if (r_type >= R_ALPHA_max)
     {
       /* xgettext:c-format */
-      _bfd_error_handler (_("%B: unrecognised Alpha reloc number: %d"),
+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
                          abfd, r_type);
       bfd_set_error (bfd_error_bad_value);
-      r_type = R_ALPHA_NONE;
+      return FALSE;
     }
   cache_ptr->howto = &elf64_alpha_howto_table[r_type];
+  return TRUE;
 }
 
 /* These two relocations create a two-word entry in the got.  */
@@ -1167,9 +1169,8 @@ elf64_alpha_section_from_shdr (bfd *abfd,
 
   if (hdr->sh_type == SHT_ALPHA_DEBUG)
     {
-      if (! bfd_set_section_flags (abfd, newsect,
-                                  (bfd_get_section_flags (abfd, newsect)
-                                   | SEC_DEBUGGING)))
+      if (!bfd_set_section_flags (newsect,
+                                 bfd_section_flags (newsect) | SEC_DEBUGGING))
        return FALSE;
     }
 
@@ -1195,7 +1196,7 @@ elf64_alpha_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
 {
   register const char *name;
 
-  name = bfd_get_section_name (abfd, sec);
+  name = bfd_section_name (sec);
 
   if (strcmp (name, ".mdebug") == 0)
     {
@@ -1269,7 +1270,7 @@ elf64_alpha_create_got_section (bfd *abfd,
           | SEC_LINKER_CREATED);
   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
   if (s == NULL
-      || !bfd_set_section_alignment (abfd, s, 3))
+      || !bfd_set_section_alignment (s, 3))
     return FALSE;
 
   alpha_elf_tdata (abfd)->got = s;
@@ -1301,7 +1302,7 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
           | (elf64_alpha_use_secureplt ? SEC_READONLY : 0));
   s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags);
   elf_hash_table (info)->splt = s;
-  if (s == NULL || ! bfd_set_section_alignment (abfd, s, 4))
+  if (s == NULL || ! bfd_set_section_alignment (s, 4))
     return FALSE;
 
   /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
@@ -1316,7 +1317,7 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
           | SEC_LINKER_CREATED | SEC_READONLY);
   s = bfd_make_section_anyway_with_flags (abfd, ".rela.plt", flags);
   elf_hash_table (info)->srelplt = s;
-  if (s == NULL || ! bfd_set_section_alignment (abfd, s, 3))
+  if (s == NULL || ! bfd_set_section_alignment (s, 3))
     return FALSE;
 
   if (elf64_alpha_use_secureplt)
@@ -1324,7 +1325,7 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
       flags = SEC_ALLOC | SEC_LINKER_CREATED;
       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
       elf_hash_table (info)->sgotplt = s;
-      if (s == NULL || ! bfd_set_section_alignment (abfd, s, 3))
+      if (s == NULL || ! bfd_set_section_alignment (s, 3))
        return FALSE;
     }
 
@@ -1342,7 +1343,7 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   s = bfd_make_section_anyway_with_flags (abfd, ".rela.got", flags);
   elf_hash_table (info)->srelgot = s;
   if (s == NULL
-      || !bfd_set_section_alignment (abfd, s, 3))
+      || !bfd_set_section_alignment (s, 3))
     return FALSE;
 
   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
@@ -1466,8 +1467,9 @@ elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols,
   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
                                     filename_ptr, functionname_ptr,
                                     line_ptr, discriminator_ptr,
-                                    dwarf_debug_sections, 0,
-                                    &elf_tdata (abfd)->dwarf2_find_line_info))
+                                    dwarf_debug_sections,
+                                    &elf_tdata (abfd)->dwarf2_find_line_info)
+      == 1)
     return TRUE;
 
   msec = bfd_get_section_by_name (abfd, ".mdebug");
@@ -1615,7 +1617,7 @@ elf64_alpha_output_extsym (struct alpha_elf_link_hash_entry *h, void * data)
            h->esym.asym.sc = scUndefined;
          else
            {
-             name = bfd_section_name (output_section->owner, output_section);
+             name = bfd_section_name (output_section);
 
              if (strcmp (name, ".text") == 0)
                h->esym.asym.sc = scText;
@@ -2459,7 +2461,7 @@ elf64_alpha_size_got_sections (struct bfd_link_info *info,
              /* Yikes! A single object file has too many entries.  */
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: .got subsegment exceeds 64K (size %d)"),
+               (_("%pB: .got subsegment exceeds 64K (size %d)"),
                 i, alpha_elf_tdata (this_got)->total_got_size);
              return FALSE;
            }
@@ -2859,7 +2861,7 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       /* It's OK to base decisions on the section name, because none
         of the dynobj section names depend upon the input files.  */
-      name = bfd_get_section_name (dynobj, s);
+      name = bfd_section_name (s);
 
       if (CONST_STRNEQ (name, ".rela"))
        {
@@ -3014,8 +3016,9 @@ elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
       reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%B: %A+%#Lx: warning: %s relocation against unexpected insn"),
-        info->abfd, info->sec, irel->r_offset, howto->name);
+       (_("%pB: %pA+%#" PRIx64 ": warning: "
+          "%s relocation against unexpected insn"),
+        info->abfd, info->sec, (uint64_t) irel->r_offset, howto->name);
       return TRUE;
     }
 
@@ -3209,8 +3212,9 @@ elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
     {
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%B: %A+%#Lx: warning: LITERAL relocation against unexpected insn"),
-        abfd, info->sec, irel->r_offset);
+       (_("%pB: %pA+%#" PRIx64 ": warning: "
+          "%s relocation against unexpected insn"),
+        abfd, info->sec, (uint64_t) irel->r_offset, "LITERAL");
       return TRUE;
     }
 
@@ -4095,7 +4099,7 @@ elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: unknown relocation type %d"),
+           (_("%pB: unsupported relocation type %#x"),
             input_bfd, (int) r_type);
          bfd_set_error (bfd_error_bad_value);
          ret_val = FALSE;
@@ -4243,7 +4247,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: unknown relocation type %d"),
+           (_("%pB: unsupported relocation type %#x"),
             input_bfd, (int) r_type);
          bfd_set_error (bfd_error_bad_value);
          ret_val = FALSE;
@@ -4409,7 +4413,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: gp-relative relocation against dynamic symbol %s"),
+               (_("%pB: gp-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4422,7 +4426,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: gp-relative relocation against dynamic symbol %s"),
+               (_("%pB: gp-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4449,7 +4453,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: pc-relative relocation against dynamic symbol %s"),
+               (_("%pB: pc-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4478,7 +4482,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
              {
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B: change in gp: BRSGP %s"),
+                 (_("%pB: change in gp: BRSGP %s"),
                   input_bfd, h->root.root.root.string);
                ret_val = FALSE;
              }
@@ -4505,11 +4509,11 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                    if (name == NULL)
                      name = _("<unknown>");
                    else if (name[0] == 0)
-                     name = bfd_section_name (input_bfd, sec);
+                     name = bfd_section_name (sec);
                  }
                _bfd_error_handler
                  /* xgettext:c-format */
-                 (_("%B: !samegp reloc against symbol without .prologue: %s"),
+                 (_("%pB: !samegp reloc against symbol without .prologue: %s"),
                   input_bfd, name);
                ret_val = FALSE;
                break;
@@ -4567,7 +4571,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                  {
                    _bfd_error_handler
                      /* xgettext:c-format */
-                     (_("%B: unhandled dynamic relocation against %s"),
+                     (_("%pB: unhandled dynamic relocation against %s"),
                       input_bfd,
                       h->root.root.root.string);
                    ret_val = FALSE;
@@ -4593,7 +4597,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: pc-relative relocation against dynamic symbol %s"),
+               (_("%pB: pc-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4602,7 +4606,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: pc-relative relocation against undefined weak symbol %s"),
+               (_("%pB: pc-relative relocation against undefined weak symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4668,7 +4672,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: dtp-relative relocation against dynamic symbol %s"),
+               (_("%pB: dtp-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4685,7 +4689,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: TLS local exec code cannot be linked into shared objects"),
+               (_("%pB: TLS local exec code cannot be linked into shared objects"),
                input_bfd);
              ret_val = FALSE;
            }
@@ -4693,7 +4697,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: tp-relative relocation against dynamic symbol %s"),
+               (_("%pB: tp-relative relocation against dynamic symbol %s"),
                 input_bfd, h->root.root.root.string);
              ret_val = FALSE;
            }
@@ -4721,7 +4725,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
                  if (r_type == R_ALPHA_GOTDTPREL)
                    value -= dtp_base;
-                 else if (!bfd_link_pic (info))
+                 else if (bfd_link_executable (info))
                    value -= tp_base;
                  else
                    {
@@ -4776,7 +4780,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                if (name == NULL)
                  return FALSE;
                if (*name == '\0')
-                 name = bfd_section_name (input_bfd, sec);
+                 name = bfd_section_name (sec);
              }
            (*info->callbacks->reloc_overflow)
              (info, (h ? &h->root.root : NULL), name, howto->name,
@@ -5495,7 +5499,7 @@ static const struct elf_size_info alpha_elf_size_info =
 #define elf_backend_size_dynamic_sections \
   elf64_alpha_size_dynamic_sections
 #define elf_backend_omit_section_dynsym \
-  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
+  _bfd_elf_omit_section_dynsym_all
 #define elf_backend_relocate_section \
   elf64_alpha_relocate_section
 #define elf_backend_finish_dynamic_symbol \
@@ -5541,12 +5545,14 @@ static const struct elf_size_info alpha_elf_size_info =
    "FreeBSD" label in the ELF header.  So we put this label on all
    executables and (for simplicity) also all other object files.  */
 
-static void
-elf64_alpha_fbsd_post_process_headers (bfd * abfd,
-       struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
+static bfd_boolean
+elf64_alpha_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
 {
   Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
 
+  if (!_bfd_elf_init_file_header (abfd, info))
+    return FALSE;
+
   i_ehdrp = elf_elfheader (abfd);
 
   /* Put an ABI label supported by FreeBSD >= 4.1.  */
@@ -5555,11 +5561,12 @@ elf64_alpha_fbsd_post_process_headers (bfd * abfd,
   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
 #endif
+  return TRUE;
 }
 
-#undef elf_backend_post_process_headers
-#define elf_backend_post_process_headers \
-  elf64_alpha_fbsd_post_process_headers
+#undef elf_backend_init_file_header
+#define elf_backend_init_file_header \
+  elf64_alpha_fbsd_init_file_header
 
 #undef  elf64_bed
 #define elf64_bed elf64_alpha_fbsd_bed
This page took 0.03091 seconds and 4 git commands to generate.