Change AArch64 GRP_JUMP to use a static table implementation
Added support for GRP_CALL and GRP_RETURN to AArch64
diff --git a/arch/AArch64/AArch64Mapping.c b/arch/AArch64/AArch64Mapping.c
index b5eed13..b31c958 100644
--- a/arch/AArch64/AArch64Mapping.c
+++ b/arch/AArch64/AArch64Mapping.c
@@ -332,12 +332,6 @@
insn->detail->groups_count = (uint8_t)count_positive(insns[i].groups);
insn->detail->arm64.update_flags = cs_reg_write((csh)&handle, insn, ARM64_REG_NZCV);
-
- if (insns[i].branch || insns[i].indirect_branch) {
- // this insn also belongs to JUMP group. add JUMP group
- insn->detail->groups[insn->detail->groups_count] = ARM64_GRP_JUMP;
- insn->detail->groups_count++;
- }
#endif
}
}
@@ -844,6 +838,8 @@
// generic groups
{ ARM64_GRP_INVALID, NULL },
{ ARM64_GRP_JUMP, "jump" },
+ { ARM64_GRP_CALL, "call" },
+ { ARM64_GRP_RET, "return" },
// architecture-specific groups
{ ARM64_GRP_CRYPTO, "crypto" },
@@ -858,12 +854,12 @@
{
#ifndef CAPSTONE_DIET
// verify group id
- if (id >= ARM64_GRP_ENDING || (id > ARM64_GRP_JUMP && id < ARM64_GRP_CRYPTO))
+ if (id >= ARM64_GRP_ENDING || (id > ARM64_GRP_RET && id < ARM64_GRP_CRYPTO))
return NULL;
// NOTE: when new generic groups are added, 2 must be changed accordingly
if (id >= 128)
- return group_name_maps[id - 128 + 2].name;
+ return group_name_maps[id - 128 + 4].name;
else
return group_name_maps[id].name;
#else
diff --git a/arch/AArch64/AArch64MappingInsn.inc b/arch/AArch64/AArch64MappingInsn.inc
index f7acc95..bb6b15a 100644
--- a/arch/AArch64/AArch64MappingInsn.inc
+++ b/arch/AArch64/AArch64MappingInsn.inc
@@ -430,7 +430,7 @@
{
AArch64_B, ARM64_INS_B,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
@@ -532,19 +532,19 @@
{
AArch64_BL, ARM64_INS_BL,
#ifndef CAPSTONE_DIET
- { 0 }, { ARM64_REG_LR, 0 }, { 0 }, 0, 0
+ { 0 }, { ARM64_REG_LR, 0 }, { ARM64_GRP_CALL, 0 }, 0, 0
#endif
},
{
AArch64_BLR, ARM64_INS_BLR,
#ifndef CAPSTONE_DIET
- { 0 }, { ARM64_REG_LR, 0 }, { 0 }, 0, 0
+ { 0 }, { ARM64_REG_LR, 0 }, { ARM64_GRP_CALL, 0 }, 0, 0
#endif
},
{
AArch64_BR, ARM64_INS_BR,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 1
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 1
#endif
},
{
@@ -568,31 +568,31 @@
{
AArch64_Bcc, ARM64_INS_B,
#ifndef CAPSTONE_DIET
- { ARM64_REG_NZCV, 0 }, { 0 }, { 0 }, 1, 0
+ { ARM64_REG_NZCV, 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_CBNZW, ARM64_INS_CBNZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_CBNZX, ARM64_INS_CBNZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_CBZW, ARM64_INS_CBZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_CBZX, ARM64_INS_CBZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
@@ -6832,7 +6832,7 @@
{
AArch64_RET, ARM64_INS_RET,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 0, 0
+ { 0 }, { 0 }, { ARM64_GRP_RET, 0 }, 0, 0
#endif
},
{
@@ -11632,13 +11632,13 @@
{
AArch64_TBNZW, ARM64_INS_TBNZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_TBNZX, ARM64_INS_TBNZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
@@ -11692,13 +11692,13 @@
{
AArch64_TBZW, ARM64_INS_TBZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
AArch64_TBZX, ARM64_INS_TBZ,
#ifndef CAPSTONE_DIET
- { 0 }, { 0 }, { 0 }, 1, 0
+ { 0 }, { 0 }, { ARM64_GRP_JUMP, 0 }, 1, 0
#endif
},
{
diff --git a/include/capstone/arm64.h b/include/capstone/arm64.h
index 5854a94..9acff2b 100644
--- a/include/capstone/arm64.h
+++ b/include/capstone/arm64.h
@@ -1134,6 +1134,8 @@
//> Generic groups
// all jump instructions (conditional+direct+indirect jumps)
ARM64_GRP_JUMP, // = CS_GRP_JUMP
+ ARM64_GRP_CALL,
+ ARM64_GRP_RET,
ARM64_GRP_PRIVILEGE = 6, // = CS_GRP_PRIVILEGE
//> Architecture-specific groups