2008-07-07 Stan Shebs <stan@codesourcery.com>
* dis-init.c (init_disassemble_info): Init endian_code field. * arm-dis.c (print_insn): Disassemble code according to setting of endian_code. (print_insn_big_arm): Detect when BE8 extension flag has been set.
This commit is contained in:
parent
b7292df399
commit
bd2e25575c
3 changed files with 23 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-07-07 Stan Shebs <stan@codesourcery.com>
|
||||||
|
|
||||||
|
* dis-init.c (init_disassemble_info): Init endian_code field.
|
||||||
|
* arm-dis.c (print_insn): Disassemble code according to
|
||||||
|
setting of endian_code.
|
||||||
|
(print_insn_big_arm): Detect when BE8 extension flag has been set.
|
||||||
|
|
||||||
2008-06-30 Richard Sandiford <rdsandiford@googlemail.com>
|
2008-06-30 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
* mips-dis.c (_print_insn_mips): Use bfd_asymbol_flavour to check
|
* mips-dis.c (_print_insn_mips): Use bfd_asymbol_flavour to check
|
||||||
|
|
|
@ -3974,6 +3974,7 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
int status;
|
int status;
|
||||||
int is_thumb = FALSE;
|
int is_thumb = FALSE;
|
||||||
int is_data = FALSE;
|
int is_data = FALSE;
|
||||||
|
int little_code;
|
||||||
unsigned int size = 4;
|
unsigned int size = 4;
|
||||||
void (*printer) (bfd_vma, struct disassemble_info *, long);
|
void (*printer) (bfd_vma, struct disassemble_info *, long);
|
||||||
bfd_boolean found = FALSE;
|
bfd_boolean found = FALSE;
|
||||||
|
@ -3986,6 +3987,10 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
info->disassembler_options = NULL;
|
info->disassembler_options = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Decide if our code is going to be little-endian, despite what the
|
||||||
|
function argument might say. */
|
||||||
|
little_code = ((info->endian_code == BFD_ENDIAN_LITTLE) || little);
|
||||||
|
|
||||||
/* First check the full symtab for a mapping symbol, even if there
|
/* First check the full symtab for a mapping symbol, even if there
|
||||||
are no usable non-mapping symbols for this address. */
|
are no usable non-mapping symbols for this address. */
|
||||||
if (info->symtab != NULL
|
if (info->symtab != NULL
|
||||||
|
@ -4131,7 +4136,7 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
size = 4;
|
size = 4;
|
||||||
|
|
||||||
status = info->read_memory_func (pc, (bfd_byte *)b, 4, info);
|
status = info->read_memory_func (pc, (bfd_byte *)b, 4, info);
|
||||||
if (little)
|
if (little_code)
|
||||||
given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
|
given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
|
||||||
else
|
else
|
||||||
given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
|
given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
|
||||||
|
@ -4147,7 +4152,7 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
size = 2;
|
size = 2;
|
||||||
|
|
||||||
status = info->read_memory_func (pc, (bfd_byte *)b, 2, info);
|
status = info->read_memory_func (pc, (bfd_byte *)b, 2, info);
|
||||||
if (little)
|
if (little_code)
|
||||||
given = (b[0]) | (b[1] << 8);
|
given = (b[0]) | (b[1] << 8);
|
||||||
else
|
else
|
||||||
given = (b[1]) | (b[0] << 8);
|
given = (b[1]) | (b[0] << 8);
|
||||||
|
@ -4161,7 +4166,7 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
|| (given & 0xF800) == 0xE800)
|
|| (given & 0xF800) == 0xE800)
|
||||||
{
|
{
|
||||||
status = info->read_memory_func (pc + 2, (bfd_byte *)b, 2, info);
|
status = info->read_memory_func (pc + 2, (bfd_byte *)b, 2, info);
|
||||||
if (little)
|
if (little_code)
|
||||||
given = (b[0]) | (b[1] << 8) | (given << 16);
|
given = (b[0]) | (b[1] << 8) | (given << 16);
|
||||||
else
|
else
|
||||||
given = (b[1]) | (b[0] << 8) | (given << 16);
|
given = (b[1]) | (b[0] << 8) | (given << 16);
|
||||||
|
@ -4172,7 +4177,7 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifthen_address != pc)
|
if (ifthen_address != pc)
|
||||||
find_ifthen_state(pc, info, little);
|
find_ifthen_state(pc, info, little_code);
|
||||||
|
|
||||||
if (ifthen_state)
|
if (ifthen_state)
|
||||||
{
|
{
|
||||||
|
@ -4210,6 +4215,12 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little)
|
||||||
int
|
int
|
||||||
print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
|
print_insn_big_arm (bfd_vma pc, struct disassemble_info *info)
|
||||||
{
|
{
|
||||||
|
/* Detect BE8-ness and record it in the disassembler info. */
|
||||||
|
if (info->flavour == bfd_target_elf_flavour
|
||||||
|
&& info->section != NULL
|
||||||
|
&& (elf_elfheader (info->section->owner)->e_flags & EF_ARM_BE8))
|
||||||
|
info->endian_code = BFD_ENDIAN_LITTLE;
|
||||||
|
|
||||||
return print_insn (pc, info, FALSE);
|
return print_insn (pc, info, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ init_disassemble_info (struct disassemble_info *info, void *stream,
|
||||||
info->flavour = bfd_target_unknown_flavour;
|
info->flavour = bfd_target_unknown_flavour;
|
||||||
info->arch = bfd_arch_unknown;
|
info->arch = bfd_arch_unknown;
|
||||||
info->endian = BFD_ENDIAN_UNKNOWN;
|
info->endian = BFD_ENDIAN_UNKNOWN;
|
||||||
|
info->endian_code = info->endian;
|
||||||
info->octets_per_byte = 1;
|
info->octets_per_byte = 1;
|
||||||
info->fprintf_func = fprintf_func;
|
info->fprintf_func = fprintf_func;
|
||||||
info->stream = stream;
|
info->stream = stream;
|
||||||
|
|
Loading…
Reference in a new issue