S12Z: Rename reloc R_S12Z_UKNWN_3 to R_S12Z_EXT18 and implement according to recently inferred information about this reloc.

* bfd/elf32-s12z.c: (opru18_reloc): New function.
* bfd/elf32-s12z.c: (elf_s12z_howto_table): Adjust Howto according to new knowledge.
* include/elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.
This commit is contained in:
John Darrington 2018-06-17 07:04:11 +02:00
parent 4895f384b4
commit 4e57b45639
4 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2018-08-23 John Darington <john@darrington.wattle.id.au>
* elf32-s12z.c (opru18_reloc): New function.
* elf32-s12z.c (elf_s12z_howto_table): Adjust Howto according to new knowledge.
2018-08-21 mephi42 <mephi42@gmail.com>
PR binutils/23315

View File

@ -33,6 +33,38 @@ static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
static bfd_boolean s12z_info_to_howto_rel
(bfd *, arelent *, Elf_Internal_Rela *);
static bfd_reloc_status_type
opru18_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol,
void *data, asection *input_section ATTRIBUTE_UNUSED,
bfd *output ATTRIBUTE_UNUSED, char **msg ATTRIBUTE_UNUSED)
{
/* This reloc is used for 18 bit General Operand Addressing Postbyte in the
INST opru18 form. This is an 18 bit reloc, but the most significant bit
is shifted one place to the left of where it would normally be. See
Appendix A.4 of the S12Z reference manual. */
bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
bfd_vma result = bfd_get_24 (abfd, (unsigned char *) data + octets);
bfd_vma val = bfd_asymbol_value (symbol);
/* Keep the wanted bits and discard the rest. */
result &= 0xFA0000;
val += symbol->section->output_section->vma;
val += symbol->section->output_offset;
/* The lowest 17 bits are copied verbatim. */
result |= val & 0x1FFFF;
/* The 18th bit is put into the 19th position. */
result |= (val & 0x020000) << 1;
bfd_put_24 (abfd, result, (unsigned char *) data + octets);
return bfd_reloc_ok;
}
static bfd_reloc_status_type
shift_addend_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
void *data ATTRIBUTE_UNUSED, asection *input_section ATTRIBUTE_UNUSED,
@ -136,19 +168,19 @@ static reloc_howto_type elf_s12z_howto_table[] =
0x00ffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* The purpose of this reloc is not known */
HOWTO (R_S12Z_UKNWN_3, /* type */
/* An 18 bit absolute relocation */
HOWTO (R_S12Z_EXT18, /* type */
0, /* rightshift */
3, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
5, /* size (0 = byte, 1 = short, 2 = long) */
18, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_S12Z_UKNWN_3", /* name */
complain_overflow_bitfield, /* complain_on_overflow */
opru18_reloc, /* special_function */
"R_S12Z_EXT18", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
0x0005ffff, /* src_mask */
0x0005ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A 32 bit absolute relocation */

View File

@ -1,3 +1,7 @@
2018-08-23 John Darrington <john@darrington.wattle.id.au>
* elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.
2018-08-21 Alan Modra <amodra@gmail.com>
* opcode/ppc.h (struct powerpc_operand): Correct "insert" comment.

View File

@ -29,7 +29,7 @@ START_RELOC_NUMBERS (elf_s12z_reloc_type)
RELOC_NUMBER (R_S12Z_UKNWN_2, 2)
RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
RELOC_NUMBER (R_S12Z_EXT24, 4)
RELOC_NUMBER (R_S12Z_UKNWN_3, 5)
RELOC_NUMBER (R_S12Z_EXT18, 5)
RELOC_NUMBER (R_S12Z_EXT32, 6)
END_RELOC_NUMBERS (R_S12Z_max)