arm: no longer rely on information from @groups to verify relative instructions
diff --git a/arch/ARM/ARMInstPrinter.c b/arch/ARM/ARMInstPrinter.c
index bfcce01..0be00ef 100644
--- a/arch/ARM/ARMInstPrinter.c
+++ b/arch/ARM/ARMInstPrinter.c
@@ -556,7 +556,6 @@
}
} else if (MCOperand_isImm(Op)) {
SStream_concat(O, markup("<imm:"));
- //O << "#" << formatImm(Op.getImm());
int32_t imm = (int32_t)MCOperand_getImm(Op);
// relative branch only has relative offset, so we have to update it
@@ -1475,7 +1474,6 @@
static void printThumbS4ImmOperand(MCInst *MI, unsigned OpNum, SStream *O)
{
- //<< "#" << formatImm(MI->getOperand(OpNum).getImm() * 4)
unsigned tmp = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNum)) * 4;
if (tmp > HEX_THRESHOLD)
SStream_concat(O, "%s#0x%x", markup("<imm:"), tmp);
@@ -1492,7 +1490,6 @@
static void printThumbSRImm(MCInst *MI, unsigned OpNum, SStream *O)
{
unsigned Imm = (unsigned int)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
- // << "#" << formatImm((Imm == 0 ? 32 : Imm))
unsigned tmp = Imm == 0 ? 32 : Imm;
if (tmp > HEX_THRESHOLD)
SStream_concat(O, "%s#0x%x", markup("<imm:"), tmp);
@@ -1764,8 +1761,6 @@
if (MCOperand_getImm(MO2)) {
SStream_concat(O, ", ");
SStream_concat(O, markup("<imm:"));
- //<< "#" <<
- // formatImm(MCOperand_getImm(MO2.getImm() * 4)
unsigned tmp = (unsigned int)MCOperand_getImm(MO2) * 4;
if (tmp > HEX_THRESHOLD)
SStream_concat(O, "#0x%x", tmp);
diff --git a/arch/ARM/ARMMapping.c b/arch/ARM/ARMMapping.c
index 9490714..12ec4c3 100644
--- a/arch/ARM/ARMMapping.c
+++ b/arch/ARM/ARMMapping.c
@@ -13601,18 +13601,28 @@
#endif
}
+// list all relative branch instructions
+// ie: insns[i].branch && !insns[i].indirect_branch
+static unsigned int insn_rel[] = {
+ ARM_Bcc,
+ ARM_t2B,
+ ARM_t2Bcc,
+ ARM_tB,
+ ARM_tBcc,
+ ARM_tCBNZ,
+ ARM_tCBZ,
+ 0
+};
+
+// check if this insn is relative branch
bool ARM_rel_branch(cs_struct *h, unsigned int id)
{
-#ifndef CAPSTONE_DIET
- int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
- if (i != 0)
- return (insns[i].branch && !insns[i].indirect_branch);
- else {
- printf("ALERT: rel_branch() got incorrect id!\n");
- return false;
- }
-#else
- printf("ALERT: rel_branch() got incorrect id!\n");
+ int i;
+
+ for (i = 0; insn_rel[i]; i++)
+ if (id == insn_rel[i])
+ return true;
+
+ // not found
return false;
-#endif
}