mirror of
https://github.com/capstone-engine/capstone.git
synced 2025-02-15 03:47:49 +00:00
semantics: add insn group JUMP, so now we can check if this insn is branching
This commit is contained in:
parent
7c7a8bc523
commit
ec0ed8ee94
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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[] = {
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user