From e80512c8d89479cd53ead264e521f5fa4b714932 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Mon, 2 Jan 2023 22:56:28 -0800 Subject: 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. --- opcodes/xtensa-dis.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'opcodes') diff --git a/opcodes/xtensa-dis.c b/opcodes/xtensa-dis.c index 3631f7f..8017ec2 100644 --- a/opcodes/xtensa-dis.c +++ b/opcodes/xtensa-dis.c @@ -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, " }"); -- cgit v1.1