semantics: add insn group JUMP, so now we can check if this insn is branching

This commit is contained in:
Nguyen Anh Quynh 2013-12-02 13:55:38 +08:00
parent 7c7a8bc523
commit ec0ed8ee94
9 changed files with 63 additions and 0 deletions

View File

@ -1884,6 +1884,17 @@ void AArch64_get_insn_id(cs_insn *insn, unsigned int id)
// call cs_reg_write() with handle = 1 to pass handle check
// we only need to find if this insn modifies ARM64_REG_NZCV
insn->arm64.update_flags = cs_reg_write(1, insn, ARM64_REG_NZCV);
if (insns[i].branch || insns[i].indirect_branch) {
// this insn also belongs to JUMP group
int j;
for (j = 0; j < ARR_SIZE(insns[i].groups); j++) {
if (insn->groups[j] == 0) {
insn->groups[j] = ARM64_GRP_JUMP;
break;
}
}
}
}
}

View File

@ -2306,6 +2306,17 @@ void ARM_get_insn_id(cs_insn *insn, unsigned int id)
memcpy(insn->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
memcpy(insn->groups, insns[i].groups, sizeof(insns[i].groups));
insn->arm.update_flags = cs_reg_write(1, insn, ARM_REG_CPSR);
if (insns[i].branch || insns[i].indirect_branch) {
// this insn also belongs to JUMP group
int j;
for (j = 0; j < ARR_SIZE(insns[i].groups); j++) {
if (insn->groups[j] == 0) {
insn->groups[j] = ARM_GRP_JUMP;
break;
}
}
}
}
}

View File

@ -1390,6 +1390,17 @@ void Mips_get_insn_id(cs_insn *insn, unsigned int id)
memcpy(insn->regs_write, alias_insns[i].regs_mod, sizeof(alias_insns[i].regs_mod));
memcpy(insn->groups, alias_insns[i].groups, sizeof(alias_insns[i].groups));
if (insns[i].branch || insns[i].indirect_branch) {
// this insn also belongs to JUMP group
int j;
for (j = 0; j < ARR_SIZE(insns[i].groups); j++) {
if (insn->groups[j] == 0) {
insn->groups[j] = MIPS_GRP_JUMP;
break;
}
}
}
return;
}
}
@ -1400,6 +1411,17 @@ void Mips_get_insn_id(cs_insn *insn, unsigned int id)
memcpy(insn->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
memcpy(insn->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
memcpy(insn->groups, insns[i].groups, sizeof(insns[i].groups));
if (insns[i].branch || insns[i].indirect_branch) {
// this insn also belongs to JUMP group
int j;
for (j = 0; j < ARR_SIZE(insns[i].groups); j++) {
if (insn->groups[j] == 0) {
insn->groups[j] = MIPS_GRP_JUMP;
break;
}
}
}
}
}

View File

@ -6579,6 +6579,17 @@ void X86_get_insn_id(cs_insn *insn, unsigned int id)
memcpy(insn->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
memcpy(insn->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
memcpy(insn->groups, insns[i].groups, sizeof(insns[i].groups));
if (insns[i].branch || insns[i].indirect_branch) {
// this insn also belongs to JUMP group
int j;
for (j = 0; j < ARR_SIZE(insns[i].groups); j++) {
if (insn->groups[j] == 0) {
insn->groups[j] = X86_GRP_JUMP;
break;
}
}
}
}
}

View File

@ -670,6 +670,8 @@ typedef enum arm_insn_group {
ARM_GRP_CRC,
ARM_GRP_DPVFP,
ARM_GRP_V6M,
ARM_GRP_JUMP, // jump insn (including conditional+direct+indirect jumps)
ARM_GRP_MAX,
} arm_insn_group;

View File

@ -706,6 +706,7 @@ typedef enum arm64_insn {
ARM64_INS_NGC,
ARM64_INS_NEG,
ARM64_GRP_JUMP, // jump insn (including conditional+direct+indirect jumps)
ARM64_INS_MAX,
} arm64_insn;

View File

@ -669,6 +669,8 @@ typedef enum mips_insn_group {
MIPS_GRP_NONANSFPMATH,
MIPS_GRP_NOTFP64BIT,
MIPS_GRP_RELOCSTATIC,
MIPS_GRP_JUMP, // jump insn (including conditional+direct+indirect jumps)
MIPS_GRP_MAX,
} mips_insn_group;

View File

@ -1430,6 +1430,8 @@ typedef enum x86_insn_group {
X86_GRP_CDI,
X86_GRP_ERI,
X86_GRP_TBM,
X86_GRP_JUMP, // jump insn (including conditional+direct+indirect jumps)
X86_GRP_MAX
} x86_insn_group;

View File

@ -47,6 +47,7 @@ static void test()
//#define ARM64_CODE "\x20\xfc\x02\x9b" // mneg x0, x1, x2
#define ARM64_CODE "\x21\x7c\x02\x9b\x21\x7c\x00\x53\x00\x40\x21\x4b\xe1\x0b\x40\xb9\x10\x20\x21\x1e"
//#define THUMB_CODE "\x0a\xbf" // itet eq
//#define X86_CODE32 "\x77\x04" // ja +6
struct platform platforms[] = {
{