diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2023-01-02 22:56:28 -0800 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2023-01-03 13:30:57 -0800 |
commit | e80512c8d89479cd53ead264e521f5fa4b714932 (patch) | |
tree | 880bd9a64a48ca9924b0f07dfdb21c218c5fbd98 /opcodes | |
parent | 39086586b7111c3f8480e763ad205b7f4de65ffe (diff) | |
download | gdb-e80512c8d89479cd53ead264e521f5fa4b714932.zip gdb-e80512c8d89479cd53ead264e521f5fa4b714932.tar.gz gdb-e80512c8d89479cd53ead264e521f5fa4b714932.tar.bz2 |
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.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/xtensa-dis.c | 23 |
1 files changed, 20 insertions, 3 deletions
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, " }"); |