opcodes: xtensa: fix jump visualization for FLIX
opcodes/ * xtensa-dis.c (print_insn_xtensa): Add local variables insn_type, target and imm_pcrel to track control flow across multiple slots.
This commit is contained in:
+20
-3
@@ -283,6 +283,8 @@ print_insn_xtensa (bfd_vma memaddr, struct disassemble_info *info)
|
||||
static xtensa_insnbuf slot_buffer = NULL;
|
||||
int first, first_slot, valid_insn;
|
||||
property_table_entry *insn_block;
|
||||
enum dis_insn_type insn_type;
|
||||
bfd_vma target;
|
||||
|
||||
if (!xtensa_default_isa)
|
||||
xtensa_default_isa = xtensa_isa_init (0, 0);
|
||||
@@ -422,12 +424,13 @@ print_insn_xtensa (bfd_vma memaddr, struct disassemble_info *info)
|
||||
if (nslots > 1)
|
||||
(*info->fprintf_func) (info->stream, "{ ");
|
||||
|
||||
info->insn_type = dis_nonbranch;
|
||||
info->insn_info_valid = 1;
|
||||
|
||||
insn_type = dis_nonbranch;
|
||||
target = 0;
|
||||
first_slot = 1;
|
||||
for (n = 0; n < nslots; n++)
|
||||
{
|
||||
int imm_pcrel = 0;
|
||||
|
||||
if (first_slot)
|
||||
first_slot = 0;
|
||||
else
|
||||
@@ -445,6 +448,8 @@ print_insn_xtensa (bfd_vma memaddr, struct disassemble_info *info)
|
||||
info->insn_type = dis_branch;
|
||||
else if (xtensa_opcode_is_call (isa, opc))
|
||||
info->insn_type = dis_jsr;
|
||||
else
|
||||
info->insn_type = dis_nonbranch;
|
||||
|
||||
/* Print the operands (if any). */
|
||||
noperands = xtensa_opcode_num_operands (isa, opc);
|
||||
@@ -464,8 +469,20 @@ print_insn_xtensa (bfd_vma memaddr, struct disassemble_info *info)
|
||||
slot_buffer, &operand_val);
|
||||
|
||||
print_xtensa_operand (memaddr, info, opc, i, operand_val);
|
||||
if (xtensa_operand_is_PCrelative (isa, opc, i))
|
||||
++imm_pcrel;
|
||||
}
|
||||
if (!imm_pcrel)
|
||||
info->insn_type = dis_nonbranch;
|
||||
if (info->insn_type != dis_nonbranch)
|
||||
{
|
||||
insn_type = info->insn_type;
|
||||
target = info->target;
|
||||
}
|
||||
}
|
||||
info->insn_type = insn_type;
|
||||
info->target = target;
|
||||
info->insn_info_valid = 1;
|
||||
|
||||
if (nslots > 1)
|
||||
(*info->fprintf_func) (info->stream, " }");
|
||||
|
||||
Reference in New Issue
Block a user