mirror of
https://gitlab.com/qemu-project/capstone.git
synced 2025-11-11 08:16:15 +08:00
simplify ARCH_group_name() by using lookup table as suggested by @learn_more. also added the missing group name for GRP_PRIVILEGE
This commit is contained in:
@@ -840,28 +840,20 @@ static name_map group_name_maps[] = {
|
||||
{ ARM64_GRP_JUMP, "jump" },
|
||||
{ ARM64_GRP_CALL, "call" },
|
||||
{ ARM64_GRP_RET, "return" },
|
||||
{ ARM64_GRP_PRIVILEGE, "privilege" },
|
||||
|
||||
// architecture-specific groups
|
||||
{ ARM64_GRP_CRYPTO, "crypto" },
|
||||
{ ARM64_GRP_FPARMV8, "fparmv8" },
|
||||
{ ARM64_GRP_NEON, "neon" },
|
||||
{ ARM64_GRP_CRC, "crc" },
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
const char *AArch64_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= ARM64_GRP_ENDING || (id > ARM64_GRP_RET && id < ARM64_GRP_CRYPTO))
|
||||
return NULL;
|
||||
|
||||
// NOTE: when new generic groups are added, 4 must be changed accordingly
|
||||
if (id >= ARM64_GRP_CRYPTO)
|
||||
return group_name_maps[id - ARM64_GRP_CRYPTO + 4].name;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -768,6 +768,7 @@ static name_map group_name_maps[] = {
|
||||
// generic groups
|
||||
{ ARM_GRP_INVALID, NULL },
|
||||
{ ARM_GRP_JUMP, "jump" },
|
||||
{ ARM_GRP_PRIVILEGE, "privilege" },
|
||||
|
||||
// architecture-specific groups
|
||||
{ ARM_GRP_CRYPTO, "crypto" },
|
||||
@@ -808,15 +809,7 @@ static name_map group_name_maps[] = {
|
||||
const char *ARM_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= ARM_GRP_ENDING || (id > ARM_GRP_JUMP && id < ARM_GRP_CRYPTO))
|
||||
return NULL;
|
||||
|
||||
// NOTE: when new generic groups are added, 2 must be changed accordingly
|
||||
if (id >= ARM_GRP_CRYPTO)
|
||||
return group_name_maps[id - ARM_GRP_CRYPTO + 2].name;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -991,15 +991,7 @@ static name_map group_name_maps[] = {
|
||||
const char *Mips_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= MIPS_GRP_ENDING || (id > MIPS_GRP_JUMP && id < MIPS_GRP_BITCOUNT))
|
||||
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;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -1462,15 +1462,7 @@ static name_map group_name_maps[] = {
|
||||
const char *PPC_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= PPC_GRP_ENDING || (id > PPC_GRP_JUMP && id < PPC_GRP_ALTIVEC))
|
||||
return NULL;
|
||||
|
||||
// NOTE: when new generic groups are added, 2 must be changed accordingly
|
||||
if (id >= PPC_GRP_ALTIVEC)
|
||||
return group_name_maps[id - PPC_GRP_ALTIVEC + 2].name;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -526,15 +526,7 @@ static name_map group_name_maps[] = {
|
||||
const char *Sparc_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= SPARC_GRP_ENDING || (id > SPARC_GRP_JUMP && id < SPARC_GRP_HARDQUAD))
|
||||
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;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -839,15 +839,7 @@ static name_map group_name_maps[] = {
|
||||
const char *SystemZ_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= SYSZ_GRP_ENDING || (id > SYSZ_GRP_JUMP && id < SYSZ_GRP_DISTINCTOPS))
|
||||
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;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -2200,6 +2200,7 @@ static name_map group_name_maps[] = {
|
||||
{ X86_GRP_RET, "ret" },
|
||||
{ X86_GRP_INT, "int" },
|
||||
{ X86_GRP_IRET, "iret" },
|
||||
{ X86_GRP_PRIVILEGE, "privilege" },
|
||||
|
||||
// architecture-specific groups
|
||||
{ X86_GRP_VM, "vm" },
|
||||
@@ -2249,15 +2250,7 @@ static name_map group_name_maps[] = {
|
||||
const char *X86_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
// verify group id
|
||||
if (id >= X86_GRP_ENDING || (id > X86_GRP_IRET && id < X86_GRP_VM))
|
||||
return NULL;
|
||||
|
||||
// NOTE: when new generic groups are added, 6 must be changed accordingly
|
||||
if (id >= 128)
|
||||
return group_name_maps[id - 128 + 6].name;
|
||||
else
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -275,10 +275,7 @@ static name_map group_name_maps[] = {
|
||||
const char *XCore_group_name(csh handle, unsigned int id)
|
||||
{
|
||||
#ifndef CAPSTONE_DIET
|
||||
if (id >= XCORE_GRP_ENDING)
|
||||
return NULL;
|
||||
|
||||
return group_name_maps[id].name;
|
||||
return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
@@ -29,7 +29,7 @@ class GroupTest:
|
||||
name = self.data.get(group_id)
|
||||
res = _cs.cs_group_name(cap.csh, group_id)
|
||||
if res != name:
|
||||
print("ERROR: expected '%s', but got '%s'" %(name, res))
|
||||
print("ERROR: id = %u expected '%s', but got '%s'" %(group_id, name, res))
|
||||
print("")
|
||||
|
||||
arm_dict = {
|
||||
|
||||
14
utils.c
14
utils.c
@@ -52,6 +52,20 @@ int name2id(name_map* map, int max, const char *name)
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *id2name(name_map* map, int max, const unsigned int id)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < max; i++) {
|
||||
if (map[i].id == id) {
|
||||
return map[i].name;
|
||||
}
|
||||
}
|
||||
|
||||
// nothing match
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// count number of positive members in a list.
|
||||
// NOTE: list must be guaranteed to end in 0
|
||||
unsigned int count_positive(uint16_t *list)
|
||||
|
||||
4
utils.h
4
utils.h
@@ -38,6 +38,10 @@ typedef struct name_map {
|
||||
// return 0 if not found
|
||||
int name2id(name_map* map, int max, const char *name);
|
||||
|
||||
// map ID to a name
|
||||
// return NULL if not found
|
||||
char *id2name(name_map* map, int max, const unsigned int id);
|
||||
|
||||
// count number of positive members in a list.
|
||||
// NOTE: list must be guaranteed to end in 0
|
||||
unsigned int count_positive(uint16_t *list);
|
||||
|
||||
Reference in New Issue
Block a user