X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-d10v.c;h=bd07ad68b2844577606d926baa280b62227dc913;hb=7355afa1c3a40172c4d85564c2630c5c9d18038a;hp=e0e93c8470fc814f03d62f2691076bfc2f9dd7fe;hpb=dbaa2011452c7ce7ca612c6298964452dce179eb;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-d10v.c b/bfd/elf32-d10v.c index e0e93c8470..bd07ad68b2 100644 --- a/bfd/elf32-d10v.c +++ b/bfd/elf32-d10v.c @@ -1,6 +1,5 @@ /* D10V-specific support for 32-bit ELF - Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2010, 2012 Free Software Foundation, Inc. + Copyright (C) 1996-2019 Free Software Foundation, Inc. Contributed by Martin Hunt (hunt@cygnus.com). This file is part of BFD, the Binary File Descriptor library. @@ -34,8 +33,8 @@ static reloc_howto_type elf_d10v_howto_table[] = /* This reloc does nothing. */ HOWTO (R_D10V_NONE, /* Type. */ 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 32, /* Bitsize. */ + 3, /* Size (0 = byte, 1 = short, 2 = long). */ + 0, /* Bitsize. */ FALSE, /* PC_relative. */ 0, /* Bitpos. */ complain_overflow_dont,/* Complain_on_overflow. */ @@ -48,32 +47,32 @@ static reloc_howto_type elf_d10v_howto_table[] = /* An PC Relative 10-bit relocation, shifted by 2, right container. */ HOWTO (R_D10V_10_PCREL_R, /* Type. */ - 2, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 8, /* Bitsize. */ - TRUE, /* PC_relative. */ - 0, /* Bitpos. */ + 2, /* Rightshift. */ + 2, /* Size (0 = byte, 1 = short, 2 = long). */ + 8, /* Bitsize. */ + TRUE, /* PC_relative. */ + 0, /* Bitpos. */ complain_overflow_signed, /* Complain_on_overflow. */ bfd_elf_generic_reloc, /* Special_function. */ "R_D10V_10_PCREL_R", /* Name. */ - FALSE, /* Partial_inplace. */ + FALSE, /* Partial_inplace. */ 0xff, /* Src_mask. */ - 0xff, /* Dst_mask. */ + 0xff, /* Dst_mask. */ TRUE), /* PCrel_offset. */ /* An PC Relative 10-bit relocation, shifted by 2, left container. */ HOWTO (R_D10V_10_PCREL_L, /* Type. */ - 2, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 8, /* Bitsize. */ - TRUE, /* PC_relative. */ - 15, /* Bitpos. */ + 2, /* Rightshift. */ + 2, /* Size (0 = byte, 1 = short, 2 = long). */ + 8, /* Bitsize. */ + TRUE, /* PC_relative. */ + 15, /* Bitpos. */ complain_overflow_signed, /* Complain_on_overflow. */ bfd_elf_generic_reloc, /* Special_function. */ "R_D10V_10_PCREL_L", /* Name. */ - FALSE, /* Partial_inplace. */ + FALSE, /* Partial_inplace. */ 0x07f8000, /* Src_mask. */ - 0x07f8000, /* Dst_mask. */ + 0x07f8000, /* Dst_mask. */ TRUE), /* PCrel_offset. */ /* A 16 bit absolute relocation. */ @@ -138,33 +137,33 @@ static reloc_howto_type elf_d10v_howto_table[] = /* GNU extension to record C++ vtable hierarchy. */ HOWTO (R_D10V_GNU_VTINHERIT, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 0, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ + 0, /* Rightshift. */ + 2, /* Size (0 = byte, 1 = short, 2 = long). */ + 0, /* Bitsize. */ + FALSE, /* PC_relative. */ + 0, /* Bitpos. */ complain_overflow_dont,/* Complain_on_overflow. */ - NULL, /* Special_function. */ + NULL, /* Special_function. */ "R_D10V_GNU_VTINHERIT",/* Name. */ - FALSE, /* Partial_inplace. */ - 0, /* Src_mask. */ - 0, /* Dst_mask. */ - FALSE), /* PCrel_offset. */ + FALSE, /* Partial_inplace. */ + 0, /* Src_mask. */ + 0, /* Dst_mask. */ + FALSE), /* PCrel_offset. */ /* GNU extension to record C++ vtable member usage. */ - HOWTO (R_D10V_GNU_VTENTRY, /* Type. */ - 0, /* Rightshift. */ - 2, /* Size (0 = byte, 1 = short, 2 = long). */ - 0, /* Bitsize. */ - FALSE, /* PC_relative. */ - 0, /* Bitpos. */ + HOWTO (R_D10V_GNU_VTENTRY, /* Type. */ + 0, /* Rightshift. */ + 2, /* Size (0 = byte, 1 = short, 2 = long). */ + 0, /* Bitsize. */ + FALSE, /* PC_relative. */ + 0, /* Bitpos. */ complain_overflow_dont,/* Complain_on_overflow. */ _bfd_elf_rel_vtable_reloc_fn, /* Special_function. */ - "R_D10V_GNU_VTENTRY", /* Name. */ - FALSE, /* Partial_inplace. */ - 0, /* Src_mask. */ - 0, /* Dst_mask. */ - FALSE), /* PCrel_offset. */ + "R_D10V_GNU_VTENTRY", /* Name. */ + FALSE, /* Partial_inplace. */ + 0, /* Src_mask. */ + 0, /* Dst_mask. */ + FALSE), /* PCrel_offset. */ }; /* Map BFD reloc types to D10V ELF reloc types. */ @@ -221,16 +220,24 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, /* Set the howto pointer for an D10V ELF reloc. */ -static void -d10v_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, +static bfd_boolean +d10v_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) { unsigned int r_type; r_type = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (r_type < (unsigned int) R_D10V_max); + if (r_type >= (unsigned int) R_D10V_max) + { + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } cache_ptr->howto = &elf_d10v_howto_table[r_type]; + return TRUE; } static asection * @@ -266,7 +273,7 @@ elf32_d10v_check_relocs (bfd *abfd, const Elf_Internal_Rela *rel; const Elf_Internal_Rela *rel_end; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -280,7 +287,7 @@ elf32_d10v_check_relocs (bfd *abfd, r_symndx = ELF32_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]; @@ -290,23 +297,21 @@ elf32_d10v_check_relocs (bfd *abfd, } switch (ELF32_R_TYPE (rel->r_info)) - { - /* This relocation describes the C++ object vtable hierarchy. - Reconstruct it for later use during GC. */ - case R_D10V_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_D10V_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset)) - return FALSE; - break; - } + { + /* This relocation describes the C++ object vtable hierarchy. + Reconstruct it for later use during GC. */ + case R_D10V_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_D10V_GNU_VTENTRY: + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset)) + return FALSE; + break; + } } return TRUE; @@ -416,8 +421,8 @@ elf32_d10v_relocate_section (bfd *output_bfd, r_type = ELF32_R_TYPE (rel->r_info); if (r_type == R_D10V_GNU_VTENTRY - || r_type == R_D10V_GNU_VTINHERIT) - continue; + || r_type == R_D10V_GNU_VTINHERIT) + continue; howto = elf_d10v_howto_table + r_type; h = NULL; @@ -432,7 +437,7 @@ elf32_d10v_relocate_section (bfd *output_bfd, + sym->st_value); if (ELF_ST_TYPE (sym->st_info) == STT_SECTION && ((sec->flags & SEC_MERGE) != 0 - || (info->relocatable + || (bfd_link_relocatable (info) && sec->output_offset != 0))) { bfd_vma addend; @@ -440,7 +445,7 @@ elf32_d10v_relocate_section (bfd *output_bfd, addend = extract_rel_addend (input_bfd, where, howto); - if (info->relocatable) + if (bfd_link_relocatable (info)) addend += sec->output_offset; else { @@ -455,19 +460,19 @@ elf32_d10v_relocate_section (bfd *output_bfd, } else { - bfd_boolean unresolved_reloc, warned; + bfd_boolean unresolved_reloc, warned, ignored; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); } if (sec != NULL && discarded_section (sec)) RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, - rel, relend, howto, contents); + rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; if (h != NULL) @@ -477,12 +482,12 @@ elf32_d10v_relocate_section (bfd *output_bfd, name = (bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name)); if (name == NULL || *name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, (bfd_vma) 0); + contents, rel->r_offset, + relocation, (bfd_vma) 0); if (r != bfd_reloc_ok) { @@ -491,18 +496,14 @@ elf32_d10v_relocate_section (bfd *output_bfd, switch (r) { case bfd_reloc_overflow: - if (!((*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, - rel->r_offset))) - return FALSE; + (*info->callbacks->reloc_overflow) + (info, (h ? &h->root : NULL), name, howto->name, + (bfd_vma) 0, input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - if (!((*info->callbacks->undefined_symbol) - (info, name, input_bfd, input_section, - rel->r_offset, TRUE))) - return FALSE; + (*info->callbacks->undefined_symbol) + (info, name, input_bfd, input_section, rel->r_offset, TRUE); break; case bfd_reloc_outofrange: @@ -522,10 +523,8 @@ elf32_d10v_relocate_section (bfd *output_bfd, /* fall through */ common_error: - if (!((*info->callbacks->warning) - (info, msg, name, input_bfd, input_section, - rel->r_offset))) - return FALSE; + (*info->callbacks->warning) (info, msg, name, input_bfd, + input_section, rel->r_offset); break; } } @@ -538,16 +537,15 @@ elf32_d10v_relocate_section (bfd *output_bfd, #define ELF_MACHINE_ALT1 EM_CYGNUS_D10V #define ELF_MAXPAGESIZE 0x1000 -#define TARGET_BIG_SYM bfd_elf32_d10v_vec +#define TARGET_BIG_SYM d10v_elf32_vec #define TARGET_BIG_NAME "elf32-d10v" -#define elf_info_to_howto 0 -#define elf_info_to_howto_rel d10v_info_to_howto_rel -#define elf_backend_object_p 0 -#define elf_backend_final_write_processing 0 -#define elf_backend_gc_mark_hook elf32_d10v_gc_mark_hook -#define elf_backend_check_relocs elf32_d10v_check_relocs -#define elf_backend_relocate_section elf32_d10v_relocate_section -#define elf_backend_can_gc_sections 1 +#define elf_info_to_howto NULL +#define elf_info_to_howto_rel d10v_info_to_howto_rel +#define elf_backend_object_p 0 +#define elf_backend_gc_mark_hook elf32_d10v_gc_mark_hook +#define elf_backend_check_relocs elf32_d10v_check_relocs +#define elf_backend_relocate_section elf32_d10v_relocate_section +#define elf_backend_can_gc_sections 1 #include "elf32-target.h"