Fix analysis: remove early return, add eob for branches
The decoder had an early return when mask lacked DISASM, causing op->type/jump/eob to never be set during analysis passes. Removed the early return so all decode paths execute regardless of requested mask. Added op->eob = true for: - Unconditional JUMP (Type 10a, 36) - Unconditional indirect JUMP (Type 19) - RTS/RTI (Type 20) Added op->fail for: - Conditional JUMP (Type 10) - Conditional indirect jump (Type 19) This fixes function analysis (af), basic block detection (afb), and control flow graphing (agf/VV). Tested: isa_test.bin now shows 5 basic blocks with correct control flow edges.
This commit is contained in:
@@ -74,7 +74,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask)
|
||||
ins2 = ((ut32) b[3] << 16) | ((ut32) b[4] << 8) | (ut32) b[5];
|
||||
op->size = 3;
|
||||
op->type = R_ANAL_OP_TYPE_UNK;
|
||||
if (!(mask & R_ARCH_OP_MASK_DISASM)) return true;
|
||||
(void) mask; /* decode always runs full; r2 frees mnemonic */
|
||||
|
||||
/* Priority check: High bits */
|
||||
ut32 b23_22 = (ins >> 22) & 0x3;
|
||||
@@ -352,6 +352,8 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask)
|
||||
op->type = s_bit ? R_ANAL_OP_TYPE_CALL
|
||||
: R_ANAL_OP_TYPE_JMP;
|
||||
op->jump = addr;
|
||||
if (!s_bit)
|
||||
op->eob = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -416,6 +418,8 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask)
|
||||
op->type = s_bit ? R_ANAL_OP_TYPE_CALL
|
||||
: R_ANAL_OP_TYPE_JMP;
|
||||
op->jump = target;
|
||||
if (!s_bit)
|
||||
op->eob = true;
|
||||
return true;
|
||||
}
|
||||
/* Type 10: bits 23-19 = 00011, bit18 = 0 (conditional 13-bit rel) */
|
||||
@@ -466,6 +470,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask)
|
||||
cond_str[cond], ret,
|
||||
b_bit ? " (DB)" : "");
|
||||
op->type = R_ANAL_OP_TYPE_RET;
|
||||
op->eob = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -629,6 +634,10 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask)
|
||||
b_bit ? " (DB)" : "");
|
||||
op->type = s_bit ? R_ANAL_OP_TYPE_CALL
|
||||
: R_ANAL_OP_TYPE_JMP;
|
||||
if (!s_bit && cond == 15)
|
||||
op->eob = true;
|
||||
if (cond != 15)
|
||||
op->fail = op->addr + 3;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user