mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-29 02:20:51 +00:00
[binutils, ARM, 8/16] BFL infrastructure with new global reloc R_ARM_THM_BF18
This patch is part of a series of patches to add support for Armv8.1-M Mainline instructions to binutils. This adds infrastructure for the BFL instructions which is one of the first instructions in Arm that have more than one relocations in them. This adds a new relocation R_ARM_THM_BF18. The inconsistency between external R_ARM_THM_BF18 and internal BFD_RELOC_ARM_THUMB_BF19 is because internally we count the static bit-0 of the immediate and we don't externally. ChangeLog entries are as follows : *** bfd/ChangeLog *** 2019-04-15 Sudakshina Das <sudi.das@arm.com> * reloc.c (BFD_RELOC_ARM_THUMB_BF19): New * libbfd.h: Regenerated. * bfd-in2.h: Regenerated. * bfd-elf32-arm.c (elf32_arm_howto_table_1): New entry for R_ARM_THM_BF18. (elf32_arm_reloc_map elf32_arm_reloc_map): Map BFD_RELOC_ARM_THUMB_BF19 and R_ARM_THM_BF18 together. (elf32_arm_final_link_relocate): New switch case for R_ARM_THM_BF19. *** elfcpp/ChangeLog *** 2019-04-15 Sudakshina Das <sudi.das@arm.com> * arm.h (R_ARM_THM_BF18): New relocation code. *** gas/ChangeLog *** 2019-04-15 Sudakshina Das <sudi.das@arm.com> * config/tc-arm.c (md_pcrel_from_section): New switch case for BFD_RELOC_ARM_THUMB_BF19. (md_appdy_fix): Likewise. (tc_gen_reloc): Likewise. *** include/ChangeLog *** 2019-04-15 Sudakshina Das <sudi.das@arm.com> * elf/arm.h (START_RELOC_NUMBERS): New entry for R_ARM_THM_BF18. *** opcodes/ChangeLog *** 2019-04-15 Sudakshina Das <sudi.das@arm.com> * arm-dis.c (print_insn_thumb32): Updated to accept new %Y pattern.
This commit is contained in:
@@ -2715,6 +2715,7 @@ static const struct opcode16 thumb_opcodes[] =
|
||||
%F print the lsb and width fields of a sbfx/ubfx instruction
|
||||
%G print a fallback offset for Branch Future instructions
|
||||
%W print an offset for BF instruction
|
||||
%Y print an offset for BFL instruction
|
||||
%b print a conditional branch offset
|
||||
%B print an unconditional branch offset
|
||||
%s print the shift field of an SSAT instruction
|
||||
@@ -5898,6 +5899,23 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
{
|
||||
unsigned int immA = (given & 0x007f0000u) >> 16;
|
||||
unsigned int immB = (given & 0x000007feu) >> 1;
|
||||
unsigned int immC = (given & 0x00000800u) >> 11;
|
||||
bfd_vma offset = 0;
|
||||
|
||||
offset |= immA << 12;
|
||||
offset |= immB << 2;
|
||||
offset |= immC << 1;
|
||||
/* Sign extend. */
|
||||
offset = (offset & 0x40000) ? offset - (1 << 19) : offset;
|
||||
|
||||
info->print_address_func (pc + 4 + offset, info);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
{
|
||||
unsigned int S = (given & 0x04000000u) >> 26;
|
||||
|
||||
Reference in New Issue
Block a user