arm64: handle alias insn in a better way, and add support for MNEG. bug reported by Patroklos Argyroudis
diff --git a/arch/AArch64/AArch64InstPrinter.c b/arch/AArch64/AArch64InstPrinter.c
index 1cfddfc..d4b208b 100644
--- a/arch/AArch64/AArch64InstPrinter.c
+++ b/arch/AArch64/AArch64InstPrinter.c
@@ -636,10 +636,11 @@
if (printAliasInstr(MI, O, Info)) {
char *mnem = strdup(O->buffer);
char *tab = strchr(mnem, '\t');
- if (tab)
+ if (tab) {
*tab = '\0';
+ }
// reflect the new insn name (alias) in the opcode
- MCInst_setOpcode(MI, AArch64_get_insn_id2(AArch64_map_insn(mnem)));
+ MCInst_setOpcodePub(MI, AArch64_map_insn(mnem));
free(mnem);
} else
AArch64InstPrinter_printInstruction(MI, O);
diff --git a/arch/AArch64/mapping.c b/arch/AArch64/mapping.c
index 7354901..b8aed36 100644
--- a/arch/AArch64/mapping.c
+++ b/arch/AArch64/mapping.c
@@ -1854,6 +1854,7 @@
}
}
+// given public insn id, return internal instruction ID
unsigned int AArch64_get_insn_id2(unsigned int id)
{
return insn_reverse_id(insns, ARR_SIZE(insns), id);
@@ -2224,6 +2225,7 @@
return insn_name_maps[id].name;
}
+// map instruction name to public instruction ID
arm64_reg AArch64_map_insn(char *name)
{
// map *S instructions back to original id
@@ -2234,6 +2236,8 @@
{ ARM64_INS_BIC, "BICS" },
{ ARM64_INS_SBC, "SBCS" },
{ ARM64_INS_SUB, "SUBS" },
+ // alias insn
+ { ARM64_INS_MNEG, "MNEG" },
};
// NOTE: skip first NULL name in insn_name_maps
diff --git a/arch/AArch64/mapping.h b/arch/AArch64/mapping.h
index 7cd316b..5e0f314 100644
--- a/arch/AArch64/mapping.h
+++ b/arch/AArch64/mapping.h
@@ -18,7 +18,7 @@
char *AArch64_insn_name(unsigned int id);
-// map instruction name to instruction ID
+// map instruction name to public instruction ID
arm64_reg AArch64_map_insn(char *name);
#endif