X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf32-mep.c;h=f700dfce90d176a8c901f207bfc7401213290431;hb=9c0ea783421477fccd2ca8e77e91983775be7d55;hp=14a6d226211817b9873415e4d97345381db8c345;hpb=b3adc24a0713411ab38a21dc894dd40dbc5c8f4f;p=binutils-gdb.git diff --git a/bfd/elf32-mep.c b/bfd/elf32-mep.c index 14a6d226211..f700dfce90d 100644 --- a/bfd/elf32-mep.c +++ b/bfd/elf32-mep.c @@ -1,5 +1,5 @@ /* MeP-specific support for 32-bit ELF. - Copyright (C) 2001-2020 Free Software Foundation, Inc. + Copyright (C) 2001-2022 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -30,7 +30,7 @@ /* Private relocation functions. */ #define MEPREL(type, size, bits, right, left, pcrel, overflow, mask) \ - HOWTO (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 @@ -39,30 +39,30 @@ 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_MEP_NONE, 0, 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), - 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_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_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_8, 1, 8, 0, 0, 0, U, 0xff), + MEPREL (R_MEP_16, 2, 16, 0, 0, 0, U, 0xffff), + MEPREL (R_MEP_32, 4, 32, 0, 0, 0, U, 0xffffffff), + MEPREL (R_MEP_PCREL8A2, 2, 8, 1, 1, 1, S, 0x00fe), + MEPREL (R_MEP_PCREL12A2,2, 12, 1, 1, 1, S, 0x0ffe), + MEPREL (R_MEP_PCREL17A2,4, 17, 0, 1, 1, S, 0x0000ffff), + MEPREL (R_MEP_PCREL24A2,4, 24, 0, 1, 1, S, 0x07f0ffff), + MEPREL (R_MEP_PCABS24A2,4, 24, 0, 1, 0, U, 0x07f0ffff), + MEPREL (R_MEP_LOW16, 4, 16, 0, 0, 0, N, 0x0000ffff), + MEPREL (R_MEP_HI16U, 4, 32, 0,16, 0, N, 0x0000ffff), + MEPREL (R_MEP_HI16S, 4, 32, 0,16, 0, N, 0x0000ffff), + MEPREL (R_MEP_GPREL, 4, 16, 0, 0, 0, S, 0x0000ffff), + MEPREL (R_MEP_TPREL, 4, 16, 0, 0, 0, S, 0x0000ffff), + MEPREL (R_MEP_TPREL7, 2, 7, 0, 0, 0, U, 0x007f), + MEPREL (R_MEP_TPREL7A2, 2, 7, 1, 1, 0, U, 0x007e), + MEPREL (R_MEP_TPREL7A4, 2, 7, 2, 2, 0, U, 0x007c), + MEPREL (R_MEP_UIMM24, 4, 24, 0, 0, 0, U, 0x00ffffff), + MEPREL (R_MEP_ADDR24A4, 4, 24, 0, 2, 0, U, 0x00fcffff), + MEPREL (R_MEP_GNU_VTINHERIT,2, 0,16,32, 0, N, 0x0000), + MEPREL (R_MEP_GNU_VTENTRY,2, 0,16,32, 0, N, 0x0000), /* MEPRELOC:END */ }; @@ -185,7 +185,7 @@ mep_lookup_global 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; @@ -221,7 +221,6 @@ mep_final_link_relocate bfd_vma relocation) { unsigned long u; - long s; unsigned char *byte; bfd_vma pc; bfd_reloc_status_type r = bfd_reloc_ok; @@ -242,12 +241,12 @@ mep_final_link_relocate + 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. @@ -257,9 +256,7 @@ mep_final_link_relocate } if (howto->pc_relative) - s -= pc; - - u = (unsigned long) s; + u -= pc; switch (howto->type) { @@ -281,25 +278,25 @@ mep_final_link_relocate 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; @@ -317,22 +314,21 @@ mep_final_link_relocate 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); @@ -375,7 +371,7 @@ mep_final_link_relocate /* 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) @@ -389,10 +385,10 @@ mep_info_to_howto_rela (bfd * abfd, _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; } /* Relocate a MEP ELF section. @@ -428,7 +424,7 @@ mep_info_to_howto_rela (bfd * abfd, 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, @@ -481,7 +477,7 @@ mep_elf_relocate_section } 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, @@ -519,7 +515,7 @@ mep_elf_relocate_section 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: @@ -547,31 +543,31 @@ mep_elf_relocate_section 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; } /* 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; @@ -581,7 +577,7 @@ mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) /* 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; @@ -594,7 +590,7 @@ mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) /* 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) @@ -622,7 +618,7 @@ mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) _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 @@ -641,13 +637,13 @@ mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) _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. */ @@ -664,7 +660,7 @@ static const char * core_names[] = "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; @@ -688,7 +684,7 @@ mep_elf_print_private_bfd_data (bfd * abfd, void * ptr) fputc ('\n', file); - return TRUE; + return true; } /* Return the machine subcode from the ELF e_flags header. */ @@ -709,29 +705,29 @@ elf32_mep_machine (bfd * abfd) 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; }