/* MeP-specific support for 32-bit ELF.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
+ Copyright (C) 2001-2022 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
/* Private relocation functions. */
\f
#define MEPREL(type, size, bits, right, left, pcrel, overflow, mask) \
- {(unsigned)type, right, size, bits, pcrel, left, overflow, bfd_elf_generic_reloc, #type, FALSE, 0, mask, 0 }
+ HOWTO (type, right, size, bits, pcrel, left, overflow, bfd_elf_generic_reloc, #type, false, 0, mask, 0)
#define N complain_overflow_dont
#define S complain_overflow_signed
static reloc_howto_type mep_elf_howto_table [] =
{
/* type, size, bits, leftshift, rightshift, pcrel, OD/OS/OU, mask. */
- MEPREL (R_MEP_NONE, 3, 0, 0, 0, 0, N, 0),
- MEPREL (R_RELC, 0, 0, 0, 0, 0, N, 0),
+ MEPREL (R_MEP_NONE, 3, 0, 0, 0, 0, N, 0),
+ MEPREL (R_RELC, 0, 0, 0, 0, 0, N, 0),
/* MEPRELOC:HOWTO */
/* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */
MEPREL (R_MEP_8, 0, 8, 0, 0, 0, U, 0xff),
if (*cache || *warn)
return *cache;
- h = bfd_link_hash_lookup (mep_info->hash, name, FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (mep_info->hash, name, false, false, true);
if (h == 0 || h->type != bfd_link_hash_defined)
{
*warn = ofs + 1;
static bfd_reloc_status_type
mep_final_link_relocate
- (reloc_howto_type * howto,
- bfd * input_bfd,
- asection * input_section,
- bfd_byte * contents,
+ (reloc_howto_type * howto,
+ bfd * input_bfd,
+ asection * input_section,
+ bfd_byte * contents,
Elf_Internal_Rela * rel,
- bfd_vma relocation)
+ bfd_vma relocation)
{
unsigned long u;
- long s;
unsigned char *byte;
bfd_vma pc;
bfd_reloc_status_type r = bfd_reloc_ok;
+ input_section->output_offset
+ rel->r_offset);
- s = relocation + rel->r_addend;
+ u = relocation + rel->r_addend;
byte = (unsigned char *)contents + rel->r_offset;
if (howto->type == R_MEP_PCREL24A2
- && s == 0
+ && u == 0
&& pc >= 0x800000)
{
/* This is an unreachable branch to an undefined weak function.
}
if (howto->pc_relative)
- s -= pc;
-
- u = (unsigned long) s;
+ u -= pc;
switch (howto->type)
{
byte[3^e4] = (u & 0xff);
break;
case R_MEP_PCREL8A2: /* --------7654321- */
- if (-128 > s || s > 127) r = bfd_reloc_overflow;
- byte[1^e2] = (byte[1^e2] & 0x01) | (s & 0xfe);
+ if (u + 128 > 255) r = bfd_reloc_overflow;
+ byte[1^e2] = (byte[1^e2] & 0x01) | (u & 0xfe);
break;
case R_MEP_PCREL12A2: /* ----ba987654321- */
- if (-2048 > s || s > 2047) r = bfd_reloc_overflow;
- byte[0^e2] = (byte[0^e2] & 0xf0) | ((s >> 8) & 0x0f);
- byte[1^e2] = (byte[1^e2] & 0x01) | (s & 0xfe);
+ if (u + 2048 > 4095) r = bfd_reloc_overflow;
+ byte[0^e2] = (byte[0^e2] & 0xf0) | ((u >> 8) & 0x0f);
+ byte[1^e2] = (byte[1^e2] & 0x01) | (u & 0xfe);
break;
case R_MEP_PCREL17A2: /* ----------------gfedcba987654321 */
- if (-65536 > s || s > 65535) r = bfd_reloc_overflow;
- byte[2^e2] = ((s >> 9) & 0xff);
- byte[3^e2] = ((s >> 1) & 0xff);
+ if (u + 65536 > 131071) r = bfd_reloc_overflow;
+ byte[2^e2] = ((u >> 9) & 0xff);
+ byte[3^e2] = ((u >> 1) & 0xff);
break;
case R_MEP_PCREL24A2: /* -----7654321----nmlkjihgfedcba98 */
- if (-8388608 > s || s > 8388607) r = bfd_reloc_overflow;
- byte[0^e2] = (byte[0^e2] & 0xf8) | ((s >> 5) & 0x07);
- byte[1^e2] = (byte[1^e2] & 0x0f) | ((s << 3) & 0xf0);
- byte[2^e2] = ((s >> 16) & 0xff);
- byte[3^e2] = ((s >> 8) & 0xff);
+ if (u + 8388608 > 16777215) r = bfd_reloc_overflow;
+ byte[0^e2] = (byte[0^e2] & 0xf8) | ((u >> 5) & 0x07);
+ byte[1^e2] = (byte[1^e2] & 0x0f) | ((u << 3) & 0xf0);
+ byte[2^e2] = ((u >> 16) & 0xff);
+ byte[3^e2] = ((u >> 8) & 0xff);
break;
case R_MEP_PCABS24A2: /* -----7654321----nmlkjihgfedcba98 */
if (u > 16777215) r = bfd_reloc_overflow;
byte[3^e2] = ((u >> 16) & 0xff);
break;
case R_MEP_HI16S: /* ----------------vutsrqponmlkjihg */
- if (s & 0x8000)
- s += 0x10000;
- byte[2^e2] = ((s >> 24) & 0xff);
- byte[3^e2] = ((s >> 16) & 0xff);
+ u += 0x8000;
+ byte[2^e2] = ((u >> 24) & 0xff);
+ byte[3^e2] = ((u >> 16) & 0xff);
break;
case R_MEP_GPREL: /* ----------------fedcba9876543210 */
- s -= mep_sdaoff_base(rel->r_offset);
- if (-32768 > s || s > 32767) r = bfd_reloc_overflow;
- byte[2^e2] = ((s >> 8) & 0xff);
- byte[3^e2] = (s & 0xff);
+ u -= mep_sdaoff_base(rel->r_offset);
+ if (u + 32768 > 65535) r = bfd_reloc_overflow;
+ byte[2^e2] = ((u >> 8) & 0xff);
+ byte[3^e2] = (u & 0xff);
break;
case R_MEP_TPREL: /* ----------------fedcba9876543210 */
- s -= mep_tpoff_base(rel->r_offset);
- if (-32768 > s || s > 32767) r = bfd_reloc_overflow;
- byte[2^e2] = ((s >> 8) & 0xff);
- byte[3^e2] = (s & 0xff);
+ u -= mep_tpoff_base(rel->r_offset);
+ if (u + 32768 > 65535) r = bfd_reloc_overflow;
+ byte[2^e2] = ((u >> 8) & 0xff);
+ byte[3^e2] = (u & 0xff);
break;
case R_MEP_TPREL7: /* ---------6543210 */
u -= mep_tpoff_base(rel->r_offset);
\f
/* Set the howto pointer for a MEP ELF reloc. */
-static void
-mep_info_to_howto_rela
- (bfd * abfd ATTRIBUTE_UNUSED,
- arelent * cache_ptr,
- Elf_Internal_Rela * dst)
+static bool
+mep_info_to_howto_rela (bfd * abfd,
+ arelent * cache_ptr,
+ Elf_Internal_Rela * dst)
{
unsigned int r_type;
if (r_type >= R_MEP_max)
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B: invalid MEP 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 = & mep_elf_howto_table [r_type];
+ return true;
}
\f
/* Relocate a MEP ELF section.
section, which means that the addend must be adjusted
accordingly. */
-static bfd_boolean
+static int
mep_elf_relocate_section
- (bfd * output_bfd ATTRIBUTE_UNUSED,
+ (bfd * output_bfd ATTRIBUTE_UNUSED,
struct bfd_link_info * info,
- bfd * input_bfd,
- asection * input_section,
- bfd_byte * contents,
+ bfd * input_bfd,
+ asection * input_section,
+ bfd_byte * contents,
Elf_Internal_Rela * relocs,
- Elf_Internal_Sym * local_syms,
- asection ** local_sections)
+ Elf_Internal_Sym * local_syms,
+ asection ** local_sections)
{
- Elf_Internal_Shdr * symtab_hdr;
+ Elf_Internal_Shdr * symtab_hdr;
struct elf_link_hash_entry ** sym_hashes;
- Elf_Internal_Rela * rel;
- Elf_Internal_Rela * relend;
+ Elf_Internal_Rela * rel;
+ Elf_Internal_Rela * relend;
symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (input_bfd);
for (rel = relocs; rel < relend; rel ++)
{
- reloc_howto_type * howto;
- unsigned long r_symndx;
- Elf_Internal_Sym * sym;
- asection * sec;
+ reloc_howto_type * howto;
+ unsigned long r_symndx;
+ Elf_Internal_Sym * sym;
+ asection * sec;
struct elf_link_hash_entry * h;
- bfd_vma relocation;
- bfd_reloc_status_type r;
- const char * name = NULL;
- int r_type;
+ bfd_vma relocation;
+ bfd_reloc_status_type r;
+ const char * name = NULL;
+ int r_type;
r_type = ELF32_R_TYPE (rel->r_info);
r_symndx = ELF32_R_SYM (rel->r_info);
name = bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name);
- name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+ name = name == NULL ? bfd_section_name (sec) : name;
}
else
{
- bfd_boolean warned, unresolved_reloc, ignored;
+ bool warned, unresolved_reloc, ignored;
RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
case bfd_reloc_undefined:
(*info->callbacks->undefined_symbol)
- (info, name, input_bfd, input_section, rel->r_offset, TRUE);
+ (info, name, input_bfd, input_section, rel->r_offset, true);
break;
case bfd_reloc_outofrange:
if (warn_tp)
info->callbacks->undefined_symbol
- (info, "__tpbase", input_bfd, input_section, warn_tp-1, TRUE);
+ (info, "__tpbase", input_bfd, input_section, warn_tp-1, true);
if (warn_sda)
info->callbacks->undefined_symbol
- (info, "__sdabase", input_bfd, input_section, warn_sda-1, TRUE);
+ (info, "__sdabase", input_bfd, input_section, warn_sda-1, true);
if (warn_sda || warn_tp)
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
\f
/* Function to set the ELF flag bits. */
-static bfd_boolean
+static bool
mep_elf_set_private_flags (bfd * abfd,
flagword flags)
{
elf_elfheader (abfd)->e_flags = flags;
- elf_flags_init (abfd) = TRUE;
- return TRUE;
+ elf_flags_init (abfd) = true;
+ return true;
}
/* Merge backend specific data from an object file to the output
object file when linking. */
-static bfd_boolean
+static bool
mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
{
bfd *obfd = info->output_bfd;
/* Check if we have the same endianness. */
if (!_bfd_generic_verify_endian_match (ibfd, info))
- return FALSE;
+ return false;
new_flags = elf_elfheader (ibfd)->e_flags;
old_flags = elf_elfheader (obfd)->e_flags;
#ifdef DEBUG
- _bfd_error_handler ("%B: old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s",
+ _bfd_error_handler ("%pB: old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s",
ibfd, old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no");
#endif
/* First call, no flags set. */
if (!elf_flags_init (obfd))
{
- elf_flags_init (obfd) = TRUE;
+ elf_flags_init (obfd) = true;
old_flags = new_flags;
}
else if ((new_flags | old_flags) & EF_MEP_LIBRARY)
else
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B and %B are for different cores"),
+ _bfd_error_handler (_("%pB and %pB are for different cores"),
last_ibfd, ibfd);
bfd_set_error (bfd_error_invalid_target);
- return FALSE;
+ return false;
}
/* Make sure they're for the same me_module. Allow basic config to
else
{
/* xgettext:c-format */
- _bfd_error_handler (_("%B and %B are for different configurations"),
+ _bfd_error_handler (_("%pB and %pB are for different configurations"),
last_ibfd, ibfd);
bfd_set_error (bfd_error_invalid_target);
- return FALSE;
+ return false;
}
}
elf_elfheader (obfd)->e_flags = old_flags;
last_ibfd = ibfd;
- return TRUE;
+ return true;
}
/* This will be edited by the MeP configration tool. */
"MeP", "MeP-c2", "MeP-c3", "MeP-h1"
};
-static bfd_boolean
+static bool
mep_elf_print_private_bfd_data (bfd * abfd, void * ptr)
{
FILE * file = (FILE *) ptr;
fputc ('\n', file);
- return TRUE;
+ return true;
}
/* Return the machine subcode from the ELF e_flags header. */
return bfd_mach_mep;
}
-static bfd_boolean
+static bool
mep_elf_object_p (bfd * abfd)
{
bfd_default_set_arch_mach (abfd, bfd_arch_mep, elf32_mep_machine (abfd));
- return TRUE;
+ return true;
}
-static bfd_boolean
-mep_elf_section_flags (flagword * flags, const Elf_Internal_Shdr * hdr)
+static bool
+mep_elf_section_flags (const Elf_Internal_Shdr *hdr)
{
if (hdr->sh_flags & SHF_MEP_VLIW)
- * flags |= SEC_MEP_VLIW;
- return TRUE;
+ hdr->bfd_section->flags |= SEC_MEP_VLIW;
+ return true;
}
-static bfd_boolean
-mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED,
+static bool
+mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED,
Elf_Internal_Shdr * hdr,
- asection * sec)
+ asection * sec)
{
if (sec->flags & SEC_MEP_VLIW)
hdr->sh_flags |= SHF_MEP_VLIW;
- return TRUE;
+ return true;
}
\f
#define elf_info_to_howto_rel NULL
#define elf_info_to_howto mep_info_to_howto_rela
#define elf_backend_relocate_section mep_elf_relocate_section
-#define elf_backend_object_p mep_elf_object_p
+#define elf_backend_object_p mep_elf_object_p
#define elf_backend_section_flags mep_elf_section_flags
#define elf_backend_fake_sections mep_elf_fake_sections