/* V850-specific support for 32-bit ELF
- Copyright (C) 1996-2018 Free Software Foundation, Inc.
+ Copyright (C) 1996-2019 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
#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)
/* 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;
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;
\f
/* 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)
/* 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;
/* 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;
}
\f
static bfd_boolean
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)
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);
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;
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));
}
}
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));
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);
/* 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;
default:
break;
}
+ return _bfd_elf_final_write_processing (abfd);
}
/* Function to keep V850 specific file flags. */
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;
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)))
+ if (!bfd_set_section_flags (hdr->bfd_section,
+ (bfd_section_flags (hdr->bfd_section)
+ | SEC_IS_COMMON)))
return FALSE;
}
{
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;
/* 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;
}
\f
#undef TARGET_LITTLE_SYM