Fixing ds in x86 (#5802)

* Fixing ds in x86
* Several updates due to new OP_TYPE
This commit is contained in:
saucec0de 2016-09-22 13:42:06 +02:00 committed by radare
parent 438f151d6c
commit c908e0f818
15 changed files with 145 additions and 23 deletions

View File

@ -268,10 +268,16 @@ R_API char *r_anal_strmask (RAnal *anal, const char *data) {
}
switch (op->type) {
case R_ANAL_OP_TYPE_CALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_CJMP:
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
if (op->nopcode != 0) {
memset (ret + (idx + op->nopcode) * 2,
'.', (oplen - op->nopcode) * 2);
@ -337,6 +343,9 @@ R_API bool r_anal_op_is_eob (RAnalOp *op) {
switch (op->type) {
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_CJMP:
case R_ANAL_OP_TYPE_RET:
case R_ANAL_OP_TYPE_TRAP:

View File

@ -98,6 +98,9 @@ R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb, ut64 addr, ut8 *buf, ut64 len,
bb->type |= R_ANAL_BB_TYPE_BODY;
goto beach;
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
bb->type |= R_ANAL_BB_TYPE_FOOT;
goto beach;
case R_ANAL_OP_TYPE_RET:

View File

@ -874,6 +874,9 @@ repeat:
// For some reason, branch delayed code (MIPS) needs to continue
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_IRCALL:
/* call [dst] */
if (op.ptr != UT64_MAX && r_anal_noreturn_at (anal, op.ptr)) {
FITFCNSZ ();
@ -898,6 +901,9 @@ repeat:
break;
case R_ANAL_OP_TYPE_MJMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
// switch statement
if (anal->opt.jmptbl) {
if (fcn->refs->tail) {

View File

@ -150,6 +150,9 @@ R_API int r_anal_op_execute (RAnal *anal, RAnalOp *op) {
switch (op->type) {
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_CALL:
break;
case R_ANAL_OP_TYPE_ADD:
@ -247,9 +250,15 @@ R_API const char *r_anal_optype_to_string(int t) {
case R_ANAL_OP_TYPE_SWITCH: return "switch";
case R_ANAL_OP_TYPE_TRAP : return "trap";
case R_ANAL_OP_TYPE_UCALL : return "ucall";
case R_ANAL_OP_TYPE_RCALL : return "ucall"; // needs to be changed
case R_ANAL_OP_TYPE_ICALL : return "ucall"; // needs to be changed
case R_ANAL_OP_TYPE_IRCALL: return "ucall"; // needs to be changed
case R_ANAL_OP_TYPE_UCCALL: return "uccall";
case R_ANAL_OP_TYPE_UCJMP : return "ucjmp";
case R_ANAL_OP_TYPE_UJMP : return "ujmp";
case R_ANAL_OP_TYPE_RJMP : return "ujmp"; // needs to be changed
case R_ANAL_OP_TYPE_IJMP : return "ujmp"; // needs to be changed
case R_ANAL_OP_TYPE_IRJMP : return "ujmp"; // needs to be changed
case R_ANAL_OP_TYPE_UNK : return "unk";
case R_ANAL_OP_TYPE_UPUSH : return "upush";
case R_ANAL_OP_TYPE_XCHG : return "xchg";
@ -295,6 +304,9 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
snprintf (ret, sizeof (ret), "goto 0x%"PFMT64x, op->jump);
break;
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
snprintf (ret, sizeof (ret), "goto %s", r0);
break;
case R_ANAL_OP_TYPE_PUSH:
@ -305,6 +317,9 @@ R_API char *r_anal_op_to_string(RAnal *anal, RAnalOp *op) {
snprintf (ret, sizeof (ret), "pop %s", r0);
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_IRCALL:
snprintf (ret, sizeof (ret), "%s()", r0);
break;
case R_ANAL_OP_TYPE_CALL:

View File

@ -332,6 +332,9 @@ static int handle_bb_cf_recursive_descent (RAnal *anal, RAnalState *state) {
break;
case R_ANAL_OP_TYPE_TRAP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_RET:
case R_ANAL_OP_TYPE_ILL:
IFDBG eprintf (" - Handling an ret @ 0x%04"PFMT64x".\n", addr);
@ -444,6 +447,9 @@ static int handle_bb_cf_linear_sweep (RAnal *anal, RAnalState *state) {
break;
case R_ANAL_OP_TYPE_TRAP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_RET:
IFDBG eprintf (" - Handling an ret @ 0x%04"PFMT64x".\n", addr);
state->done = 1;

View File

@ -1978,8 +1978,13 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
op->jump = UT64_MAX;
op->ptr = INSOP (0).mem.disp;
op->disp = INSOP (0).mem.disp;
if (INSOP (0).mem.index == X86_REG_INVALID) {
op->reg = NULL;
op->ireg = NULL;
if (INSOP (0).mem.index == X86_REG_INVALID) {
if (INSOP (0).mem.base != X86_REG_INVALID) {
op->reg = cs_reg_name (*handle, INSOP (0).mem.base);
op->type = R_ANAL_OP_TYPE_IRCALL;
}
} else {
op->ireg = cs_reg_name (*handle, INSOP (0).mem.index);
op->scale = INSOP(0).mem.scale;
@ -1989,6 +1994,11 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
op->refptr = 8;
}
break;
case X86_OP_REG:
op->reg = cs_reg_name (*handle, INSOP (0).reg);
op->type = R_ANAL_OP_TYPE_RCALL;
op->ptr = UT64_MAX;
break;
default:
op->type = R_ANAL_OP_TYPE_UCALL;
op->jump = UT64_MAX;
@ -2008,8 +2018,13 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
op->type = R_ANAL_OP_TYPE_MJMP;
op->ptr = INSOP (0).mem.disp;
op->disp = INSOP (0).mem.disp;
op->reg = NULL;
op->ireg = NULL;
if (INSOP(0).mem.base != X86_REG_INVALID) {
op->type = R_ANAL_OP_TYPE_UJMP;
if (INSOP (0).mem.base != X86_REG_INVALID) {
op->reg = cs_reg_name (*handle, INSOP (0).mem.base);
op->type = R_ANAL_OP_TYPE_IRJMP;
}
}
if (INSOP (0).mem.index == X86_REG_INVALID) {
op->ireg = NULL;
@ -2026,7 +2041,7 @@ static void anop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, csh
case X86_OP_REG:
{
op->reg = cs_reg_name (gop.handle, INSOP(0).reg);
op->type = R_ANAL_OP_TYPE_UJMP;
op->type = R_ANAL_OP_TYPE_RJMP;
op->ptr = UT64_MAX;
}
break;

View File

@ -2201,6 +2201,9 @@ R_API int r_core_anal_search(RCore *core, ut64 from, ut64 to, ut64 ref) {
break;
case R_ANAL_OP_TYPE_UCJMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_MJMP:
if (op.ptr != -1 &&
core_anal_followptr (core, 'c',
@ -2210,6 +2213,9 @@ R_API int r_core_anal_search(RCore *core, ut64 from, ut64 to, ut64 ref) {
}
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UCCALL:
if (op.ptr != -1 &&
core_anal_followptr (core, 'C',
@ -2319,12 +2325,18 @@ R_API int r_core_anal_search_xrefs(RCore *core, ut64 from, ut64 to, int rad) {
xref_to = op.jump;
break;
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_MJMP:
case R_ANAL_OP_TYPE_UCJMP:
type = R_ANAL_REF_TYPE_CODE;
xref_to = op.ptr;
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UCCALL:
type = R_ANAL_REF_TYPE_CALL;
xref_to = op.ptr;
@ -2649,6 +2661,9 @@ R_API RList* r_core_anal_cycles (RCore *core, int ccl) {
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_MJMP:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
ch = R_NEW0 (RAnalCycleHook);
ch->addr = op->addr;
eprintf ("0x%08"PFMT64x" > ?\r", op->addr);
@ -3168,6 +3183,9 @@ R_API void r_core_anal_esil(RCore *core, const char *str, const char *target) {
break;
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_MJMP:
{
ut64 dst = core->anal->esil->jump_target;
@ -3176,7 +3194,8 @@ R_API void r_core_anal_esil(RCore *core, const char *str, const char *target) {
}
if ((target && dst == ntarget) || !target) {
if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) {
RAnalRefType ref = op.type == R_ANAL_OP_TYPE_UCALL
RAnalRefType ref =
op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL
? R_ANAL_REF_TYPE_CALL
: R_ANAL_REF_TYPE_CODE;
r_anal_ref_add (core->anal, dst, cur, ref);

View File

@ -2344,6 +2344,9 @@ static void do_debug_trace_calls (RCore *core, ut64 from, ut64 to, ut64 final_ad
eprintf (" %d %"PFMT64x"\r", n++, addr);
switch (aop.type) {
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
{
ut64 called_addr;
int called_in_range;

View File

@ -1307,6 +1307,9 @@ static int cmd_print_pxA(RCore *core, int len, const char *data) {
break;
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_MJMP:
bgcolor = r_cons_swap_ground (pal->jmp);
bgcolor_in_heap = true;
@ -1322,6 +1325,9 @@ static int cmd_print_pxA(RCore *core, int len, const char *data) {
break;
case R_ANAL_OP_TYPE_CALL:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UCCALL:
bgcolor = r_cons_swap_ground (pal->call);
bgcolor_in_heap = true;

View File

@ -761,8 +761,14 @@ static ut64 findprevopsz(RCore *core, ut64 addr, ut8 *buf) {
case R_ANAL_OP_TYPE_TRAP:
case R_ANAL_OP_TYPE_RET:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_CJMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_CALL:
return UT64_MAX;
@ -779,7 +785,13 @@ static bool is_end_gadget(const RAnalOp* aop, const ut8 crop) {
case R_ANAL_OP_TYPE_TRAP:
case R_ANAL_OP_TYPE_RET:
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_CALL:
return true;

View File

@ -768,7 +768,7 @@ static void ds_show_refs(RDisasmState *ds) {
ut8 buf[12];
r_core_read_at (ds->core, ref->at, buf, 12);
r_anal_op (ds->core->anal, &aop, ref->at, buf, 12);
if (aop.type == R_ANAL_OP_TYPE_UCALL) {
if (aop.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL) {
RAnalFunction * fcn;
fcn = r_anal_get_fcn_at (ds->core->anal, ref->addr, R_ANAL_FCN_TYPE_NULL);
if (fcn) {
@ -2800,6 +2800,9 @@ static void ds_print_esil_anal(RDisasmState *ds) {
}
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_CALL:
{
RAnalFunction *fcn;
@ -2846,6 +2849,9 @@ beach:
case R_ANAL_OP_TYPE_CALL:
case R_ANAL_OP_TYPE_MJMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_CJMP:
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_RET:

View File

@ -129,6 +129,9 @@ ut64 analyzeIterative (RCore *core, Sdb *db, ut64 addr) {
// add call reference
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
/* unknown calls depend on ESIL or DEBUG tracing
* information to know the destination, we can mark
* those 'calls' for later adding tracepoints in
@ -136,6 +139,9 @@ ut64 analyzeIterative (RCore *core, Sdb *db, ut64 addr) {
addUcall (addr+cur);
break;
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_IRJMP:
/* an unknown jump use to go into computed destinations
* outside the current function, but it may result
* on an antidisasm trick */

View File

@ -692,26 +692,29 @@ R_API int r_debug_step_soft(RDebug *dbg) {
next[1] = op.fail;
br = 2;
break;
case R_ANAL_OP_TYPE_MJMP:
if (!op.ireg) {
next[0] = op.jump;
} else {
r = r_debug_reg_get (dbg,op.ireg);
if (dbg->iob.read_at (dbg->iob.io,
r*op.scale + op.disp, (ut8*)&memval, 8) <0 ) {
next[0] = op.addr + op.size;
} else {
next[0] = (dbg->bits == R_SYS_BITS_32) ? memval.r32[0] : memval.r64;
}
}
br = 1;
break;
case R_ANAL_OP_TYPE_CALL:
case R_ANAL_OP_TYPE_JMP:
next[0] = op.jump;
br = 1;
break;
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_RCALL:
r = r_debug_reg_get (dbg,op.reg);
next[0] = r;
br = 1;
break;
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_IRJMP:
r = r_debug_reg_get (dbg,op.reg);
if (dbg->iob.read_at (dbg->iob.io, r, (ut8*)&memval, 8) <0 ) {
next[0] = op.addr + op.size;
} else {
next[0] = (dbg->bits == R_SYS_BITS_32) ? memval.r32[0] : memval.r64;
}
br = 1;
break;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_MJMP:
if (op.ireg) {
r = r_debug_reg_get (dbg,op.ireg);
} else {
@ -725,6 +728,7 @@ R_API int r_debug_step_soft(RDebug *dbg) {
}
br = 1;
break;
case R_ANAL_OP_TYPE_UJMP:
default:
next[0] = op.addr + op.size;
br = 1;
@ -870,10 +874,8 @@ R_API int r_debug_step_over(RDebug *dbg, int steps) {
ins_size = op.fail;
}
// Skip over all the subroutine calls
if (op.type == R_ANAL_OP_TYPE_CALL ||
op.type == R_ANAL_OP_TYPE_CCALL ||
op.type == R_ANAL_OP_TYPE_UCALL ||
op.type == R_ANAL_OP_TYPE_UCCALL) {
if (op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_CALL ||
op.type & R_ANAL_OP_TYPE_MASK == R_ANAL_OP_TYPE_UCALL) {
if (!r_debug_continue_until (dbg, ins_size)) {
eprintf ("Could not step over call @ 0x%"PFMT64x"\n", pc);
return steps_taken;

View File

@ -363,14 +363,22 @@ typedef enum {
//TODO: MOVE TO PREFIX .. it is used by anal_ex.. must be updated
R_ANAL_OP_TYPE_REP = 0x40000000, /* repeats next instruction N times */
R_ANAL_OP_TYPE_MEM = 0x20000000, // TODO must be moved to prefix?
R_ANAL_OP_TYPE_REG = 0x10000000, // operand is a register
R_ANAL_OP_TYPE_IND = 0x08000000, // operand is indirect
R_ANAL_OP_TYPE_NULL = 0,
R_ANAL_OP_TYPE_JMP = 1, /* mandatory jump */
R_ANAL_OP_TYPE_UJMP = 2, /* unknown jump (register or so) */
R_ANAL_OP_TYPE_RJMP = R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UJMP,
R_ANAL_OP_TYPE_IJMP = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_UJMP,
R_ANAL_OP_TYPE_IRJMP = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UJMP,
R_ANAL_OP_TYPE_CJMP = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_JMP, /* conditional jump */
R_ANAL_OP_TYPE_MJMP = R_ANAL_OP_TYPE_MEM | R_ANAL_OP_TYPE_JMP, /* conditional jump */
R_ANAL_OP_TYPE_UCJMP = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_UJMP, /* conditional unknown jump */
R_ANAL_OP_TYPE_CALL = 3, /* call to subroutine (branch+link) */
R_ANAL_OP_TYPE_UCALL = 4, /* unknown call (register or so) */
R_ANAL_OP_TYPE_RCALL = R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UCALL,
R_ANAL_OP_TYPE_ICALL = R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_UCALL,
R_ANAL_OP_TYPE_IRCALL= R_ANAL_OP_TYPE_IND | R_ANAL_OP_TYPE_REG | R_ANAL_OP_TYPE_UCALL,
R_ANAL_OP_TYPE_CCALL = R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_CALL, /* conditional call to subroutine */
R_ANAL_OP_TYPE_UCCALL= R_ANAL_OP_TYPE_COND | R_ANAL_OP_TYPE_UCALL, /* conditional unknown call */
R_ANAL_OP_TYPE_RET = 5, /* returns from subroutine */

View File

@ -1253,6 +1253,9 @@ R_API const char * r_print_color_op_type ( RPrint *p, ut64 anal_type) {
return p->cons->pal.swi;
case R_ANAL_OP_TYPE_JMP:
case R_ANAL_OP_TYPE_UJMP:
case R_ANAL_OP_TYPE_IJMP:
case R_ANAL_OP_TYPE_RJMP:
case R_ANAL_OP_TYPE_IRJMP:
case R_ANAL_OP_TYPE_MJMP:
return p->cons->pal.jmp;
case R_ANAL_OP_TYPE_CJMP:
@ -1263,6 +1266,9 @@ R_API const char * r_print_color_op_type ( RPrint *p, ut64 anal_type) {
case R_ANAL_OP_TYPE_ACMP:
return p->cons->pal.cmp;
case R_ANAL_OP_TYPE_UCALL:
case R_ANAL_OP_TYPE_ICALL:
case R_ANAL_OP_TYPE_RCALL:
case R_ANAL_OP_TYPE_IRCALL:
case R_ANAL_OP_TYPE_UCCALL:
case R_ANAL_OP_TYPE_CALL:
case R_ANAL_OP_TYPE_CCALL: