X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-v850.c;h=bf37a936620f12a3c6482d265ae2a7e2c6ae09d5;hb=efba5c2319d6c25393e5cce9a2d30bbc0cb53123;hp=9a1b19555e2fea5ed7badd96be959c79432efbcf;hpb=0aa13feeeb78fc9323bee329c4d91c30f25de121;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c index 9a1b19555e..bf37a93662 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) @@ -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; } } @@ -1885,7 +1884,7 @@ v850_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, /* Set the howto pointer for an V850 ELF reloc. */ -static void +static bfd_boolean v850_elf_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) @@ -1898,16 +1897,18 @@ v850_elf_info_to_howto_rel (bfd *abfd, /* xgettext:c-format */ _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type); - r_type = 0; + 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 +static bfd_boolean v850_elf_info_to_howto_rela (bfd *abfd, - arelent *cache_ptr, + arelent * cache_ptr, Elf_Internal_Rela *dst) { unsigned int r_type; @@ -1918,9 +1919,11 @@ v850_elf_info_to_howto_rela (bfd *abfd, /* xgettext:c-format */ _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type); - r_type = 0; + bfd_set_error (bfd_error_bad_value); + return FALSE; } cache_ptr->howto = &v850_elf_howto_table[r_type]; + return TRUE; } static bfd_boolean @@ -2267,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) @@ -2370,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); @@ -2441,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; @@ -2455,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)); } } @@ -2488,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)); @@ -2670,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); @@ -2716,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; @@ -2748,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. */ @@ -2813,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 - (_("%pB: Architecture mismatch with previous modules"), ibfd); + (_("%pB: architecture mismatch with previous modules"), ibfd); elf_elfheader (obfd)->e_flags |= EF_V800_850E3; } @@ -2869,7 +2872,7 @@ v850_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) } _bfd_error_handler - (_("%pB: Architecture mismatch with previous modules"), ibfd); + (_("%pB: architecture mismatch with previous modules"), ibfd); } return result; @@ -2944,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; @@ -3148,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. */ @@ -3155,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 @@ -3180,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; @@ -3602,9 +3609,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insns"), - abfd, (uint64_t) irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL"); continue; } @@ -3612,10 +3619,11 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insn %#x"), abfd, (uint64_t) (irel->r_offset + no_match), + "R_V850_LONGCALL", insn[no_match]); continue; } @@ -3657,9 +3665,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized reloc"), - abfd, (uint64_t) irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL"); continue; } @@ -3697,9 +3705,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGCALL points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized reloc %#" PRIx64), - abfd, (uint64_t) irel->r_offset, + abfd, (uint64_t) irel->r_offset, "R_V850_LONGCALL", (uint64_t) irelcall->r_offset); continue; } @@ -3834,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 */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insns"), - abfd, (uint64_t) irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGJUMP"); continue; } @@ -3850,10 +3858,11 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized insn %#x"), abfd, (uint64_t) (irel->r_offset + no_match), + "R_V850_LONGJUMP", insn[no_match]); continue; } @@ -3884,9 +3893,9 @@ v850_elf_relax_section (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB: %#" PRIx64 ": warning: R_V850_LONGJUMP points to " + (_("%pB: %#" PRIx64 ": warning: %s points to " "unrecognized reloc"), - abfd, (uint64_t) irel->r_offset); + abfd, (uint64_t) irel->r_offset, "R_V850_LONGJUMP"); continue; } @@ -4245,25 +4254,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