/* MeP-specific support for 32-bit ELF.
- Copyright (C) 2001-2018 Free Software Foundation, Inc.
+ Copyright (C) 2001-2021 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
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),
- MEPREL (R_MEP_16, 1, 16, 0, 0, 0, U, 0xffff),
- MEPREL (R_MEP_32, 2, 32, 0, 0, 0, U, 0xffffffff),
+ MEPREL (R_MEP_8, 0, 8, 0, 0, 0, U, 0xff),
+ MEPREL (R_MEP_16, 1, 16, 0, 0, 0, U, 0xffff),
+ MEPREL (R_MEP_32, 2, 32, 0, 0, 0, U, 0xffffffff),
MEPREL (R_MEP_PCREL8A2, 1, 8, 1, 1, 1, S, 0x00fe),
MEPREL (R_MEP_PCREL12A2,1, 12, 1, 1, 1, S, 0x0ffe),
MEPREL (R_MEP_PCREL17A2,2, 17, 0, 1, 1, S, 0x0000ffff),
MEPREL (R_MEP_PCREL24A2,2, 24, 0, 1, 1, S, 0x07f0ffff),
MEPREL (R_MEP_PCABS24A2,2, 24, 0, 1, 0, U, 0x07f0ffff),
- MEPREL (R_MEP_LOW16, 2, 16, 0, 0, 0, N, 0x0000ffff),
- MEPREL (R_MEP_HI16U, 2, 32, 0,16, 0, N, 0x0000ffff),
- MEPREL (R_MEP_HI16S, 2, 32, 0,16, 0, N, 0x0000ffff),
- MEPREL (R_MEP_GPREL, 2, 16, 0, 0, 0, S, 0x0000ffff),
- MEPREL (R_MEP_TPREL, 2, 16, 0, 0, 0, S, 0x0000ffff),
- MEPREL (R_MEP_TPREL7, 1, 7, 0, 0, 0, U, 0x007f),
+ MEPREL (R_MEP_LOW16, 2, 16, 0, 0, 0, N, 0x0000ffff),
+ MEPREL (R_MEP_HI16U, 2, 32, 0,16, 0, N, 0x0000ffff),
+ MEPREL (R_MEP_HI16S, 2, 32, 0,16, 0, N, 0x0000ffff),
+ MEPREL (R_MEP_GPREL, 2, 16, 0, 0, 0, S, 0x0000ffff),
+ MEPREL (R_MEP_TPREL, 2, 16, 0, 0, 0, S, 0x0000ffff),
+ MEPREL (R_MEP_TPREL7, 1, 7, 0, 0, 0, U, 0x007f),
MEPREL (R_MEP_TPREL7A2, 1, 7, 1, 1, 0, U, 0x007e),
MEPREL (R_MEP_TPREL7A4, 1, 7, 2, 2, 0, U, 0x007c),
- MEPREL (R_MEP_UIMM24, 2, 24, 0, 0, 0, U, 0x00ffffff),
+ MEPREL (R_MEP_UIMM24, 2, 24, 0, 0, 0, U, 0x00ffffff),
MEPREL (R_MEP_ADDR24A4, 2, 24, 0, 2, 0, U, 0x00fcffff),
MEPREL (R_MEP_GNU_VTINHERIT,1, 0,16,32, 0, N, 0x0000),
- MEPREL (R_MEP_GNU_VTENTRY,1, 0,16,32, 0, N, 0x0000),
+ MEPREL (R_MEP_GNU_VTENTRY,1, 0,16,32, 0, N, 0x0000),
/* MEPRELOC:END */
};
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;
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 bfd_boolean
+static bool
mep_info_to_howto_rela (bfd * abfd,
arelent * cache_ptr,
Elf_Internal_Rela * dst)
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
abfd, r_type);
bfd_set_error (bfd_error_bad_value);
- return FALSE;
+ return false;
}
cache_ptr->howto = & mep_elf_howto_table [r_type];
- return TRUE;
+ 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,
struct bfd_link_info * 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;
/* 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)
_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
_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
+static bool
mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED,
Elf_Internal_Shdr * hdr,
asection * sec)
{
if (sec->flags & SEC_MEP_VLIW)
hdr->sh_flags |= SHF_MEP_VLIW;
- return TRUE;
+ return true;
}
\f