X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-v850.c;h=0235044d2de47d79b06b1c656da6e5b7fdab6688;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=99c060afc9a713b3d2929e6518b8bcdca3ff5467;hpb=219d1afa89d0d53ca93a684cac341f16470f3ca0;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c index 99c060afc9..0235044d2d 100644 --- a/bfd/elf32-v850.c +++ b/bfd/elf32-v850.c @@ -1,5 +1,5 @@ /* V850-specific support for 32-bit ELF - Copyright (C) 1996-2018 Free Software Foundation, Inc. + Copyright (C) 1996-2020 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -29,6 +29,7 @@ #include "elf-bfd.h" #include "elf/v850.h" #include "libiberty.h" +#include "elf32-v850.h" /* Sign-extend a 17-bit number. */ #define SEXT17(x) ((((x) & 0x1ffff) ^ 0x10000) - 0x10000) @@ -61,7 +62,7 @@ v850_elf_check_relocs (bfd *abfd, return TRUE; #ifdef DEBUG - _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B", + _bfd_error_handler ("v850_elf_check_relocs called for section %pA in %pB", sec, abfd); #endif @@ -101,9 +102,7 @@ v850_elf_check_relocs (bfd *abfd, /* This relocation describes which C++ vtable entries are actually used. Record for later use during GC. */ case R_V850_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) return FALSE; break; @@ -150,19 +149,19 @@ v850_elf_check_relocs (bfd *abfd, switch (h->other & V850_OTHER_MASK) { default: - msg = _("Variable `%s' cannot occupy in multiple small data regions"); + msg = _("variable `%s' cannot occupy in multiple small data regions"); break; case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA: - msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions"); + msg = _("variable `%s' can only be in one of the small, zero, and tiny data regions"); break; case V850_OTHER_SDA | V850_OTHER_ZDA: - msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously"); + msg = _("variable `%s' cannot be in both small and zero data regions simultaneously"); break; case V850_OTHER_SDA | V850_OTHER_TDA: - msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously"); + msg = _("variable `%s' cannot be in both small and tiny data regions simultaneously"); break; case V850_OTHER_ZDA | V850_OTHER_TDA: - msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously"); + msg = _("variable `%s' cannot be in both zero and tiny data regions simultaneously"); break; } @@ -179,7 +178,7 @@ v850_elf_check_relocs (bfd *abfd, if (h && h->root.type == bfd_link_hash_common && h->root.u.c.p - && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON")) + && !strcmp (bfd_section_name (h->root.u.c.p->section), "COMMON")) { asection * section; @@ -231,7 +230,7 @@ static void remember_hi16s_reloc (bfd *abfd, bfd_vma addend, bfd_byte *address) { hi16s_location * entry = NULL; - bfd_size_type amt = sizeof (* free_hi16s); + size_t amt = sizeof (* free_hi16s); /* Find a free structure. */ if (free_hi16s == NULL) @@ -460,7 +459,7 @@ v850_elf_perform_lo16_relocation (bfd *abfd, unsigned long *insn, } else { - _bfd_error_handler (_("FAILED to find previous HI16 reloc")); + _bfd_error_handler (_("failed to find previous HI16 reloc")); return FALSE; } } @@ -490,7 +489,8 @@ v850_elf_perform_relocation (bfd *abfd, { default: #ifdef DEBUG - fprintf (stderr, "%B: reloc number %d not recognised\n", abfd, r_type); + _bfd_error_handler ("%pB: unsupported relocation type %#x", + abfd, r_type); #endif return bfd_reloc_notsupported; @@ -1884,8 +1884,8 @@ v850_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, /* Set the howto pointer for an V850 ELF reloc. */ -static void -v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, +static bfd_boolean +v850_elf_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) { @@ -1895,16 +1895,19 @@ v850_elf_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, if (r_type >= (unsigned int) R_V850_max) { /* xgettext:c-format */ - _bfd_error_handler (_("%B: invalid V850 reloc number: %d"), abfd, r_type); - r_type = 0; + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return FALSE; } cache_ptr->howto = &v850_elf_howto_table[r_type]; + return TRUE; } /* Set the howto pointer for a V850 ELF reloc (type RELA). */ -static void -v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, +static bfd_boolean +v850_elf_info_to_howto_rela (bfd *abfd, arelent * cache_ptr, Elf_Internal_Rela *dst) { @@ -1914,10 +1917,13 @@ v850_elf_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, if (r_type >= (unsigned int) R_V850_max) { /* xgettext:c-format */ - _bfd_error_handler (_("%B: invalid V850 reloc number: %d"), abfd, r_type); - r_type = 0; + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return FALSE; } cache_ptr->howto = &v850_elf_howto_table[r_type]; + return TRUE; } static bfd_boolean @@ -2145,7 +2151,8 @@ v850_elf_final_link_relocate (reloc_howto_type *howto, default: #ifdef DEBUG - fprintf (stderr, "%B: reloc number %d not recognised\n", input_bfd, r_type); + _bfd_error_handler ("%pB: unsupported relocation type %#x", + input_bfd, r_type); #endif return bfd_reloc_notsupported; } @@ -2263,7 +2270,7 @@ v850_elf_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); } switch ((int) r) @@ -2366,11 +2373,11 @@ v850_elf_make_note_section (bfd * abfd) if (s == NULL) return NULL; - if (!bfd_set_section_alignment (abfd, s, 2)) + if (!bfd_set_section_alignment (s, 2)) return NULL; /* Allocate space for all known notes. */ - if (!bfd_set_section_size (abfd, s, NUM_V850_NOTES * SIZEOF_V850_NOTE)) + if (!bfd_set_section_size (s, NUM_V850_NOTES * SIZEOF_V850_NOTE)) return NULL; data = bfd_zalloc (abfd, NUM_V850_NOTES * SIZEOF_V850_NOTE); @@ -2437,7 +2444,7 @@ v850_elf_copy_notes (bfd *ibfd, bfd *obfd) if ((inotes = bfd_get_section_by_name (ibfd, V850_NOTE_SECNAME)) == NULL) return; - if (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes)) + if (bfd_section_size (inotes) == bfd_section_size (onotes)) { bfd_byte * icont; bfd_byte * ocont; @@ -2451,7 +2458,7 @@ v850_elf_copy_notes (bfd *ibfd, bfd *obfd) return; /* Copy/overwrite notes from the input to the output. */ - memcpy (ocont, icont, bfd_section_size (obfd, onotes)); + memcpy (ocont, icont, bfd_section_size (onotes)); } } @@ -2484,7 +2491,7 @@ v850_elf_merge_notes (bfd * ibfd, bfd *obfd) bfd_byte * icont; bfd_byte * ocont; - BFD_ASSERT (bfd_section_size (ibfd, inotes) == bfd_section_size (obfd, onotes)); + BFD_ASSERT (bfd_section_size (inotes) == bfd_section_size (onotes)); if ((icont = elf_section_data (inotes)->this_hdr.contents) == NULL) BFD_ASSERT (bfd_malloc_and_get_section (ibfd, inotes, & icont)); @@ -2521,7 +2528,7 @@ v850_elf_merge_notes (bfd * ibfd, bfd *obfd) { _bfd_error_handler /* xgettext:c-format */ - (_("error: %B needs 8-byte alignment but %B is set for 4-byte alignment"), + (_("error: %pB needs 8-byte alignment but %pB is set for 4-byte alignment"), ibfd, obfd); result = FALSE; } @@ -2537,8 +2544,8 @@ v850_elf_merge_notes (bfd * ibfd, bfd *obfd) { _bfd_error_handler /* xgettext:c-format */ - (_("error: %B uses 64-bit doubles but " - "%B uses 32-bit doubles"), ibfd, obfd); + (_("error: %pB uses 64-bit doubles but " + "%pB uses 32-bit doubles"), ibfd, obfd); result = FALSE; } else @@ -2552,7 +2559,7 @@ v850_elf_merge_notes (bfd * ibfd, bfd *obfd) { _bfd_error_handler /* xgettext:c-format */ - (_("error: %B uses FPU-3.0 but %B only supports FPU-2.0"), + (_("error: %pB uses FPU-3.0 but %pB only supports FPU-2.0"), ibfd, obfd); result = FALSE; } @@ -2666,7 +2673,7 @@ v850_elf_print_notes (bfd * abfd, FILE * file) if (notes == NULL || notes->contents == NULL) return; - BFD_ASSERT (bfd_section_size (abfd, notes) == NUM_V850_NOTES * SIZEOF_V850_NOTE); + BFD_ASSERT (bfd_section_size (notes) == NUM_V850_NOTES * SIZEOF_V850_NOTE); for (id = V850_NOTE_ALIGNMENT; id <= NUM_V850_NOTES; id++) print_v850_note (abfd, file, notes->contents, id); @@ -2712,9 +2719,8 @@ v850_elf_object_p (bfd *abfd) /* Store the machine number in the flags field. */ -static void -v850_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +static bfd_boolean +v850_elf_final_write_processing (bfd *abfd) { unsigned long val; @@ -2744,6 +2750,7 @@ v850_elf_final_write_processing (bfd *abfd, default: break; } + return _bfd_elf_final_write_processing (abfd); } /* Function to keep V850 specific file flags. */ @@ -2809,7 +2816,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) if ((in_flags & EF_V800_850E3) != (out_flags & EF_V800_850E3)) { _bfd_error_handler - (_("%B: Architecture mismatch with previous modules"), ibfd); + (_("%pB: architecture mismatch with previous modules"), ibfd); elf_elfheader (obfd)->e_flags |= EF_V800_850E3; } @@ -2865,7 +2872,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) } _bfd_error_handler - (_("%B: Architecture mismatch with previous modules"), ibfd); + (_("%pB: architecture mismatch with previous modules"), ibfd); } return result; @@ -2940,11 +2947,11 @@ v850_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, int *retval) { - if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0) + if (strcmp (bfd_section_name (sec), ".scommon") == 0) *retval = SHN_V850_SCOMMON; - else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0) + else if (strcmp (bfd_section_name (sec), ".tcommon") == 0) *retval = SHN_V850_TCOMMON; - else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0) + else if (strcmp (bfd_section_name (sec), ".zcommon") == 0) *retval = SHN_V850_ZCOMMON; else return FALSE; @@ -3144,6 +3151,8 @@ v850_elf_section_from_shdr (bfd *abfd, const char *name, int shindex) { + flagword flags; + /* There ought to be a place to keep ELF backend specific flags, but at the moment there isn't one. We just keep track of the sections by their name, instead. */ @@ -3151,19 +3160,21 @@ v850_elf_section_from_shdr (bfd *abfd, if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex)) return FALSE; + flags = 0; switch (hdr->sh_type) { case SHT_V850_SCOMMON: case SHT_V850_TCOMMON: case SHT_V850_ZCOMMON: - if (! bfd_set_section_flags (abfd, hdr->bfd_section, - (bfd_get_section_flags (abfd, - hdr->bfd_section) - | SEC_IS_COMMON))) - return FALSE; + flags = SEC_IS_COMMON; } - return TRUE; + if ((hdr->sh_flags & SHF_V850_GPREL) != 0) + flags |= SEC_SMALL_DATA; + + return (flags == 0 + || bfd_set_section_flags (hdr->bfd_section, + hdr->bfd_section->flags | flags)); } /* Set the correct type for a V850 ELF section. We do this @@ -3176,7 +3187,7 @@ v850_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, { const char * name; - name = bfd_get_section_name (abfd, sec); + name = bfd_section_name (sec); if (strcmp (name, ".scommon") == 0) hdr->sh_type = SHT_V850_SCOMMON; @@ -3598,9 +3609,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insns"), - abfd, irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL"); continue; } @@ -3608,10 +3619,11 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insn %#x"), abfd, - irel->r_offset + no_match, + (uint64_t) (irel->r_offset + no_match), + "R_V850_LONGCALL", insn[no_match]); continue; } @@ -3653,9 +3665,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized reloc"), - abfd, irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL"); continue; } @@ -3693,10 +3705,10 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGCALL points to " - "unrecognized reloc %#Lx"), - abfd, irel->r_offset, - irelcall->r_offset); + (_("%pB: %#" PRIx64 ": warning: %s points to " + "unrecognized reloc %#" PRIx64), + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL", + (uint64_t) irelcall->r_offset); continue; } @@ -3830,15 +3842,15 @@ v850_elf_relax_section (bfd *abfd, if (no_match < 0 && ((insn[2] & JMP_R_MASK) != JMP_R || MOVEA_R2 (insn[1]) != JMP_R1 (insn[2]))) - no_match = 4; + no_match = 2; } else { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insns"), - abfd, irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGJUMP"); continue; } @@ -3846,10 +3858,11 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insn %#x"), abfd, - irel->r_offset + no_match, + (uint64_t) (irel->r_offset + no_match), + "R_V850_LONGJUMP", insn[no_match]); continue; } @@ -3880,9 +3893,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: %#Lx: warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized reloc"), - abfd, irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGJUMP"); continue; } @@ -4080,16 +4093,13 @@ v850_elf_relax_section (bfd *abfd, } finish: - if (internal_relocs != NULL - && elf_section_data (sec)->relocs != internal_relocs) + if (elf_section_data (sec)->relocs != internal_relocs) free (internal_relocs); - if (contents != NULL - && elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents) + if (elf_section_data (sec)->this_hdr.contents != (unsigned char *) contents) free (contents); - if (isymbuf != NULL - && symtab_hdr->contents != (bfd_byte *) isymbuf) + if (symtab_hdr->contents != (bfd_byte *) isymbuf) free (isymbuf); return result; @@ -4241,25 +4251,30 @@ v800_elf_reloc_name_lookup (bfd * abfd, const char * r_name) /* Set the howto pointer in CACHE_PTR for a V800 ELF reloc. */ -static void +static bfd_boolean v800_elf_info_to_howto (bfd * abfd, arelent * cache_ptr, Elf_Internal_Rela * dst) { unsigned int r_type = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_v850_rh850); - - BFD_ASSERT (r_type < (unsigned int) R_V800_max); - if (r_type == R_V800_NONE) r_type = R_V810_NONE; - BFD_ASSERT (r_type >= (unsigned int) R_V810_NONE); - r_type -= R_V810_NONE; - BFD_ASSERT (r_type < ARRAY_SIZE (v800_elf_howto_table)); + if (bfd_get_arch (abfd) != bfd_arch_v850_rh850 + || r_type >= (unsigned int) R_V800_max + || r_type < (unsigned int) R_V810_NONE + || (r_type - R_V810_NONE) >= ARRAY_SIZE (v800_elf_howto_table)) + { + /* 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 = v800_elf_howto_table + r_type; + cache_ptr->howto = v800_elf_howto_table + (r_type - R_V810_NONE); + return TRUE; } #undef TARGET_LITTLE_SYM