Change AArch64 GRP_JUMP to use a static table implementation

Added support for GRP_CALL and GRP_RETURN to AArch64
This commit is contained in:
David Callahan 2015-03-15 18:01:48 -07:00
parent 197fe1c14c
commit 9092e5295f
3 changed files with 20 additions and 22 deletions

View File

@ -332,12 +332,6 @@ void AArch64_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
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 @@ static name_map group_name_maps[] = {
// 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 @@ const char *AArch64_group_name(csh handle, unsigned int id)
{
#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

View File

@ -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
},
{

View File

@ -1134,6 +1134,8 @@ typedef enum arm64_insn_group {
//> 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