diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c9723ec04b2..3a7e6b56b3d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -62,8 +62,8 @@ jobs:
linux-gcc-tests-asan,
linux-clang-tests-asan,
linux-gcc-tests-codecov,
- capstone-v3,
capstone-v4,
+ capstone-v5,
]
include:
- name: linux-meson-clang-tests
@@ -129,31 +129,31 @@ jobs:
timeout: 60
cflags: "-Wno-cpp"
allow_failure: false
- - name: capstone-v3
+ - name: capstone-sys
os: ubuntu-22.04
build_system: meson
compiler: gcc
- meson_options: -Dbuildtype=release -Duse_capstone_version=v3 --werror
+ meson_options: -Dbuildtype=release -Duse_sys_capstone=enabled --werror
run_tests: false
enabled: ${{ (github.event_name != 'pull_request' || contains(github.head_ref, 'capstone')) && needs.changes.outputs.edited == 'true' }}
timeout: 45
cflags: "-Wno-cpp"
allow_failure: false
- - name: capstone-sys
+ - name: capstone-v4
os: ubuntu-22.04
build_system: meson
compiler: gcc
- meson_options: -Dbuildtype=release -Duse_sys_capstone=enabled --werror
+ meson_options: -Dbuildtype=release -Duse_capstone_version=v4 --werror
run_tests: false
enabled: ${{ (github.event_name != 'pull_request' || contains(github.head_ref, 'capstone')) && needs.changes.outputs.edited == 'true' }}
timeout: 45
cflags: "-Wno-cpp"
- allow_failure: false
- - name: capstone-v4
+ allow_failure: true
+ - name: capstone-v5
os: ubuntu-22.04
build_system: meson
compiler: gcc
- meson_options: -Dbuildtype=release -Duse_capstone_version=v4 --werror
+ meson_options: -Dbuildtype=release -Duse_capstone_version=v5 --werror
run_tests: false
enabled: ${{ (github.event_name != 'pull_request' || contains(github.head_ref, 'capstone')) && needs.changes.outputs.edited == 'true' }}
timeout: 45
diff --git a/librz/analysis/arch/arm/arm_accessors32.h b/librz/analysis/arch/arm/arm_accessors32.h
index 7d3d5b06858..5ded7f07e28 100644
--- a/librz/analysis/arch/arm/arm_accessors32.h
+++ b/librz/analysis/arch/arm/arm_accessors32.h
@@ -21,17 +21,14 @@
#define MEMDISP_BV(x) (HASMEMINDEX(x) ? REG_VAL(insn->detail->arm.operands[x].mem.index) : U32(MEMDISP(x)))
#define ISIMM(x) (insn->detail->arm.operands[x].type == ARM_OP_IMM || insn->detail->arm.operands[x].type == ARM_OP_FP)
#define ISREG(x) (insn->detail->arm.operands[x].type == ARM_OP_REG)
-#define ISPSRFLAGS(x) (insn->detail->arm.operands[x].type == ARM_OP_CPSR || insn->detail->arm.operands[x].type == ARM_OP_SPSR)
-#define ISMEM(x) (insn->detail->arm.operands[x].type == ARM_OP_MEM)
-#define ISFPIMM(x) (insn->detail->arm.operands[x].type == ARM_OP_FP)
-
-#if CS_API_MAJOR > 3
-#define LSHIFT(x) insn->detail->arm.operands[x].mem.lshift
-#define LSHIFT2(x) insn->detail->arm.operands[x].shift.value // Dangerous, returns value even if isn't LSL
-#else
-#define LSHIFT(x) 0
-#define LSHIFT2(x) 0
+#if CS_NEXT_VERSION >= 6
+#define ISPSRFLAGS(x) (insn->detail->arm.operands[x].type == ARM_OP_CPSR || insn->detail->arm.operands[x].type == ARM_OP_SPSR)
#endif
+#define ISMEM(x) (insn->detail->arm.operands[x].type == ARM_OP_MEM)
+#define ISFPIMM(x) (insn->detail->arm.operands[x].type == ARM_OP_FP)
+
+#define LSHIFT(x) insn->detail->arm.operands[x].mem.lshift
+#define LSHIFT2(x) insn->detail->arm.operands[x].shift.value // Dangerous, returns value even if isn't LSL
#define OPCOUNT() insn->detail->arm.op_count
#define ISSHIFTED(x) (insn->detail->arm.operands[x].shift.type != ARM_SFT_INVALID && insn->detail->arm.operands[x].shift.value != 0)
#define SHIFTTYPE(x) insn->detail->arm.operands[x].shift.type
@@ -40,7 +37,12 @@
SHIFTTYPE(x) == ARM_SFT_RRX_REG)
#define SHIFTVALUE(x) insn->detail->arm.operands[x].shift.value
-#define ISPOSTINDEX() insn->detail->arm.post_index
+#if CS_NEXT_VERSION >= 6
+#define CS_ARMCC(CC) ARMCC_##CC
#define ISWRITEBACK32() insn->detail->writeback
-#define ISPREINDEX32() (((OPCOUNT() == 2) && (ISMEM(1)) && (ISWRITEBACK32()) && (!ISPOSTINDEX())) || \
- ((OPCOUNT() == 3) && (ISMEM(2)) && (ISWRITEBACK32()) && (!ISPOSTINDEX())))
+#define ISPOSTINDEX32() insn->detail->arm.post_index
+#else
+#define CS_ARMCC(CC) ARM_CC_##CC
+#define ISWRITEBACK32() insn->detail->arm.writeback
+#define ISPOSTINDEX32() (((OPCOUNT() == 3) && (ISIMM(2) || ISREG(2)) && (ISWRITEBACK32())) || ((OPCOUNT() == 4) && (ISIMM(3) || ISREG(3)) && (ISWRITEBACK32())))
+#endif
diff --git a/librz/analysis/arch/arm/arm_accessors64.h b/librz/analysis/arch/arm/arm_accessors64.h
index d1c1caee956..213ebc70dd2 100644
--- a/librz/analysis/arch/arm/arm_accessors64.h
+++ b/librz/analysis/arch/arm/arm_accessors64.h
@@ -21,12 +21,8 @@
#define ISREG64(x) (insn->detail->arm64.operands[x].type == ARM64_OP_REG)
#define ISMEM64(x) (insn->detail->arm64.operands[x].type == ARM64_OP_MEM)
-#if CS_API_MAJOR > 3
#define LSHIFT2_64(x) insn->detail->arm64.operands[x].shift.value
-#else
-#define LSHIFT2_64(x) 0
-#endif
-#define OPCOUNT64() insn->detail->arm64.op_count
+#define OPCOUNT64() insn->detail->arm64.op_count
#define ISWRITEBACK64() (insn->detail->arm64.writeback == true)
#define ISPREINDEX64() (((OPCOUNT64() == 2) && (ISMEM64(1)) && (ISWRITEBACK64())) || ((OPCOUNT64() == 3) && (ISMEM64(2)) && (ISWRITEBACK64())))
diff --git a/librz/analysis/arch/arm/arm_cs.h b/librz/analysis/arch/arm/arm_cs.h
index efb9e8e5fd7..25bd301ffac 100644
--- a/librz/analysis/arch/arm/arm_cs.h
+++ b/librz/analysis/arch/arm/arm_cs.h
@@ -12,7 +12,12 @@ RZ_IPI int rz_arm_cs_analysis_op_64_esil(RzAnalysis *a, RzAnalysisOp *op, ut64 a
RZ_IPI bool rz_arm_cs_is_group_member(RZ_NONNULL const cs_insn *insn, arm_insn_group feature);
+#if CS_NEXT_VERSION >= 6
+RZ_IPI bool rz_arm_cs_is_float_insn(const cs_insn *insn);
RZ_IPI const char *rz_arm32_cs_esil_prefix_cond(RzAnalysisOp *op, ARMCC_CondCodes cond_type);
+#else
+RZ_IPI const char *rz_arm32_cs_esil_prefix_cond(RzAnalysisOp *op, arm_cc cond_type);
+#endif
RZ_IPI const char *rz_arm64_cs_esil_prefix_cond(RzAnalysisOp *op, arm64_cc cond_type);
RZ_IPI RzILOpEffect *rz_arm_cs_32_il(csh *handle, cs_insn *insn, bool thumb);
diff --git a/librz/analysis/arch/arm/arm_esil32.c b/librz/analysis/arch/arm/arm_esil32.c
index 507cc611928..c11cb3958eb 100644
--- a/librz/analysis/arch/arm/arm_esil32.c
+++ b/librz/analysis/arch/arm/arm_esil32.c
@@ -59,72 +59,76 @@ static unsigned int regsize32(cs_insn *insn, int n) {
#define REGSIZE32(x) regsize32(insn, x)
+#if CS_NEXT_VERSION >= 6
// return postfix
RZ_IPI const char *rz_arm32_cs_esil_prefix_cond(RzAnalysisOp *op, ARMCC_CondCodes cond_type) {
+#else
+RZ_IPI const char *rz_arm32_cs_esil_prefix_cond(RzAnalysisOp *op, arm_cc cond_type) {
+#endif
const char *close_cond[2];
close_cond[0] = "";
close_cond[1] = ",}";
int close_type = 0;
switch (cond_type) {
- case ARMCC_EQ:
+ case CS_ARMCC(EQ):
close_type = 1;
rz_strbuf_setf(&op->esil, "zf,?{,");
break;
- case ARMCC_NE:
+ case CS_ARMCC(NE):
close_type = 1;
rz_strbuf_setf(&op->esil, "zf,!,?{,");
break;
- case ARMCC_HS:
+ case CS_ARMCC(HS):
close_type = 1;
rz_strbuf_setf(&op->esil, "cf,?{,");
break;
- case ARMCC_LO:
+ case CS_ARMCC(LO):
close_type = 1;
rz_strbuf_setf(&op->esil, "cf,!,?{,");
break;
- case ARMCC_MI:
+ case CS_ARMCC(MI):
close_type = 1;
rz_strbuf_setf(&op->esil, "nf,?{,");
break;
- case ARMCC_PL:
+ case CS_ARMCC(PL):
close_type = 1;
rz_strbuf_setf(&op->esil, "nf,!,?{,");
break;
- case ARMCC_VS:
+ case CS_ARMCC(VS):
close_type = 1;
rz_strbuf_setf(&op->esil, "vf,?{,");
break;
- case ARMCC_VC:
+ case CS_ARMCC(VC):
close_type = 1;
rz_strbuf_setf(&op->esil, "vf,!,?{,");
break;
- case ARMCC_HI:
+ case CS_ARMCC(HI):
close_type = 1;
rz_strbuf_setf(&op->esil, "cf,zf,!,&,?{,");
break;
- case ARMCC_LS:
+ case CS_ARMCC(LS):
close_type = 1;
rz_strbuf_setf(&op->esil, "cf,!,zf,|,?{,");
break;
- case ARMCC_GE:
+ case CS_ARMCC(GE):
close_type = 1;
rz_strbuf_setf(&op->esil, "nf,vf,^,!,?{,");
break;
- case ARMCC_LT:
+ case CS_ARMCC(LT):
close_type = 1;
rz_strbuf_setf(&op->esil, "nf,vf,^,?{,");
break;
- case ARMCC_GT:
+ case CS_ARMCC(GT):
// zf == 0 && nf == vf
close_type = 1;
rz_strbuf_setf(&op->esil, "zf,!,nf,vf,^,!,&,?{,");
break;
- case ARMCC_LE:
+ case CS_ARMCC(LE):
// zf == 1 || nf != vf
close_type = 1;
rz_strbuf_setf(&op->esil, "zf,nf,vf,^,|,?{,");
break;
- case ARMCC_AL:
+ case CS_ARMCC(AL):
// always executed
break;
default:
@@ -391,7 +395,7 @@ PUSH { r4, r5, r6, r7, lr }
rz_strbuf_appendf(&op->esil, "%s,%s,%d,+,=[4],",
REG(i), ARG(0), (i + offset) * 4);
}
- if (insn->detail->writeback == true) { // writeback, reg should be incremented
+ if (ISWRITEBACK32() == true) { // writeback, reg should be incremented
rz_strbuf_appendf(&op->esil, "%d,%s,+=,",
direction * (insn->detail->arm.op_count - 1) * 4, ARG(0));
}
@@ -406,7 +410,7 @@ PUSH { r4, r5, r6, r7, lr }
width += REGSIZE32(i);
}
// increment if writeback
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, "%d,%s,+=,", width, ARG(0));
}
break;
@@ -430,7 +434,7 @@ PUSH { r4, r5, r6, r7, lr }
width += REGSIZE32(i);
}
// increment if writeback
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, "%d,%s,+=,", width, ARG(0));
}
break;
@@ -489,7 +493,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
for (i = 1; i < insn->detail->arm.op_count; i++) {
rz_strbuf_appendf(&op->esil, "%s,%d,+,[4],%s,=,", ARG(0), (i + offset) * 4, REG(i));
}
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, "%d,%s,+=,",
direction * (insn->detail->arm.op_count - 1) * 4, ARG(0));
}
@@ -545,14 +549,14 @@ r6,r5,r4,3,sp,[*],12,sp,+=
default:
str_ldr_bytes = 4;
}
- if (!ISPOSTINDEX()) {
+ if (!ISPOSTINDEX32()) {
if (ISMEM(1) && !HASMEMINDEX(1)) {
int disp = MEMDISP(1);
char sign = disp >= 0 ? '+' : '-';
disp = disp >= 0 ? disp : -disp;
rz_strbuf_appendf(&op->esil, "%s,0x%x,%s,%c,0xffffffff,&,=[%d]",
REG(0), disp, MEMBASE(1), sign, str_ldr_bytes);
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%d,%s,%c,%s,=",
disp, MEMBASE(1), sign, MEMBASE(1));
}
@@ -563,7 +567,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
case ARM_SFT_LSL:
rz_strbuf_appendf(&op->esil, "%s,%s,%d,%s,<<,+,0xffffffff,&,=[%d]",
REG(0), MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), str_ldr_bytes);
- if (insn->detail->writeback) { // e.g. 'str r2, [r3, r1, lsl 4]!'
+ if (ISWRITEBACK32()) { // e.g. 'str r2, [r3, r1, lsl 4]!'
rz_strbuf_appendf(&op->esil, ",%s,%d,%s,<<,+,%s,=",
MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), MEMBASE(1));
}
@@ -571,7 +575,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
case ARM_SFT_LSR:
rz_strbuf_appendf(&op->esil, "%s,%s,%d,%s,>>,+,0xffffffff,&,=[%d]",
REG(0), MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), str_ldr_bytes);
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%d,%s,>>,+,%s,=",
MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), MEMBASE(1));
}
@@ -579,7 +583,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
case ARM_SFT_ASR:
rz_strbuf_appendf(&op->esil, "%s,%s,%d,%s,>>>>,+,0xffffffff,&,=[%d]",
REG(0), MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), str_ldr_bytes);
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%d,%s,>>>>,+,%s,=",
MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), MEMBASE(1));
}
@@ -587,7 +591,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
case ARM_SFT_ROR:
rz_strbuf_appendf(&op->esil, "%s,%s,%d,%s,>>>,+,0xffffffff,&,=[%d]",
REG(0), MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), str_ldr_bytes);
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%d,%s,>>>,+,%s,=",
MEMBASE(1), SHIFTVALUE(1), MEMINDEX(1), MEMBASE(1));
}
@@ -602,14 +606,14 @@ r6,r5,r4,3,sp,[*],12,sp,+=
} else { // No shift
rz_strbuf_appendf(&op->esil, "%s,%s,%s,+,0xffffffff,&,=[%d]",
REG(0), MEMINDEX(1), MEMBASE(1), str_ldr_bytes);
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%s,+,%s,=",
MEMINDEX(1), MEMBASE(1), MEMBASE(1));
}
}
}
}
- if (ISPOSTINDEX()) { // e.g. 'str r2, [r3], 4
+ if (ISPOSTINDEX32()) { // e.g. 'str r2, [r3], 4
if (!HASMEMINDEX(1) && (str_ldr_bytes != 8)) { // e.g. 'str r2, [r3], 4
rz_strbuf_appendf(&op->esil, "%s,%s,0xffffffff,&,=[%d],%d,%s,+=",
REG(0), MEMBASE(1), str_ldr_bytes, MEMDISP(1), MEMBASE(1));
@@ -650,7 +654,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
disp = disp >= 0 ? disp : -disp;
rz_strbuf_appendf(&op->esil, "%s,%s,0xffffffff,&,=[4],%s,4,%s,+,0xffffffff,&,=[4]",
REG(0), MEMBASE(2), REG(1), MEMBASE(2));
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%d,%s,%c,%s,=",
disp, MEMBASE(2), sign, MEMBASE(2));
}
@@ -660,7 +664,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
} else {
rz_strbuf_appendf(&op->esil, "%s,%s,0xffffffff,&,=[4],%s,4,%s,+,0xffffffff,&,=[4]",
REG(0), MEMBASE(2), REG(1), MEMBASE(2));
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
const char sign = ISMEMINDEXSUB(2) ? '-' : '+';
rz_strbuf_appendf(&op->esil, ",%s,%s,%c=",
MEMINDEX(2), MEMBASE(2), sign);
@@ -683,7 +687,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
rz_strbuf_appendf(&op->esil, "0x%" PFMT64x ",2,2,%s,%d,+,>>,<<,+,0xffffffff,&,DUP,[4],%s,=,4,+,[4],%s,=",
(ut64)MEMDISP(2), pc, pcdelta, REG(0), REG(1));
} else {
- int disp = ISPOSTINDEX() ? 0 : MEMDISP(2);
+ int disp = ISPOSTINDEX32() ? 0 : MEMDISP(2);
// not refptr, because we can't grab the reg value statically op->refptr = 4;
rz_strbuf_appendf(&op->esil, "0x%" PFMT64x ",%s,-,0xffffffff,&,DUP,[4],%s,=,4,+,[4],%s,=",
(ut64)-disp, MEMBASE(2), REG(0), REG(1));
@@ -704,16 +708,16 @@ r6,r5,r4,3,sp,[*],12,sp,+=
} else {
if (HASMEMINDEX(2)) { // e.g. `ldrd r2, r3 [r4, r1]` or `ldrd r2, r3 [r4], r1`
const char op_index = ISMEMINDEXSUB(2) ? '-' : '+';
- const char *mem_index = ISPOSTINDEX() ? "0" : MEMINDEX(2);
+ const char *mem_index = ISPOSTINDEX32() ? "0" : MEMINDEX(2);
rz_strbuf_appendf(&op->esil, "%s,%s,%c,0xffffffff,&,DUP,[4],%s,=,4,+,[4],%s,=",
mem_index, MEMBASE(2), op_index, REG(0), REG(1));
} else {
- int disp = ISPOSTINDEX() ? 0 : MEMDISP(2);
+ int disp = ISPOSTINDEX32() ? 0 : MEMDISP(2);
rz_strbuf_appendf(&op->esil, "%d,%s,+,0xffffffff,&,DUP,[4],%s,=,4,+,[4],%s,=",
disp, MEMBASE(2), REG(0), REG(1));
}
- if (insn->detail->writeback) {
- if (ISPOSTINDEX()) {
+ if (ISWRITEBACK32()) {
+ if (ISPOSTINDEX32()) {
if (!HASMEMINDEX(2)) {
rz_strbuf_appendf(&op->esil, ",%s,%d,+,%s,=",
MEMBASE(2), MEMDISP(2), MEMBASE(2));
@@ -722,7 +726,7 @@ r6,r5,r4,3,sp,[*],12,sp,+=
rz_strbuf_appendf(&op->esil, ",%s,%s,%c,%s,=",
MEMINDEX(2), MEMBASE(2), op_index, MEMBASE(2));
}
- } else if (ISPREINDEX32()) {
+ } else {
if (HASMEMINDEX(2)) {
const char op_index = ISMEMINDEXSUB(2) ? '-' : '+';
rz_strbuf_appendf(&op->esil, ",%s,%s,%c,%s,=",
@@ -745,9 +749,9 @@ r6,r5,r4,3,sp,[*],12,sp,+=
MEMINDEX(1), MEMBASE(1), REG(0));
} else {
rz_strbuf_appendf(&op->esil, "%s,%d,+,[1],%s,=",
- MEMBASE(1), ISPOSTINDEX() ? 0 : MEMDISP(1), REG(0));
+ MEMBASE(1), ISPOSTINDEX32() ? 0 : MEMDISP(1), REG(0));
}
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%d,+,%s,=",
MEMBASE(1), MEMDISP(1), MEMBASE(1));
}
@@ -826,14 +830,14 @@ r6,r5,r4,3,sp,[*],12,sp,+=
} else if (HASMEMINDEX(1)) { // e.g. `ldr r2, [r3, r1]`
rz_strbuf_appendf(&op->esil, "%s,%s,+,0xffffffff,&,[4],0x%x,&,%s,=",
MEMINDEX(1), MEMBASE(1), mask, REG(0));
- } else if (ISPOSTINDEX()) {
+ } else if (ISPOSTINDEX32()) {
rz_strbuf_appendf(&op->esil, "%s,0xffffffff,&,[4],0x%x,&,%s,=",
MEMBASE(1), mask, REG(0));
} else {
rz_strbuf_appendf(&op->esil, "%d,%s,+,0xffffffff,&,[4],0x%x,&,%s,=",
MEMDISP(1), MEMBASE(1), mask, REG(0));
}
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
rz_strbuf_appendf(&op->esil, ",%s,%d,+,%s,=",
MEMBASE(1), MEMDISP(1), MEMBASE(1));
}
@@ -844,7 +848,11 @@ r6,r5,r4,3,sp,[*],12,sp,+=
// TODO: esil for MRS
break;
case ARM_INS_MSR:
+#if CS_NEXT_VERSION >= 6
msr_flags = insn->detail->arm.operands[0].sysop.msr_mask;
+#else
+ msr_flags = insn->detail->arm.operands[0].reg >> 4;
+#endif
rz_strbuf_appendf(&op->esil, "0,");
if (msr_flags & 1) {
rz_strbuf_appendf(&op->esil, "0xFF,|,");
diff --git a/librz/analysis/arch/arm/arm_esil64.c b/librz/analysis/arch/arm/arm_esil64.c
index 30e04b51635..eea43f5bdba 100644
--- a/librz/analysis/arch/arm/arm_esil64.c
+++ b/librz/analysis/arch/arm/arm_esil64.c
@@ -1127,9 +1127,7 @@ RZ_IPI int rz_arm_cs_analysis_op_64_esil(RzAnalysis *a, RzAnalysisOp *op, ut64 a
}
break;
case ARM64_INS_NEG:
-#if CS_API_MAJOR > 3
case ARM64_INS_NEGS:
-#endif
if (LSHIFT2_64(1)) {
SHIFTED_REG64_APPEND(&op->esil, 1);
} else {
diff --git a/librz/analysis/arch/arm/arm_il32.c b/librz/analysis/arch/arm/arm_il32.c
index 4f5cbc68829..7cfac9769d5 100644
--- a/librz/analysis/arch/arm/arm_il32.c
+++ b/librz/analysis/arch/arm/arm_il32.c
@@ -264,11 +264,7 @@ static inline RzFloatFormat cvtdt2fmt(arm_vectordata_type type, bool choose_src)
#define VVEC_DT(insn) insn->detail->arm.vector_data
#define FROM_FMT(dt) cvtdt2fmt(dt, true)
#define TO_FMT(dt) cvtdt2fmt(dt, false)
-#if CS_API_MAJOR > 3
-// clang-format off
#define NEON_LANE(n) insn->detail->arm.operands[n].neon_lane
-// clang-format on
-#endif
/**
* IL to write the given capstone reg
@@ -306,37 +302,41 @@ static RzILOpEffect *write_reg(arm_reg reg, RZ_OWN RZ_NONNULL RzILOpBitVector *v
* IL for arm condition
* unconditional is returned as NULL (rather than true), for simpler code
*/
+#if CS_NEXT_VERSION >= 6
static RZ_NULLABLE RzILOpBool *cond(ARMCC_CondCodes c) {
+#else
+static RZ_NULLABLE RzILOpBool *cond(arm_cc c) {
+#endif
switch (c) {
- case ARMCC_EQ:
+ case CS_ARMCC(EQ):
return VARG("zf");
- case ARMCC_NE:
+ case CS_ARMCC(NE):
return INV(VARG("zf"));
- case ARMCC_HS:
+ case CS_ARMCC(HS):
return VARG("cf");
- case ARMCC_LO:
+ case CS_ARMCC(LO):
return INV(VARG("cf"));
- case ARMCC_MI:
+ case CS_ARMCC(MI):
return VARG("nf");
- case ARMCC_PL:
+ case CS_ARMCC(PL):
return INV(VARG("nf"));
- case ARMCC_VS:
+ case CS_ARMCC(VS):
return VARG("vf");
- case ARMCC_VC:
+ case CS_ARMCC(VC):
return INV(VARG("vf"));
- case ARMCC_HI:
+ case CS_ARMCC(HI):
return AND(VARG("cf"), INV(VARG("zf")));
- case ARMCC_LS:
+ case CS_ARMCC(LS):
return OR(INV(VARG("cf")), VARG("zf"));
- case ARMCC_GE:
+ case CS_ARMCC(GE):
return INV(XOR(VARG("nf"), VARG("vf")));
- case ARMCC_LT:
+ case CS_ARMCC(LT):
return XOR(VARG("nf"), VARG("vf"));
- case ARMCC_GT:
+ case CS_ARMCC(GT):
return AND(INV(VARG("zf")), INV(XOR(VARG("nf"), VARG("vf"))));
- case ARMCC_LE:
+ case CS_ARMCC(LE):
return OR(VARG("zf"), XOR(VARG("nf"), VARG("vf")));
- case ARMCC_AL:
+ case CS_ARMCC(AL):
default:
return NULL;
}
@@ -829,10 +829,10 @@ static RzILOpEffect *ldr(cs_insn *insn, bool is_thumb) {
if (!addr) {
return NULL;
}
- bool writeback = insn->detail->writeback;
+ bool writeback = ISWRITEBACK32();
RzILOpEffect *writeback_eff = NULL;
- bool writeback_post = insn->detail->arm.post_index;
+ bool writeback_post = ISPOSTINDEX32();
if (writeback) {
arm_reg base = insn->detail->arm.operands[mem_idx].mem.base;
writeback_eff = write_reg(base, addr);
@@ -908,9 +908,9 @@ static RzILOpEffect *str(cs_insn *insn, bool is_thumb) {
if (!addr) {
return NULL;
}
- bool writeback = insn->detail->writeback;
+ bool writeback = ISWRITEBACK32();
RzILOpEffect *writeback_eff = NULL;
- bool writeback_post = insn->detail->arm.post_index;
+ bool writeback_post = ISPOSTINDEX32();
if (writeback) {
arm_reg base = insn->detail->arm.operands[mem_idx].mem.base;
writeback_eff = write_reg(base, addr);
@@ -1211,7 +1211,7 @@ static RzILOpEffect *stm(cs_insn *insn, bool is_thumb) {
}
op_first = 1;
ptr_reg = REGID(0);
- writeback = insn->detail->writeback;
+ writeback = ISWRITEBACK32();
}
size_t op_count = OPCOUNT() - op_first;
if (!op_count) {
@@ -1272,7 +1272,7 @@ static RzILOpEffect *ldm(cs_insn *insn, bool is_thumb) {
}
op_first = 1;
ptr_reg = REGID(0);
- writeback = insn->detail->writeback;
+ writeback = ISWRITEBACK32();
}
size_t op_count = OPCOUNT() - op_first;
if (!op_count) {
@@ -1371,8 +1371,6 @@ static void label_svc(RzILVM *vm, RzILOpEffect *op) {
// stub, nothing to do here
}
-#if CS_API_MAJOR > 3
-
/**
* Capstone: ARM_INS_HVC
* ARM: hvc
@@ -1381,8 +1379,6 @@ static RzILOpEffect *hvc(cs_insn *insn, bool is_thumb) {
return GOTO("hvc");
}
-#endif
-
static void label_hvc(RzILVM *vm, RzILOpEffect *op) {
// stub, nothing to do here
}
@@ -1478,6 +1474,7 @@ static RzILOpEffect *mla(cs_insn *insn, bool is_thumb) {
* ARM: mrs
*/
static RzILOpEffect *mrs(cs_insn *insn, bool is_thumb) {
+#if CS_NEXT_VERSION >= 6
if (!ISREG(0) || !(ISREG(1) || ISPSRFLAGS(1))) {
return NULL;
}
@@ -1485,6 +1482,15 @@ static RzILOpEffect *mrs(cs_insn *insn, bool is_thumb) {
// only these regs supported
return NULL;
}
+#else
+ if (!ISREG(0) || !(ISREG(1))) {
+ return NULL;
+ }
+ if (REGID(1) != ARM_REG_CPSR && REGID(1) != ARM_REG_SPSR && REGID(1) != ARM_REG_APSR) {
+ // only these regs supported
+ return NULL;
+ }
+#endif
// There are more bits in ARM, but this is all we have:
return write_reg(REGID(0),
LOGOR(ITE(VARG("nf"), U32(1ul << 31), U32(0)),
@@ -1501,6 +1507,7 @@ static RzILOpEffect *mrs(cs_insn *insn, bool is_thumb) {
*/
static RzILOpEffect *msr(cs_insn *insn, bool is_thumb) {
cs_arm_op *dst = &insn->detail->arm.operands[0];
+#if CS_NEXT_VERSION >= 6
if ((dst->type != ARM_OP_SYSREG) && (dst->type != ARM_OP_CPSR) && (dst->type != ARM_OP_SPSR)) {
return NULL;
}
@@ -1523,6 +1530,30 @@ static RzILOpEffect *msr(cs_insn *insn, bool is_thumb) {
update_s = (dst->sysop.psr_bits & ARM_FIELD_CPSR_S) || (dst->sysop.psr_bits & ARM_FIELD_SPSR_S);
break;
}
+#else
+ if (dst->type != ARM_OP_SYSREG) {
+ return NULL;
+ }
+ // check if the reg+mask contains any of the flags we have:
+ bool update_f = false;
+ bool update_s = false;
+ switch (dst->reg) {
+ case ARM_SYSREG_APSR_NZCVQ:
+ update_f = true;
+ break;
+ case ARM_SYSREG_APSR_G:
+ update_s = true;
+ break;
+ case ARM_SYSREG_APSR_NZCVQG:
+ update_f = true;
+ update_s = true;
+ break;
+ default:
+ update_f = (dst->reg & ARM_SYSREG_CPSR_F) || (dst->reg & ARM_SYSREG_SPSR_F);
+ update_s = (dst->reg & ARM_SYSREG_CPSR_S) || (dst->reg & ARM_SYSREG_SPSR_S);
+ break;
+ }
+#endif
if (!update_f && !update_s) {
// no flags we know
return NULL;
@@ -1881,7 +1912,7 @@ static RzILOpEffect *rfe(cs_insn *insn, bool is_thumb) {
RzILOpEffect *wb = NULL;
bool wordhigher = insn->id == ARM_INS_RFEDA || insn->id == ARM_INS_RFEIB;
bool increment = insn->id == ARM_INS_RFEIA || insn->id == ARM_INS_RFEIB;
- if (insn->detail->writeback) {
+ if (ISWRITEBACK32()) {
wb = write_reg(REGID(0),
increment ? ADD(DUP(base), U32(8)) : SUB(DUP(base), U32(8)));
if (!wb) {
@@ -2591,7 +2622,6 @@ static RzILOpEffect *write_reg_lane(arm_reg reg, ut32 lane, ut32 vec_size, RzILO
* VFP and NEON
*/
-#if CS_API_MAJOR > 3
/**
* Capstone: ARM_INS_VMOV
* ARM: vmov
@@ -2708,7 +2738,6 @@ static RzILOpEffect *vmov(cs_insn *insn, bool is_thumb) {
return write_reg(REGID(0), val);
}
-#endif
/**
* Capstone: ARM_INS_VMRS
@@ -2997,12 +3026,12 @@ static RzILOpEffect *vtst(cs_insn *insn, bool is_thumb) {
static RzILOpEffect *vldn_multiple_elem(cs_insn *insn, bool is_thumb) {
ut32 mem_idx;
ut32 regs = 0;
- bool wback = insn->detail->writeback;
+ bool wback = ISWRITEBACK32();
bool use_rm_as_wback_offset = false;
ut32 group_sz = insn->id - ARM_INS_VLD1 + 1;
// vldn {list}, [Rn], Rm
- if (ISPOSTINDEX()) {
+ if (ISPOSTINDEX32()) {
use_rm_as_wback_offset = true;
}
regs = OPCOUNT() - 1;
@@ -3020,7 +3049,7 @@ static RzILOpEffect *vldn_multiple_elem(cs_insn *insn, bool is_thumb) {
RzILOpEffect *wback_eff = NULL;
RzILOpEffect *eff = EMPTY();
- RzILOpBitVector *addr = ISPOSTINDEX() ? MEMBASE(mem_idx) : ARG(mem_idx);
+ RzILOpBitVector *addr = ISPOSTINDEX32() ? MEMBASE(mem_idx) : ARG(mem_idx);
for (int i = 0; i < n_groups; ++i) {
for (int j = 0; j < lanes; ++j) {
@@ -3088,13 +3117,12 @@ static RzILOpEffect *vldn_multiple_elem(cs_insn *insn, bool is_thumb) {
return SEQ2(eff, wback_eff);
}
-#if CS_API_MAJOR > 3
static RzILOpEffect *vldn_single_lane(cs_insn *insn, bool is_thumb) {
ut32 mem_idx;
bool use_rm_as_wback_offset = false;
ut32 regs; // number of regs in {list}
- if (ISPOSTINDEX()) {
+ if (ISPOSTINDEX32()) {
use_rm_as_wback_offset = true;
}
regs = OPCOUNT() - 1;
@@ -3107,7 +3135,7 @@ static RzILOpEffect *vldn_single_lane(cs_insn *insn, bool is_thumb) {
RzILOpBitVector *data0, *data1, *data2, *data3;
RzILOpEffect *eff;
- RzILOpBitVector *addr = ISPOSTINDEX() ? MEMBASE(mem_idx) : ARG(mem_idx);
+ RzILOpBitVector *addr = ISPOSTINDEX32() ? MEMBASE(mem_idx) : ARG(mem_idx);
ut32 vreg_idx = 0;
ut32 elem_bits = VVEC_SIZE(insn);
ut32 elem_bytes = elem_bits / 8;
@@ -3159,7 +3187,7 @@ static RzILOpEffect *vldn_single_lane(cs_insn *insn, bool is_thumb) {
return NULL;
}
- bool wback = insn->detail->writeback;
+ bool wback = ISWRITEBACK32();
RzILOpEffect *wback_eff;
if (wback) {
RzILOpBitVector *new_offset = use_rm_as_wback_offset ? MEMINDEX(mem_idx) : UN(32, (ut64)elem_bytes * group_sz);
@@ -3170,14 +3198,13 @@ static RzILOpEffect *vldn_single_lane(cs_insn *insn, bool is_thumb) {
return SEQ2(eff, wback_eff);
}
-#endif
static RzILOpEffect *vldn_all_lane(cs_insn *insn, bool is_thumb) {
ut32 mem_idx;
bool use_rm_as_wback_offset = false;
ut32 regs; // number of regs in {list}
- if (ISPOSTINDEX()) {
+ if (ISPOSTINDEX32()) {
use_rm_as_wback_offset = true;
}
regs = OPCOUNT() - 1;
@@ -3190,7 +3217,7 @@ static RzILOpEffect *vldn_all_lane(cs_insn *insn, bool is_thumb) {
RzILOpBitVector *data0 = NULL, *data1 = NULL, *data2 = NULL, *data3 = NULL;
RzILOpEffect *eff = NULL;
- RzILOpBitVector *addr = ISPOSTINDEX() ? MEMBASE(mem_idx) : ARG(mem_idx);
+ RzILOpBitVector *addr = ISPOSTINDEX32() ? MEMBASE(mem_idx) : ARG(mem_idx);
ut32 elem_bits = VVEC_SIZE(insn);
ut32 elem_bytes = elem_bits / 8;
ut32 addr_bits = REG_WIDTH(mem_idx);
@@ -3244,7 +3271,7 @@ static RzILOpEffect *vldn_all_lane(cs_insn *insn, bool is_thumb) {
return NULL;
}
- bool wback = insn->detail->writeback;
+ bool wback = ISWRITEBACK32();
RzILOpEffect *wback_eff;
if (wback) {
RzILOpBitVector *new_offset = use_rm_as_wback_offset ? MEMINDEX(mem_idx) : UN(32, (ut64)elem_bytes * group_sz);
@@ -3261,12 +3288,10 @@ static RzILOpEffect *vldn(cs_insn *insn, bool is_thumb) {
return NULL;
}
-#if CS_API_MAJOR > 3
// to single lane
if (NEON_LANE(0) != -1) {
return vldn_single_lane(insn, is_thumb);
}
-#endif
// TODO: capstone cannot distinguish details of the following instructions
// vld3.8 {d0, d1, d2}, [r0] (f420040f)
@@ -3278,12 +3303,12 @@ static RzILOpEffect *vldn(cs_insn *insn, bool is_thumb) {
static RzILOpEffect *vstn_multiple_elem(cs_insn *insn, bool is_thumb) {
ut32 mem_idx;
ut32 regs = 0;
- bool wback = insn->detail->writeback;
+ bool wback = ISWRITEBACK32();
bool use_rm_as_wback_offset = false;
ut32 group_sz = insn->id - ARM_INS_VST1 + 1;
// vldn {list}, [Rn], Rm
- if (ISPOSTINDEX()) {
+ if (ISPOSTINDEX32()) {
use_rm_as_wback_offset = true;
}
regs = OPCOUNT() - 1;
@@ -3301,7 +3326,7 @@ static RzILOpEffect *vstn_multiple_elem(cs_insn *insn, bool is_thumb) {
RzILOpEffect *wback_eff = NULL;
RzILOpEffect *eff = EMPTY(), *eff_ = NULL, *eff__ = NULL;
- RzILOpBitVector *addr = ISPOSTINDEX() ? MEMBASE(mem_idx) : ARG(mem_idx);
+ RzILOpBitVector *addr = ISPOSTINDEX32() ? MEMBASE(mem_idx) : ARG(mem_idx);
for (int i = 0; i < n_groups; ++i) {
for (int j = 0; j < lanes; ++j) {
@@ -3365,13 +3390,12 @@ static RzILOpEffect *vstn_multiple_elem(cs_insn *insn, bool is_thumb) {
return SEQ2(eff, wback_eff);
}
-#if CS_API_MAJOR > 3
static RzILOpEffect *vstn_from_single_lane(cs_insn *insn, bool is_thumb) {
ut32 mem_idx;
bool use_rm_as_wback_offset = false;
ut32 regs; // number of regs in {list}
- if (ISPOSTINDEX()) {
+ if (ISPOSTINDEX32()) {
use_rm_as_wback_offset = true;
}
regs = OPCOUNT() - 1;
@@ -3384,7 +3408,7 @@ static RzILOpEffect *vstn_from_single_lane(cs_insn *insn, bool is_thumb) {
RzILOpBitVector *data0, *data1, *data2, *data3;
RzILOpEffect *eff, *eff_, *eff__;
- RzILOpBitVector *addr = ISPOSTINDEX() ? MEMBASE(mem_idx) : ARG(mem_idx);
+ RzILOpBitVector *addr = ISPOSTINDEX32() ? MEMBASE(mem_idx) : ARG(mem_idx);
ut32 vreg_idx = 0;
ut32 elem_bits = VVEC_SIZE(insn);
ut32 elem_bytes = elem_bits / 8;
@@ -3435,7 +3459,7 @@ static RzILOpEffect *vstn_from_single_lane(cs_insn *insn, bool is_thumb) {
return NULL;
}
- bool wback = insn->detail->writeback;
+ bool wback = ISWRITEBACK32();
RzILOpEffect *wback_eff;
if (wback) {
RzILOpBitVector *new_offset = use_rm_as_wback_offset ? MEMINDEX(mem_idx) : UN(32, (ut64)elem_bytes * group_sz);
@@ -3446,18 +3470,15 @@ static RzILOpEffect *vstn_from_single_lane(cs_insn *insn, bool is_thumb) {
return SEQ2(eff, wback_eff);
}
-#endif
static RzILOpEffect *vstn(cs_insn *insn, bool is_thumb) {
if (OPCOUNT() < 2 || !ISREG(0)) {
return NULL;
}
-#if CS_API_MAJOR > 3
if (NEON_LANE(0) != -1) {
return vstn_from_single_lane(insn, is_thumb);
}
-#endif
return vstn_multiple_elem(insn, is_thumb);
}
@@ -3540,6 +3561,37 @@ static inline ut32 cvt_isize(arm_vectordata_type type, bool *is_signed) {
}
}
+#if CS_NEXT_VERSION >= 6
+/**
+ * \brief Tests if the instruction is part of a float supporting
+ * group (NEON, VFP MVEFloat...).
+ *
+ * \param insn The instruction to test.
+ * \return true The instruction is a float instruction.
+ * \return false The instruction is not a float instruction.
+ */
+RZ_IPI bool rz_arm_cs_is_float_insn(const cs_insn *insn) {
+ rz_return_val_if_fail(insn && insn->detail, false);
+ uint32_t i = 0;
+ arm_insn_group group_it = insn->detail->groups[i];
+ while (group_it) {
+ switch (group_it) {
+ default:
+ break;
+ case ARM_FEATURE_HasNEON:
+ case ARM_FEATURE_HasVFP2:
+ case ARM_FEATURE_HasVFP3:
+ case ARM_FEATURE_HasVFP4:
+ case ARM_FEATURE_HasDPVFP:
+ case ARM_FEATURE_HasMVEFloat:
+ return true;
+ }
+ group_it = insn->detail->groups[++i];
+ }
+ return false;
+}
+#endif
+
static RzILOpEffect *try_as_int_cvt(cs_insn *insn, bool is_thumb, bool *success) {
bool is_f2i = false;
bool is_signed = false;
@@ -3555,7 +3607,11 @@ static RzILOpEffect *try_as_int_cvt(cs_insn *insn, bool is_thumb, bool *success)
bv_sz = cvt_isize(VVEC_DT(insn), &is_signed);
ut32 fl_sz = rz_float_get_format_info(is_f2i ? from_fmt : to_fmt, RZ_FLOAT_INFO_TOTAL_LEN);
+#if CS_NEXT_VERSION >= 6
if (!rz_arm_cs_is_group_member(insn, ARM_FEATURE_HasNEON)) {
+#else
+ if (!rz_arm_cs_is_group_member(insn, ARM_GRP_NEON)) {
+#endif
// vfp
// VCVT.F64.S32/U32
,
// VCVT.F32.S32/U32 ,
@@ -3622,7 +3678,6 @@ static RzILOpEffect *vcvt(cs_insn *insn, bool is_thumb) {
return NULL;
}
-#if CS_API_MAJOR > 3
static RzILOpEffect *vdup(cs_insn *insn, bool is_thumb) {
if (OPCOUNT() < 2) {
return NULL;
@@ -3643,7 +3698,6 @@ static RzILOpEffect *vdup(cs_insn *insn, bool is_thumb) {
return eff;
}
-#endif
static RzILOpEffect *vext(cs_insn *insn, bool is_thumb) {
if (OPCOUNT() < 2) {
@@ -3790,7 +3844,11 @@ static RzILOpEffect *vadd(cs_insn *insn, bool is_thumb) {
RzFloatFormat fmt = dt2fmt(dt);
bool is_float_vec = fmt == RZ_FLOAT_UNK ? false : true;
+#if CS_NEXT_VERSION >= 6
if (!rz_arm_cs_is_group_member(insn, ARM_FEATURE_HasNEON)) {
+#else
+ if (!rz_arm_cs_is_group_member(insn, ARM_GRP_NEON)) {
+#endif
// VFP
return write_reg(REGID(0),
F2BV(FADD(RZ_FLOAT_RMODE_RNE,
@@ -3837,7 +3895,11 @@ static RzILOpEffect *vsub(cs_insn *insn, bool is_thumb) {
RzFloatFormat fmt = dt2fmt(dt);
bool is_float_vec = fmt == RZ_FLOAT_UNK ? false : true;
+#if CS_NEXT_VERSION >= 6
if (!rz_arm_cs_is_group_member(insn, ARM_FEATURE_HasNEON)) {
+#else
+ if (!rz_arm_cs_is_group_member(insn, ARM_GRP_NEON)) {
+#endif
// VFP
return write_reg(REGID(0),
F2BV(FSUB(RZ_FLOAT_RMODE_RNE,
@@ -3882,7 +3944,11 @@ static RzILOpEffect *vmul(cs_insn *insn, bool is_thumb) {
arm_vectordata_type dt = VVEC_DT(insn);
RzFloatFormat fmt = dt2fmt(dt);
+#if CS_NEXT_VERSION >= 6
if (!rz_arm_cs_is_group_member(insn, ARM_FEATURE_HasNEON)) {
+#else
+ if (!rz_arm_cs_is_group_member(insn, ARM_GRP_NEON)) {
+#endif
// VFP fmul
return write_reg(REGID(0),
F2BV(FMUL(RZ_FLOAT_RMODE_RNE,
@@ -3979,7 +4045,11 @@ static RzILOpEffect *vabs(cs_insn *insn, bool is_thumb) {
return NULL;
}
- if (rz_arm_cs_is_group_member(insn, ARM_FEATURE_HasNEON)) {
+#if CS_NEXT_VERSION >= 6
+ if (!rz_arm_cs_is_float_insn(insn)) {
+#else
+ if (!rz_arm_cs_is_group_member(insn, ARM_GRP_NEON)) {
+#endif
// not implement
return NULL;
}
@@ -4144,10 +4214,8 @@ static RzILOpEffect *il_unconditional(csh *handle, cs_insn *insn, bool is_thumb)
return clz(insn, is_thumb);
case ARM_INS_SVC:
return svc(insn, is_thumb);
-#if CS_API_MAJOR > 3
case ARM_INS_HVC:
return hvc(insn, is_thumb);
-#endif
case ARM_INS_BFC:
return bfc(insn, is_thumb);
case ARM_INS_BFI:
@@ -4302,11 +4370,9 @@ static RzILOpEffect *il_unconditional(csh *handle, cs_insn *insn, bool is_thumb)
case ARM_INS_VMOVN:
case ARM_INS_VMOVX:
#endif
-#if CS_API_MAJOR > 3
case ARM_INS_VMOV:
case ARM_INS_VMVN:
return vmov(insn, is_thumb);
-#endif
case ARM_INS_VMSR:
return vmsr(insn, is_thumb);
case ARM_INS_VMRS:
@@ -4353,10 +4419,8 @@ static RzILOpEffect *il_unconditional(csh *handle, cs_insn *insn, bool is_thumb)
case ARM_INS_VCVTT:
#endif
return vcvt(insn, is_thumb);
-#if CS_API_MAJOR > 3
case ARM_INS_VDUP:
return vdup(insn, is_thumb);
-#endif
case ARM_INS_VEXT:
return vext(insn, is_thumb);
case ARM_INS_VZIP:
diff --git a/librz/analysis/arch/arm/arm_il64.c b/librz/analysis/arch/arm/arm_il64.c
index 70a29ae230b..645bc6d1104 100644
--- a/librz/analysis/arch/arm/arm_il64.c
+++ b/librz/analysis/arch/arm/arm_il64.c
@@ -1838,15 +1838,11 @@ static RzILOpEffect *mvn(cs_insn *insn) {
RzILOpBitVector *res;
switch (insn->id) {
case ARM64_INS_NEG:
-#if CS_API_MAJOR > 3
case ARM64_INS_NEGS:
-#endif
res = NEG(val);
break;
case ARM64_INS_NGC:
-#if CS_API_MAJOR > 3
case ARM64_INS_NGCS:
-#endif
res = NEG(ADD(val, ITE(VARG("cf"), UN(bits, 0), UN(bits, 1))));
break;
default: // ARM64_INS_MVN
@@ -2652,10 +2648,8 @@ RZ_IPI RzILOpEffect *rz_arm_cs_64_il(csh *handle, cs_insn *insn) {
case ARM64_INS_MVN:
case ARM64_INS_NEG:
case ARM64_INS_NGC:
-#if CS_API_MAJOR > 3
case ARM64_INS_NEGS:
case ARM64_INS_NGCS:
-#endif
return mvn(insn);
case ARM64_INS_RBIT:
return rbit(insn);
diff --git a/librz/analysis/arch/ppc/ppc_il.c b/librz/analysis/arch/ppc/ppc_il.c
index 5bc9662e66e..5c47d7a1eca 100644
--- a/librz/analysis/arch/ppc/ppc_il.c
+++ b/librz/analysis/arch/ppc/ppc_il.c
@@ -60,7 +60,6 @@ RZ_IPI bool ppc_is_x_form(ut32 insn_id) {
case PPC_INS_STDX:
case PPC_INS_STDCX:
case PPC_INS_STWCX:
-#if CS_API_MAJOR > 3
case PPC_INS_LBZCIX:
case PPC_INS_LDCIX:
case PPC_INS_LHZCIX:
@@ -69,7 +68,6 @@ RZ_IPI bool ppc_is_x_form(ut32 insn_id) {
case PPC_INS_STHCIX:
case PPC_INS_STWCIX:
case PPC_INS_STDCIX:
-#endif
return true;
}
}
@@ -101,10 +99,8 @@ RZ_IPI st32 ppc_get_mem_acc_size(ut32 insn_id) {
case PPC_INS_STBU:
case PPC_INS_STBUX:
case PPC_INS_STBX:
-#if CS_API_MAJOR > 3
case PPC_INS_STBCIX:
case PPC_INS_LBZCIX:
-#endif
return PPC_BYTE;
case PPC_INS_LHA:
case PPC_INS_LHAU:
@@ -120,10 +116,8 @@ RZ_IPI st32 ppc_get_mem_acc_size(ut32 insn_id) {
case PPC_INS_STHU:
case PPC_INS_STHUX:
case PPC_INS_STHX:
-#if CS_API_MAJOR > 3
case PPC_INS_LHZCIX:
case PPC_INS_STHCIX:
-#endif
return PPC_HWORD;
case PPC_INS_LWA:
case PPC_INS_LWARX:
@@ -142,10 +136,8 @@ RZ_IPI st32 ppc_get_mem_acc_size(ut32 insn_id) {
case PPC_INS_STWUX:
case PPC_INS_STWX:
case PPC_INS_STMW:
-#if CS_API_MAJOR > 3
case PPC_INS_LWZCIX:
case PPC_INS_STWCIX:
-#endif
return PPC_WORD;
case PPC_INS_LD:
case PPC_INS_LDARX:
@@ -159,10 +151,8 @@ RZ_IPI st32 ppc_get_mem_acc_size(ut32 insn_id) {
case PPC_INS_STDU:
case PPC_INS_STDUX:
case PPC_INS_STDX:
-#if CS_API_MAJOR > 3
case PPC_INS_LDCIX:
case PPC_INS_STDCIX:
-#endif
return PPC_DWORD;
}
}
@@ -277,18 +267,12 @@ RZ_IPI bool ppc_sets_lr(ut32 insn_id) {
case PPC_INS_BGEL:
case PPC_INS_BGELRL:
case PPC_INS_BGELA:
- case PPC_INS_BDNZTL:
- case PPC_INS_BDNZTLA:
case PPC_INS_BDNZL:
case PPC_INS_BDNZLA:
case PPC_INS_BDNZLRL:
case PPC_INS_BDZL:
case PPC_INS_BDZLA:
case PPC_INS_BDZLRL:
- case PPC_INS_BL:
- case PPC_INS_BLA:
- case PPC_INS_BLRL:
- case PPC_INS_BCLA:
case PPC_INS_BDNZTL:
case PPC_INS_BDNZTLA:
case PPC_INS_BDNZFL:
@@ -310,6 +294,7 @@ RZ_IPI bool ppc_sets_lr(ut32 insn_id) {
}
}
+#if CS_NEXT_VERSION >= 6
/**
* \brief Returns true if the given branch instruction is conditional.
*
@@ -320,6 +305,7 @@ RZ_IPI bool ppc_insn_is_conditional(const cs_insn *insn) {
rz_return_val_if_fail(insn, false);
return PPC_DETAIL(insn).bc.pred_cr != PPC_PRED_INVALID || PPC_DETAIL(insn).bc.pred_ctr != PPC_PRED_INVALID;
}
+#endif
/**
* \brief Returns true if the given branch instruction is conditional.
diff --git a/librz/analysis/arch/ppc/ppc_il.h b/librz/analysis/arch/ppc/ppc_il.h
index b603e8ed988..bff9ee544ec 100644
--- a/librz/analysis/arch/ppc/ppc_il.h
+++ b/librz/analysis/arch/ppc/ppc_il.h
@@ -165,7 +165,9 @@ RZ_IPI bool ppc_is_algebraic(ut32 insn_id);
RZ_IPI bool ppc_sets_lr(ut32 insn_id);
RZ_IPI bool ppc_insn_sets_lr(const cs_insn *insn);
RZ_IPI bool ppc_is_conditional(ut32 insn_id);
+#if CS_NEXT_VERSION >= 6
RZ_IPI bool ppc_insn_is_conditional(const cs_insn *insn);
+#endif
RZ_IPI bool ppc_moves_to_spr(ut32 insn_id);
RZ_IPI bool ppc_is_mul_div_d(const ut32 id, const cs_mode mode);
RZ_IPI bool ppc_is_mul_div_u(const ut32 id);
diff --git a/librz/analysis/arch/ppc/ppc_il_ops.c b/librz/analysis/arch/ppc/ppc_il_ops.c
index f39aab2172d..6d14f9e9037 100644
--- a/librz/analysis/arch/ppc/ppc_il_ops.c
+++ b/librz/analysis/arch/ppc/ppc_il_ops.c
@@ -84,12 +84,10 @@ static RzILOpEffect *load_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, cons
case PPC_INS_LWA:
case PPC_INS_LWAX:
case PPC_INS_LWAUX:
-#if CS_API_MAJOR > 3
case PPC_INS_LBZCIX:
case PPC_INS_LHZCIX:
case PPC_INS_LWZCIX:
case PPC_INS_LDCIX:
-#endif
#if CS_NEXT_VERSION >= 6
base = VARG(rA);
#else
@@ -275,12 +273,10 @@ static RzILOpEffect *store_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, con
case PPC_INS_STHUX:
case PPC_INS_STWUX:
case PPC_INS_STDUX:
-#if CS_API_MAJOR > 3
case PPC_INS_STBCIX:
case PPC_INS_STHCIX:
case PPC_INS_STWCIX:
case PPC_INS_STDCIX:
-#endif
#if CS_NEXT_VERSION >= 6
base = VARG(rA);
#else
@@ -365,6 +361,7 @@ static RzILOpEffect *add_sub_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, b
// I/M/Z Immediate, Minus one, Zero extend,
// C/E/S Carry (sets it), Extends (adds carry it), Shift immediate
+#if CS_NEXT_VERSION >= 6
// Handle Add alias
switch (insn->alias_id) {
default:
@@ -374,6 +371,7 @@ static RzILOpEffect *add_sub_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, b
case PPC_INS_ALIAS_LIS: // RT = SI << 16
return SETG(rT, EXTEND(PPC_ARCH_BITS, APPEND(SN(16, sI), U16(0))));
}
+#endif
// EXEC
switch (id) {
@@ -667,7 +665,6 @@ static RzILOpEffect *bitwise_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, c
res = LOGNOT(
(id == PPC_INS_NAND) ? LOGAND(op0, op1) : LOGOR(op0, op1));
break;
-#if CS_API_MAJOR > 3
// Compare bytes
case PPC_INS_CMPB: {
// do n = 0 to (64BIT_CPU ? 7 : 3)
@@ -700,7 +697,6 @@ static RzILOpEffect *bitwise_op(RZ_BORROW csh handle, RZ_BORROW cs_insn *insn, c
return SEQ5(SETL("res", UA(0)), init_n, init_bitmask, loop, SETG(rA, VARL("res")));
}
-#endif
case PPC_INS_EQV:
op0 = VARG(rS);
op1 = VARG(rB);
@@ -945,14 +941,26 @@ static RzILOpEffect *move_from_to_spr_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_MTCTR:
spr_name = "ctr";
break;
+#if CS_NEXT_VERSION < 6
+ case PPC_INS_MFXER:
+ case PPC_INS_MTXER:
+ if (id == PPC_INS_MTXER) {
+ return ppc_set_xer(VARG(rS), mode);
+ }
+ spr_name = "xer";
+ set_val = SETL("val", ppc_get_xer(mode));
+ break;
+#endif
case PPC_INS_MFSPR:
case PPC_INS_MTSPR: {
+#if CS_NEXT_VERSION >= 6
if (insn->alias_id == PPC_INS_ALIAS_MTXER) {
return ppc_set_xer(VARG(rS), mode);
} else if (insn->alias_id == PPC_INS_ALIAS_MFXER) {
set_val = SETL("val", ppc_get_xer(mode));
break;
}
+#endif
ut32 spr = INSOP(1).imm;
switch (spr) {
default:
@@ -1034,6 +1042,7 @@ static RzILOpEffect *move_from_to_spr_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_MFPID:
case PPC_INS_MFTBLO:
case PPC_INS_MFTBHI:
+#if CS_NEXT_VERSION >= 6
case PPC_INS_MFDBATU0:
case PPC_INS_MFDBATL0:
case PPC_INS_MFDBATU1:
@@ -1050,6 +1059,7 @@ static RzILOpEffect *move_from_to_spr_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_MFIBATL2:
case PPC_INS_MFIBATU3:
case PPC_INS_MFIBATL3:
+#endif
case PPC_INS_MFDBATU:
case PPC_INS_MFDBATL:
case PPC_INS_MFIBATU:
@@ -1074,6 +1084,7 @@ static RzILOpEffect *move_from_to_spr_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_MTTBU:
case PPC_INS_MTTBLO:
case PPC_INS_MTTBHI:
+#if CS_NEXT_VERSION >= 6
case PPC_INS_MTDBATU0:
case PPC_INS_MTDBATL0:
case PPC_INS_MTDBATU1:
@@ -1090,6 +1101,7 @@ static RzILOpEffect *move_from_to_spr_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_MTIBATL2:
case PPC_INS_MTIBATU3:
case PPC_INS_MTIBATL3:
+#endif
case PPC_INS_MTDBATU:
case PPC_INS_MTDBATL:
case PPC_INS_MTIBATU:
@@ -1504,12 +1516,10 @@ RZ_IPI RzILOpEffect *rz_ppc_cs_get_il_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_LWZU:
case PPC_INS_LWZUX:
case PPC_INS_LWZX:
-#if CS_API_MAJOR > 3
case PPC_INS_LBZCIX:
case PPC_INS_LHZCIX:
case PPC_INS_LWZCIX:
case PPC_INS_LDCIX:
-#endif
lop = load_op(handle, insn, mode);
break;
case PPC_INS_STB:
@@ -1553,12 +1563,10 @@ RZ_IPI RzILOpEffect *rz_ppc_cs_get_il_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_STXVD2X:
case PPC_INS_STXVW4X:
case PPC_INS_DCBZ:
-#if CS_API_MAJOR > 3
case PPC_INS_STHCIX:
case PPC_INS_STWCIX:
case PPC_INS_STBCIX:
case PPC_INS_STDCIX:
-#endif
lop = store_op(handle, insn, mode);
break;
#if CS_NEXT_VERSION < 6
@@ -1580,9 +1588,11 @@ RZ_IPI RzILOpEffect *rz_ppc_cs_get_il_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
#endif
case PPC_INS_XOR:
case PPC_INS_XORI:
+#if CS_NEXT_VERSION >= 6
if (insn->is_alias && insn->alias_id == PPC_INS_ALIAS_XNOP) {
return NOP();
}
+#endif
// fallthrough
case PPC_INS_XORIS:
case PPC_INS_EQV:
@@ -1593,9 +1603,7 @@ RZ_IPI RzILOpEffect *rz_ppc_cs_get_il_op(RZ_BORROW csh handle, RZ_BORROW cs_insn
case PPC_INS_CNTLZW:
case PPC_INS_POPCNTD:
case PPC_INS_POPCNTW:
-#if CS_API_MAJOR > 3
case PPC_INS_CMPB:
-#endif
#if CS_API_MAJOR == 5
case PPC_INS_CMPRB:
case PPC_INS_CMPEQB:
diff --git a/librz/analysis/arch/x86/common.c b/librz/analysis/arch/x86/common.c
index b4e605e6839..16faae233af 100644
--- a/librz/analysis/arch/x86/common.c
+++ b/librz/analysis/arch/x86/common.c
@@ -81,7 +81,6 @@ const char *x86_registers[X86_REG_ENDING] = {
[X86_REG_DR5] = "dr5",
[X86_REG_DR6] = "dr6",
[X86_REG_DR7] = "dr7",
-#if CS_API_MAJOR >= 4
[X86_REG_DR8] = "dr8",
[X86_REG_DR9] = "dr9",
[X86_REG_DR10] = "dr10",
@@ -90,7 +89,6 @@ const char *x86_registers[X86_REG_ENDING] = {
[X86_REG_DR13] = "dr13",
[X86_REG_DR14] = "dr14",
[X86_REG_DR15] = "dr15",
-#endif
[X86_REG_FP0] = "fp0",
[X86_REG_FP1] = "fp1",
[X86_REG_FP2] = "fp2",
@@ -742,11 +740,6 @@ RzILOpPure *x86_il_get_operand_bits(X86Op op, int analysis_bits, ut64 pc, int im
return SN(op.size * BITS_PER_BYTE, op.imm);
case X86_OP_MEM:
return LOADW(BITS_PER_BYTE * op.size, x86_il_get_memaddr_bits(op.mem, analysis_bits, pc));
-#if CS_API_MAJOR <= 3
- case X86_OP_FP:
- RZ_LOG_WARN("RzIL: x86: Floating point instructions not implemented yet\n");
- return NULL;
-#endif
default:
return NULL;
}
diff --git a/librz/analysis/p/analysis_arm_cs.c b/librz/analysis/p/analysis_arm_cs.c
index d3f41565ef4..0e2ce3a7edd 100644
--- a/librz/analysis/p/analysis_arm_cs.c
+++ b/librz/analysis/p/analysis_arm_cs.c
@@ -14,6 +14,46 @@
#include "../arch/arm/arm_accessors64.h"
#include "../../asm/arch/arm/arm_it.h"
+#if CS_NEXT_VERSION < 6
+inline static const char *ARMCondCodeToString(arm_cc cc) {
+ switch (cc) {
+ default:
+ assert(0 && "Unknown condition code");
+ return "";
+ case ARM_CC_EQ:
+ return "eq";
+ case ARM_CC_NE:
+ return "ne";
+ case ARM_CC_HS:
+ return "hs";
+ case ARM_CC_LO:
+ return "lo";
+ case ARM_CC_MI:
+ return "mi";
+ case ARM_CC_PL:
+ return "pl";
+ case ARM_CC_VS:
+ return "vs";
+ case ARM_CC_VC:
+ return "vc";
+ case ARM_CC_HI:
+ return "hi";
+ case ARM_CC_LS:
+ return "ls";
+ case ARM_CC_GE:
+ return "ge";
+ case ARM_CC_LT:
+ return "lt";
+ case ARM_CC_GT:
+ return "gt";
+ case ARM_CC_LE:
+ return "le";
+ case ARM_CC_AL:
+ return "al";
+ }
+}
+#endif
+
typedef struct arm_cs_context_t {
RzArmITContext it;
csh handle;
@@ -238,7 +278,11 @@ static void opex(RzStrBuf *buf, csh handle, cs_insn *insn) {
if (x->update_flags) {
pj_kb(pj, "update_flags", true);
}
+#if CS_NEXT_VERSION >= 6
if (insn->detail->writeback) {
+#else
+ if (x->writeback) {
+#endif
pj_kb(pj, "writeback", true);
}
if (x->vector_size) {
@@ -253,9 +297,15 @@ static void opex(RzStrBuf *buf, csh handle, cs_insn *insn) {
if (x->cps_flag != ARM_CPSFLAG_INVALID) {
pj_ki(pj, "cps_flag", x->cps_flag);
}
+#if CS_NEXT_VERSION >= 6
if (x->cc != ARMCC_UNDEF && x->cc != ARMCC_AL) {
pj_ks(pj, "cc", ARMCondCodeToString(x->cc));
}
+#else
+ if (x->cc != ARM_CC_INVALID && x->cc != ARM_CC_AL) {
+ pj_ks(pj, "cc", ARMCondCodeToString(x->cc));
+ }
+#endif
if (x->mem_barrier != ARM_MB_RESERVED_0) {
pj_ki(pj, "mem_barrier", x->mem_barrier - 1);
}
@@ -515,31 +565,31 @@ static void opex64(RzStrBuf *buf, csh handle, cs_insn *insn) {
}
static int cond_cs2r2_32(int cc) {
- if (cc == ARMCC_AL || cc < 0) {
+ if (cc == CS_ARMCC(AL) || cc < 0) {
cc = RZ_TYPE_COND_AL;
} else {
switch (cc) {
- case ARMCC_EQ: cc = RZ_TYPE_COND_EQ; break;
- case ARMCC_NE: cc = RZ_TYPE_COND_NE; break;
- case ARMCC_HS: cc = RZ_TYPE_COND_HS; break;
- case ARMCC_LO: cc = RZ_TYPE_COND_LO; break;
- case ARMCC_MI: cc = RZ_TYPE_COND_MI; break;
- case ARMCC_PL: cc = RZ_TYPE_COND_PL; break;
- case ARMCC_VS: cc = RZ_TYPE_COND_VS; break;
- case ARMCC_VC: cc = RZ_TYPE_COND_VC; break;
- case ARMCC_HI: cc = RZ_TYPE_COND_HI; break;
- case ARMCC_LS: cc = RZ_TYPE_COND_LS; break;
- case ARMCC_GE: cc = RZ_TYPE_COND_GE; break;
- case ARMCC_LT: cc = RZ_TYPE_COND_LT; break;
- case ARMCC_GT: cc = RZ_TYPE_COND_GT; break;
- case ARMCC_LE: cc = RZ_TYPE_COND_LE; break;
+ case CS_ARMCC(EQ): cc = RZ_TYPE_COND_EQ; break;
+ case CS_ARMCC(NE): cc = RZ_TYPE_COND_NE; break;
+ case CS_ARMCC(HS): cc = RZ_TYPE_COND_HS; break;
+ case CS_ARMCC(LO): cc = RZ_TYPE_COND_LO; break;
+ case CS_ARMCC(MI): cc = RZ_TYPE_COND_MI; break;
+ case CS_ARMCC(PL): cc = RZ_TYPE_COND_PL; break;
+ case CS_ARMCC(VS): cc = RZ_TYPE_COND_VS; break;
+ case CS_ARMCC(VC): cc = RZ_TYPE_COND_VC; break;
+ case CS_ARMCC(HI): cc = RZ_TYPE_COND_HI; break;
+ case CS_ARMCC(LS): cc = RZ_TYPE_COND_LS; break;
+ case CS_ARMCC(GE): cc = RZ_TYPE_COND_GE; break;
+ case CS_ARMCC(LT): cc = RZ_TYPE_COND_LT; break;
+ case CS_ARMCC(GT): cc = RZ_TYPE_COND_GT; break;
+ case CS_ARMCC(LE): cc = RZ_TYPE_COND_LE; break;
}
}
return cc;
}
static int cond_cs2r2_64(int cc) {
- if (cc == ARMCC_AL || cc < 0) {
+ if (cc == ARM64_CC_AL || cc < 0) {
cc = RZ_TYPE_COND_AL;
} else {
switch (cc) {
@@ -571,10 +621,8 @@ static void anop64(ArmCSContext *ctx, RzAnalysisOp *op, cs_insn *insn) {
op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
} else if (cs_insn_group(handle, insn, ARM64_GRP_CRC)) {
op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
-#if CS_API_MAJOR >= 4
} else if (cs_insn_group(handle, insn, ARM64_GRP_PRIVILEGE)) {
op->family = RZ_ANALYSIS_OP_FAMILY_PRIV;
-#endif
} else if (cs_insn_group(handle, insn, ARM64_GRP_NEON)) {
op->family = RZ_ANALYSIS_OP_FAMILY_MMX;
} else if (cs_insn_group(handle, insn, ARM64_GRP_FPARMV8)) {
@@ -807,9 +855,7 @@ static void anop64(ArmCSContext *ctx, RzAnalysisOp *op, cs_insn *insn) {
op->type = RZ_ANALYSIS_OP_TYPE_SAR;
break;
case ARM64_INS_NEG:
-#if CS_API_MAJOR > 3
case ARM64_INS_NEGS:
-#endif
op->type = RZ_ANALYSIS_OP_TYPE_NOT;
break;
case ARM64_INS_FCMP:
@@ -891,7 +937,7 @@ static void anop64(ArmCSContext *ctx, RzAnalysisOp *op, cs_insn *insn) {
}
if (REGID(0) == ARM_REG_PC) {
op->type = RZ_ANALYSIS_OP_TYPE_UJMP;
- if (insn->detail->arm.cc != ARMCC_AL) {
+ if (insn->detail->arm.cc != CS_ARMCC(AL)) {
// op->type = RZ_ANALYSIS_OP_TYPE_MCJMP;
op->type = RZ_ANALYSIS_OP_TYPE_UCJMP;
}
@@ -1016,17 +1062,17 @@ static void anop32(RzAnalysis *a, csh handle, RzAnalysisOp *op, cs_insn *insn, b
return;
}
op->cycles = 1;
+
/* grab family */
+#if CS_NEXT_VERSION >= 6
if (cs_insn_group(handle, insn, ARM_FEATURE_HasAES)) {
op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
} else if (cs_insn_group(handle, insn, ARM_FEATURE_HasCRC)) {
op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
-#if CS_API_MAJOR >= 4
} else if (cs_insn_group(handle, insn, ARM_GRP_PRIVILEGE)) {
op->family = RZ_ANALYSIS_OP_FAMILY_PRIV;
} else if (cs_insn_group(handle, insn, ARM_FEATURE_HasVirtualization)) {
op->family = RZ_ANALYSIS_OP_FAMILY_VIRT;
-#endif
} else if (cs_insn_group(handle, insn, ARM_FEATURE_HasNEON)) {
op->family = RZ_ANALYSIS_OP_FAMILY_MMX;
} else if (cs_insn_group(handle, insn, ARM_FEATURE_HasFPARMv8)) {
@@ -1037,6 +1083,21 @@ static void anop32(RzAnalysis *a, csh handle, RzAnalysisOp *op, cs_insn *insn, b
} else {
op->family = RZ_ANALYSIS_OP_FAMILY_CPU;
}
+#else
+ if (cs_insn_group(handle, insn, ARM64_GRP_CRYPTO)) {
+ op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
+ } else if (cs_insn_group(handle, insn, ARM64_GRP_CRC)) {
+ op->family = RZ_ANALYSIS_OP_FAMILY_CRYPTO;
+ } else if (cs_insn_group(handle, insn, ARM64_GRP_PRIVILEGE)) {
+ op->family = RZ_ANALYSIS_OP_FAMILY_PRIV;
+ } else if (cs_insn_group(handle, insn, ARM64_GRP_NEON)) {
+ op->family = RZ_ANALYSIS_OP_FAMILY_MMX;
+ } else if (cs_insn_group(handle, insn, ARM64_GRP_FPARMV8)) {
+ op->family = RZ_ANALYSIS_OP_FAMILY_FPU;
+ } else {
+ op->family = RZ_ANALYSIS_OP_FAMILY_CPU;
+ }
+#endif
if (insn->id != ARM_INS_IT) {
rz_arm_it_update_nonblock(&ctx->it, insn);
@@ -1103,7 +1164,7 @@ jmp $$ + 4 + ( [delta] * 2 )
for (i = 0; i < insn->detail->arm.op_count; i++) {
if (insn->detail->arm.operands[i].type == ARM_OP_REG &&
insn->detail->arm.operands[i].reg == ARM_REG_PC) {
- if (insn->detail->arm.cc == ARMCC_AL) {
+ if (insn->detail->arm.cc == CS_ARMCC(AL)) {
op->type = RZ_ANALYSIS_OP_TYPE_RET;
} else {
op->type = RZ_ANALYSIS_OP_TYPE_CRET;
@@ -1148,7 +1209,7 @@ jmp $$ + 4 + ( [delta] * 2 )
op->type = RZ_ANALYSIS_OP_TYPE_ADD;
if (REGID(0) == ARM_REG_PC) {
op->type = RZ_ANALYSIS_OP_TYPE_UJMP;
- if (REGID(1) == ARM_REG_PC && insn->detail->arm.cc != ARMCC_AL) {
+ if (REGID(1) == ARM_REG_PC && insn->detail->arm.cc != CS_ARMCC(AL)) {
// op->type = RZ_ANALYSIS_OP_TYPE_RCJMP;
op->type = RZ_ANALYSIS_OP_TYPE_UCJMP;
op->fail = addr + op->size;
@@ -1331,7 +1392,7 @@ jmp $$ + 4 + ( [delta] * 2 )
op->disp = MEMDISP(1);
if (REGID(0) == ARM_REG_PC) {
op->type = RZ_ANALYSIS_OP_TYPE_UJMP;
- if (insn->detail->arm.cc != ARMCC_AL) {
+ if (insn->detail->arm.cc != CS_ARMCC(AL)) {
// op->type = RZ_ANALYSIS_OP_TYPE_MCJMP;
op->type = RZ_ANALYSIS_OP_TYPE_UCJMP;
}
@@ -1354,7 +1415,7 @@ jmp $$ + 4 + ( [delta] * 2 )
} else if (REGBASE(1) == ARM_REG_PC) {
op->ptr = (addr & ~3LL) + (thumb ? 4 : 8) + MEMDISP(1);
op->refptr = 4;
- if (REGID(0) == ARM_REG_PC && insn->detail->arm.cc != ARMCC_AL) {
+ if (REGID(0) == ARM_REG_PC && insn->detail->arm.cc != CS_ARMCC(AL)) {
// op->type = RZ_ANALYSIS_OP_TYPE_MCJMP;
op->type = RZ_ANALYSIS_OP_TYPE_UCJMP;
op->fail = addr + op->size;
@@ -1407,10 +1468,14 @@ jmp $$ + 4 + ( [delta] * 2 )
case ARM_INS_B:
/* b.cc label */
op->cycles = 4;
+#if CS_NEXT_VERSION >= 6
if (insn->detail->arm.cc == ARMCC_UNDEF) {
+#else
+ if (insn->detail->arm.cc == ARM_CC_INVALID) {
+#endif
op->type = RZ_ANALYSIS_OP_TYPE_ILL;
op->fail = addr + op->size;
- } else if (insn->detail->arm.cc == ARMCC_AL) {
+ } else if (insn->detail->arm.cc == CS_ARMCC(AL)) {
op->type = RZ_ANALYSIS_OP_TYPE_JMP;
op->fail = UT64_MAX;
} else {
@@ -1606,9 +1671,7 @@ static void set_src_dst(RzAnalysisValue *val, RzReg *reg, csh *handle, cs_insn *
break;
case ARM_OP_MEM:
val->type = RZ_ANALYSIS_VAL_MEM;
-#if CS_API_MAJOR > 3
val->mul = armop.mem.scale << armop.mem.lshift;
-#endif
#if CS_NEXT_VERSION == 6
val->delta = MEMDISP(x);
#else
@@ -1658,7 +1721,6 @@ static void op_fillval(RzAnalysis *analysis, RzAnalysisOp *op, csh handle, cs_in
case RZ_ANALYSIS_OP_TYPE_ROL:
case RZ_ANALYSIS_OP_TYPE_CAST:
for (i = 1; i < count; i++) {
-#if CS_API_MAJOR > 3
if (bits == 64) {
cs_arm64_op arm64op = INSOP64(i);
if (arm64op.access == CS_AC_WRITE) {
@@ -1671,7 +1733,6 @@ static void op_fillval(RzAnalysis *analysis, RzAnalysisOp *op, csh handle, cs_in
continue;
}
}
-#endif
break;
}
for (j = 0; j < 3; j++, i++) {
@@ -1750,7 +1811,9 @@ static int analysis_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *bu
if (ctx->handle == 0) {
ret = (a->bits == 64) ? cs_open(CS_ARCH_ARM64, mode, &ctx->handle) : cs_open(CS_ARCH_ARM, mode, &ctx->handle);
cs_option(ctx->handle, CS_OPT_DETAIL, CS_OPT_ON);
+#if CS_NEXT_VERSION >= 6
cs_option(ctx->handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_CS_REG_ALIAS);
+#endif
if (ret != CS_ERR_OK) {
ctx->handle = 0;
return -1;
diff --git a/librz/analysis/p/analysis_m680x_cs.c b/librz/analysis/p/analysis_m680x_cs.c
index 97e10b8b15b..c6805f87f5f 100644
--- a/librz/analysis/p/analysis_m680x_cs.c
+++ b/librz/analysis/p/analysis_m680x_cs.c
@@ -5,21 +5,6 @@
#include
#include
-#if CS_API_MAJOR >= 4 && CS_API_MINOR >= 0
-#define CAPSTONE_HAS_M680X 1
-#else
-#define CAPSTONE_HAS_M680X 0
-#endif
-
-#if !CAPSTONE_HAS_M680X
-#ifdef _MSC_VER
-#pragma message("Cannot find support for m680x in capstone")
-#else
-#warning Cannot find capstone-m680x support
-#endif
-#endif
-
-#if CAPSTONE_HAS_M680X
#include
static int m680xmode(const char *str) {
@@ -538,15 +523,6 @@ RzAnalysisPlugin rz_analysis_plugin_m680x_cs = {
.bits = 16 | 32,
.op = &analyze_op,
};
-#else
-RzAnalysisPlugin rz_analysis_plugin_m680x_cs = {
- .name = "m680x (unsupported)",
- .desc = "Capstone M680X analyzer (unsupported)",
- .license = "BSD",
- .arch = "m680x",
- .bits = 32,
-};
-#endif
#ifndef RZ_PLUGIN_INCORE
RZ_API RzLibStruct rizin_plugin = {
diff --git a/librz/analysis/p/analysis_m68k_cs.c b/librz/analysis/p/analysis_m68k_cs.c
index 67fcd4dda91..e227087d955 100644
--- a/librz/analysis/p/analysis_m68k_cs.c
+++ b/librz/analysis/p/analysis_m68k_cs.c
@@ -32,19 +32,12 @@ static inline ut64 make_64bits_address(ut64 address) {
}
static inline void handle_branch_instruction(RzAnalysisOp *op, ut64 addr, cs_m68k *m68k, ut32 type, int index) {
-#if CS_API_MAJOR >= 4
if (m68k->operands[index].type == M68K_OP_BR_DISP) {
op->type = type;
// TODO: disp_size is ignored
op->jump = make_64bits_address(addr + m68k->operands[index].br_disp.disp + 2);
op->fail = make_64bits_address(addr + op->size);
}
-#else
- op->type = type;
- // TODO: disp_size is ignored
- op->jump = make_64bits_address(addr + m68k->operands[index].br_disp.disp + 2);
- op->fail = make_64bits_address(addr + op->size);
-#endif
}
static inline void handle_jump_instruction(RzAnalysisOp *op, ut64 addr, cs_m68k *m68k, ut32 type) {
diff --git a/librz/analysis/p/analysis_mips_cs.c b/librz/analysis/p/analysis_mips_cs.c
index 1b994580a34..ca14cef7c41 100644
--- a/librz/analysis/p/analysis_mips_cs.c
+++ b/librz/analysis/p/analysis_mips_cs.c
@@ -733,9 +733,7 @@ static int analyze_op(RzAnalysis *analysis, RzAnalysisOp *op, ut64 addr, const u
} else if (!strcmp(analysis->cpu, "v3")) {
mode |= CS_MODE_MIPS3;
} else if (!strcmp(analysis->cpu, "v2")) {
-#if CS_API_MAJOR > 3
mode |= CS_MODE_MIPS2;
-#endif
}
}
switch (analysis->bits) {
diff --git a/librz/analysis/p/analysis_ppc_cs.c b/librz/analysis/p/analysis_ppc_cs.c
index 83dd3353d09..8e3a40fcb32 100644
--- a/librz/analysis/p/analysis_ppc_cs.c
+++ b/librz/analysis/p/analysis_ppc_cs.c
@@ -956,7 +956,9 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
return -1;
}
cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
+#if CS_NEXT_VERSION >= 6
cs_option(handle, CS_OPT_DETAIL, CS_OPT_DETAIL_REAL);
+#endif
}
op->size = 4;
@@ -981,9 +983,7 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
op->size = insn->size;
op->id = insn->id;
switch (insn->id) {
-#if CS_API_MAJOR >= 4
case PPC_INS_CMPB:
-#endif
case PPC_INS_CMPD:
case PPC_INS_CMPDI:
case PPC_INS_CMPLD:
@@ -1137,9 +1137,7 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
esilprintf(op, "%s,%s,=[8],%s=", ARG(0), op1, op1);
break;
case PPC_INS_LBZ:
-#if CS_API_MAJOR >= 4
case PPC_INS_LBZCIX:
-#endif
case PPC_INS_LBZU:
case PPC_INS_LBZUX:
op->type = RZ_ANALYSIS_OP_TYPE_LOAD;
@@ -1155,9 +1153,7 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
break;
case PPC_INS_LD:
case PPC_INS_LDARX:
-#if CS_API_MAJOR >= 4
case PPC_INS_LDCIX:
-#endif
case PPC_INS_LDU:
case PPC_INS_LDUX:
op->type = RZ_ANALYSIS_OP_TYPE_LOAD;
@@ -1208,9 +1204,7 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
case PPC_INS_LWAUX:
case PPC_INS_LWAX:
case PPC_INS_LWZ:
-#if CS_API_MAJOR >= 4
case PPC_INS_LWZCIX:
-#endif
case PPC_INS_LWZX:
op->type = RZ_ANALYSIS_OP_TYPE_LOAD;
esilprintf(op, "%s,%s,=", ARG2(1, "[4]"), ARG(0));
@@ -1467,7 +1461,13 @@ static int analyze_op(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
esilprintf(op, "3,%s,&,", cs_reg_name(handle, insn->detail->ppc.bc.crX));
#else
case PPC_BC_LE:
- esilprintf(op, "3,%s,&,", cs_reg_name(handle, insn->detail->ppc.bc.crX));
+ /* 0b01 == equal
+ * 0b10 == less than */
+ if (ARG(1)[0] == '\0') {
+ esilprintf(op, "3,cr0,&,?{,%s,pc,=,},", ARG(0));
+ } else {
+ esilprintf(op, "3,%s,&,?{,%s,pc,=,},", ARG(0), ARG(1));
+ }
#endif
break;
#if CS_NEXT_VERSION >= 6
diff --git a/librz/analysis/p/analysis_x86_cs.c b/librz/analysis/p/analysis_x86_cs.c
index c9caa2d0297..8d050cc092c 100644
--- a/librz/analysis/p/analysis_x86_cs.c
+++ b/librz/analysis/p/analysis_x86_cs.c
@@ -88,13 +88,11 @@ static void hidden_op(cs_insn *insn, cs_x86 *x, int mode) {
op->type = X86_OP_REG;
op->reg = X86_REG_EFLAGS;
op->size = regsz;
-#if CS_API_MAJOR >= 4
if (id == X86_INS_PUSHF || id == X86_INS_PUSHFD || id == X86_INS_PUSHFQ) {
op->access = 1;
} else {
op->access = 2;
}
-#endif
break;
case X86_INS_PUSHAW:
case X86_INS_PUSHAL:
@@ -122,9 +120,7 @@ static void opex(RzStrBuf *buf, X86CSContext *ctx, int mode) {
cs_x86_op *op = x->operands + i;
pj_o(pj);
pj_ki(pj, "size", op->size);
-#if CS_API_MAJOR >= 4
pj_ki(pj, "rw", op->access); // read, write, read|write
-#endif
switch (op->type) {
case X86_OP_REG:
pj_ks(pj, "type", "reg");
@@ -250,10 +246,6 @@ static char *getarg(struct Getarg *gop, int n, int set, char *setop, int sel, ut
*bitsize = op.size * 8;
}
switch (op.type) {
-#if CS_API_MAJOR == 3
- case X86_OP_FP:
- return "invalid";
-#endif
case X86_OP_INVALID:
return "invalid";
case X86_OP_REG:
@@ -435,9 +427,7 @@ static void anop_esil(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
case X86_INS_FPREM:
case X86_INS_FPREM1:
case X86_INS_FPTAN:
-#if CS_API_MAJOR >= 4
case X86_INS_FFREEP:
-#endif
case X86_INS_FRNDINT:
case X86_INS_FRSTOR:
case X86_INS_FNSAVE:
@@ -518,9 +508,7 @@ static void anop_esil(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf
case X86_INS_CLAC:
case X86_INS_CLGI:
case X86_INS_CLTS:
-#if CS_API_MAJOR >= 4
case X86_INS_CLWB:
-#endif
case X86_INS_STAC:
case X86_INS_STGI:
break;
@@ -1909,7 +1897,6 @@ static void set_access_info(RzReg *reg, RzAnalysisOp *op, csh *handle, cs_insn *
val->reg = cs_reg2reg(reg, handle, ip);
rz_list_append(ret, val);
-#if CS_API_MAJOR >= 4
// Register access info
cs_regs regs_read, regs_write;
ut8 read_count, write_count;
@@ -1933,7 +1920,6 @@ static void set_access_info(RzReg *reg, RzAnalysisOp *op, csh *handle, cs_insn *
}
}
}
-#endif
switch (insn->id) {
case X86_INS_PUSH:
@@ -2011,7 +1997,6 @@ static void set_access_info(RzReg *reg, RzAnalysisOp *op, csh *handle, cs_insn *
if (INSOP(i).type == X86_OP_MEM) {
val = rz_analysis_value_new();
val->type = RZ_ANALYSIS_VAL_MEM;
-#if CS_API_MAJOR >= 4
switch (INSOP(i).access) {
case CS_AC_READ:
val->access = RZ_ANALYSIS_ACC_R;
@@ -2023,9 +2008,6 @@ static void set_access_info(RzReg *reg, RzAnalysisOp *op, csh *handle, cs_insn *
val->access = RZ_ANALYSIS_ACC_UNKNOWN;
break;
}
-#else
- val->access = RZ_ANALYSIS_ACC_UNKNOWN;
-#endif
val->mul = INSOP(i).mem.scale;
val->delta = INSOP(i).mem.disp;
if (INSOP(0).mem.base == X86_REG_RIP ||
@@ -2259,9 +2241,7 @@ static void anop(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf, int
case X86_INS_FPREM:
case X86_INS_FPREM1:
case X86_INS_FPTAN:
-#if CS_API_MAJOR >= 4
case X86_INS_FFREEP:
-#endif
case X86_INS_FRNDINT:
case X86_INS_FRSTOR:
case X86_INS_FNSAVE:
@@ -2356,9 +2336,7 @@ static void anop(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf, int
case X86_INS_CLAC:
case X86_INS_CLGI:
case X86_INS_CLTS:
-#if CS_API_MAJOR >= 4
case X86_INS_CLWB:
-#endif
case X86_INS_STAC:
case X86_INS_STGI:
op->type = RZ_ANALYSIS_OP_TYPE_MOV;
@@ -2470,9 +2448,7 @@ static void anop(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf, int
case X86_INS_PCMPGTQ:
case X86_INS_PCMPISTRI:
case X86_INS_PCMPISTRM:
-#if CS_API_MAJOR >= 4
case X86_INS_VPCMPB:
-#endif
case X86_INS_VPCMPD:
case X86_INS_VPCMPEQB:
case X86_INS_VPCMPEQD:
@@ -2487,15 +2463,11 @@ static void anop(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf, int
case X86_INS_VPCMPISTRI:
case X86_INS_VPCMPISTRM:
case X86_INS_VPCMPQ:
-#if CS_API_MAJOR >= 4
case X86_INS_VPCMPUB:
-#endif
case X86_INS_VPCMPUD:
case X86_INS_VPCMPUQ:
-#if CS_API_MAJOR >= 4
case X86_INS_VPCMPUW:
case X86_INS_VPCMPW:
-#endif
op->type = RZ_ANALYSIS_OP_TYPE_CMP;
op->family = RZ_ANALYSIS_OP_FAMILY_SSE;
break;
@@ -2731,9 +2703,7 @@ static void anop(RzAnalysis *a, RzAnalysisOp *op, ut64 addr, const ut8 *buf, int
op->stackptr = -regsz;
op->cycles = CYCLE_MEM + CYCLE_JMP;
break;
-#if CS_API_MAJOR >= 4
case X86_INS_UD0:
-#endif
case X86_INS_UD2:
#if CS_API_MAJOR == 4
case X86_INS_UD2B:
diff --git a/librz/asm/arch/arm/arm_it.c b/librz/asm/arch/arm/arm_it.c
index 9c326c20a1f..09b189fcd9f 100644
--- a/librz/asm/arch/arm/arm_it.c
+++ b/librz/asm/arch/arm/arm_it.c
@@ -28,13 +28,56 @@ RZ_API void rz_arm_it_context_fini(RzArmITContext *ctx) {
ht_uu_free(ctx->ht_itcond);
}
+#if CS_NEXT_VERSION < 6
+inline static arm_cc ARMCC_getOppositeCondition(arm_cc cc) {
+ switch (cc) {
+ default:
+ // llvm_unreachable("Unknown condition code");
+ assert(0);
+ return ARM_CC_INVALID;
+ case ARM_CC_EQ:
+ return ARM_CC_NE;
+ case ARM_CC_NE:
+ return ARM_CC_EQ;
+ case ARM_CC_HS:
+ return ARM_CC_LO;
+ case ARM_CC_LO:
+ return ARM_CC_HS;
+ case ARM_CC_MI:
+ return ARM_CC_PL;
+ case ARM_CC_PL:
+ return ARM_CC_MI;
+ case ARM_CC_VS:
+ return ARM_CC_VC;
+ case ARM_CC_VC:
+ return ARM_CC_VS;
+ case ARM_CC_HI:
+ return ARM_CC_LS;
+ case ARM_CC_LS:
+ return ARM_CC_HI;
+ case ARM_CC_GE:
+ return ARM_CC_LT;
+ case ARM_CC_LT:
+ return ARM_CC_GE;
+ case ARM_CC_GT:
+ return ARM_CC_LE;
+ case ARM_CC_LE:
+ return ARM_CC_GT;
+ }
+}
+#endif
+
/**
* Signal a newly detected IT block
* \p insn must be ARM_INS_IT
*/
RZ_API void rz_arm_it_update_block(RzArmITContext *ctx, cs_insn *insn) {
+#if CS_NEXT_VERSION >= 6
rz_return_if_fail(ctx && insn && (insn->id == ARM_INS_IT || insn->id == ARM_INS_VPT));
bool is_vpt = insn->id == ARM_INS_VPT;
+#else
+ rz_return_if_fail(ctx && insn && (insn->id == ARM_INS_IT));
+#endif
bool found;
ht_uu_find(ctx->ht_itblock, insn->address, &found);
if (found) {
@@ -50,6 +93,7 @@ RZ_API void rz_arm_it_update_block(RzArmITContext *ctx, cs_insn *insn) {
ArmCSITCond cond = { 0 };
cond.off = block.off[i - 1] = 2 * i;
switch (insn->mnemonic[i]) {
+#if CS_NEXT_VERSION >= 6
case 0x74: //'t'
cond.cond = is_vpt ? insn->detail->arm.vcc : insn->detail->arm.cc;
break;
@@ -62,10 +106,26 @@ RZ_API void rz_arm_it_update_block(RzArmITContext *ctx, cs_insn *insn) {
cond.cond = ARMCC_getOppositeCondition(insn->detail->arm.cc);
}
break;
+#else
+ case 0x74: //'t'
+ cond.cond = insn->detail->arm.cc;
+ break;
+ case 0x65: //'e'
+ if (insn->detail->arm.cc == ARM_CC_AL) {
+ cond.cond = ARM_CC_AL;
+ } else {
+ cond.cond = ARMCC_getOppositeCondition(insn->detail->arm.cc);
+ }
+ break;
+#endif
default:
break;
}
+#if CS_NEXT_VERSION >= 6
cond.vpt = is_vpt ? 1 : 0;
+#else
+ cond.vpt = 0;
+#endif
RZ_STATIC_ASSERT(sizeof(cond) == sizeof(cond.packed));
ht_uu_update(ctx->ht_itcond, insn->address + cond.off, cond.packed);
}
@@ -100,11 +160,15 @@ RZ_API bool rz_arm_it_apply_cond(RzArmITContext *ctx, cs_insn *insn) {
if (!found) {
return false;
}
+#if CS_NEXT_VERSION >= 6
if (cond.vpt) {
insn->detail->arm.vcc = cond.cond;
} else {
insn->detail->arm.cc = cond.cond;
}
+#else
+ insn->detail->arm.cc = cond.cond;
+#endif
insn->detail->arm.update_flags = 0;
// Readjust if we detected that the previous assumption of all-2-byte instructions in
diff --git a/librz/asm/p/asm_arm_cs.c b/librz/asm/p/asm_arm_cs.c
index 4151d32eb35..fa1ac56864b 100644
--- a/librz/asm/p/asm_arm_cs.c
+++ b/librz/asm/p/asm_arm_cs.c
@@ -16,6 +16,46 @@ typedef struct arm_cs_context_t {
int obits;
} ArmCSContext;
+#if CS_NEXT_VERSION < 6
+inline static const char *ARMCondCodeToString(arm_cc cc) {
+ switch (cc) {
+ default:
+ assert(0 && "Unknown condition code");
+ return "";
+ case ARM_CC_EQ:
+ return "eq";
+ case ARM_CC_NE:
+ return "ne";
+ case ARM_CC_HS:
+ return "hs";
+ case ARM_CC_LO:
+ return "lo";
+ case ARM_CC_MI:
+ return "mi";
+ case ARM_CC_PL:
+ return "pl";
+ case ARM_CC_VS:
+ return "vs";
+ case ARM_CC_VC:
+ return "vc";
+ case ARM_CC_HI:
+ return "hi";
+ case ARM_CC_LS:
+ return "ls";
+ case ARM_CC_GE:
+ return "ge";
+ case ARM_CC_LT:
+ return "lt";
+ case ARM_CC_GT:
+ return "gt";
+ case ARM_CC_LE:
+ return "le";
+ case ARM_CC_AL:
+ return "al";
+ }
+}
+#endif
+
bool arm64ass(const char *str, ut64 addr, ut32 *op);
static bool check_features(RzAsm *a, cs_insn *insn) {
@@ -27,9 +67,15 @@ static bool check_features(RzAsm *a, cs_insn *insn) {
for (i = 0; i < insn->detail->groups_count; i++) {
int id = insn->detail->groups[i];
switch (id) {
+#if CS_NEXT_VERSION >= 6
case ARM_FEATURE_IsARM:
case ARM_FEATURE_IsThumb:
case ARM_FEATURE_IsThumb2:
+#else
+ case ARM_GRP_ARM:
+ case ARM_GRP_THUMB:
+ case ARM_GRP_THUMB2:
+#endif
continue;
default:
if (id < 128) {
@@ -92,7 +138,9 @@ static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len) {
}
}
cs_option(ctx->cd, CS_OPT_SYNTAX, (a->syntax == RZ_ASM_SYNTAX_REGNUM) ? CS_OPT_SYNTAX_NOREGNAME : CS_OPT_SYNTAX_DEFAULT);
+#if CS_NEXT_VERSION >= 6
cs_option(ctx->cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_CS_REG_ALIAS);
+#endif
cs_option(ctx->cd, CS_OPT_DETAIL, (a->features && *a->features) ? CS_OPT_ON : CS_OPT_OFF);
cs_option(ctx->cd, CS_OPT_DETAIL, CS_OPT_ON);
if (!buf) {
@@ -119,7 +167,11 @@ static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len) {
}
if (op && !op->size) {
op->size = insn->size;
+#if CS_NEXT_VERSION >= 6
if (insn->id == ARM_INS_IT || insn->id == ARM_INS_VPT) {
+#else
+ if (insn->id == ARM_INS_IT) {
+#endif
rz_arm_it_update_block(&ctx->it, insn);
} else {
rz_arm_it_update_nonblock(&ctx->it, insn);
diff --git a/librz/asm/p/asm_m680x_cs.c b/librz/asm/p/asm_m680x_cs.c
index 07c70891f24..6aaa83591f2 100644
--- a/librz/asm/p/asm_m680x_cs.c
+++ b/librz/asm/p/asm_m680x_cs.c
@@ -5,14 +5,6 @@
#include
#include
-#if CS_API_MAJOR >= 4 && CS_API_MINOR >= 0
-#define CAPSTONE_HAS_M680X 1
-#else
-#define CAPSTONE_HAS_M680X 0
-#endif
-
-#if CAPSTONE_HAS_M680X
-
static csh cd = 0;
static int m680xmode(const char *str) {
@@ -104,16 +96,6 @@ RzAsmPlugin rz_asm_plugin_m680x_cs = {
.disassemble = &disassemble,
};
-#else
-RzAsmPlugin rz_asm_plugin_m680x_cs = {
- .name = "m680x",
- .desc = "Capstone M680X Disassembler (Not supported)",
- .license = "BSD",
- .arch = "m680x",
- .bits = 8 | 32,
-};
-#endif
-
#ifndef RZ_PLUGIN_INCORE
RZ_API RzLibStruct rizin_plugin = {
.type = RZ_LIB_TYPE_ASM,
diff --git a/librz/asm/p/asm_mips_cs.c b/librz/asm/p/asm_mips_cs.c
index 0cd1edd2952..7753e752afc 100644
--- a/librz/asm/p/asm_mips_cs.c
+++ b/librz/asm/p/asm_mips_cs.c
@@ -25,9 +25,7 @@ static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len) {
} else if (!strcmp(a->cpu, "v3")) {
mode |= CS_MODE_MIPS3;
} else if (!strcmp(a->cpu, "v2")) {
-#if CS_API_MAJOR > 3
mode |= CS_MODE_MIPS2;
-#endif
}
}
mode |= (a->bits == 64) ? CS_MODE_MIPS64 : CS_MODE_MIPS32;
diff --git a/librz/asm/p/asm_x86_cs.c b/librz/asm/p/asm_x86_cs.c
index 1bd15da809e..b3a1e78541e 100644
--- a/librz/asm/p/asm_x86_cs.c
+++ b/librz/asm/p/asm_x86_cs.c
@@ -51,13 +51,9 @@ static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len) {
}
// always unsigned immediates (kernel addresses)
// maybe rizin should have an option for this too?
-#if CS_API_MAJOR >= 4
cs_option(cd, CS_OPT_UNSIGNED, CS_OPT_ON);
-#endif
if (a->syntax == RZ_ASM_SYNTAX_MASM) {
-#if CS_API_MAJOR >= 4
cs_option(cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_MASM);
-#endif
} else if (a->syntax == RZ_ASM_SYNTAX_ATT) {
cs_option(cd, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
} else {
diff --git a/meson_options.txt b/meson_options.txt
index 3f463091bc0..e51701f7686 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -20,7 +20,7 @@ option('rizin_bindings', type: 'string', value: '', description: 'Path where riz
option('checks_level', type: 'integer', value: 9999, description: 'Value between 0 and 3 to enable different level of assert (see RZ_CHECKS_LEVEL). By default its value depends on buildtype (2 on debug, 1 on release).')
option('use_sys_capstone', type: 'feature', value: 'disabled')
-option('use_capstone_version', type: 'combo', choices: ['v3', 'v4', 'v5', 'next'], value: 'next', description: 'Specify which version of capstone to use')
+option('use_capstone_version', type: 'combo', choices: ['v4', 'v5', 'next'], value: 'next', description: 'Specify which version of capstone to use')
option('use_sys_magic', type: 'feature', value: 'disabled')
option('use_sys_libzip', type: 'feature', value: 'disabled')
option('use_sys_libzip_openssl', type: 'boolean', value: false, description: 'Whether to use or not system openssl dependency to build libzip')
diff --git a/subprojects/capstone-next.wrap b/subprojects/capstone-next.wrap
index 820104cdfdf..d94540dae98 100644
--- a/subprojects/capstone-next.wrap
+++ b/subprojects/capstone-next.wrap
@@ -1,5 +1,5 @@
[wrap-git]
url = https://github.com/capstone-engine/capstone.git
-revision = 1fc1011d669c893ecd7cb107d3a8e4976ff10e19
+revision = 46154e8605aaefdcca5fecf4ea88b92db5a40ad3
directory = capstone-next
patch_directory = capstone-next
diff --git a/subprojects/capstone-v3.wrap b/subprojects/capstone-v3.wrap
deleted file mode 100644
index e99a2565532..00000000000
--- a/subprojects/capstone-v3.wrap
+++ /dev/null
@@ -1,6 +0,0 @@
-[wrap-file]
-source_url = https://github.com/capstone-engine/capstone/archive/3.0.5.tar.gz
-source_filename = 3.0.5.tar.gz
-source_hash = 913dd695e7c5a2b972a6f427cb31f2e93677ec1c38f39dda37d18a91c70b6df1
-patch_directory = capstone-3.0.5
-directory = capstone-3.0.5
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm.h
deleted file mode 100644
index 67b4901a6df..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../arm.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm64.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm64.h
deleted file mode 100644
index 44f29981b45..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/arm64.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../arm64.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/capstone.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/capstone.h
deleted file mode 100644
index 873639e3ddb..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/capstone.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../capstone.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/mips.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/mips.h
deleted file mode 100644
index 412f0782a11..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/mips.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../mips.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/platform.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/platform.h
deleted file mode 100644
index a24b29b2f31..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/platform.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../platform.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/ppc.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/ppc.h
deleted file mode 100644
index 70222922f2b..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/ppc.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../ppc.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/sparc.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/sparc.h
deleted file mode 100644
index f3010b1ead3..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/sparc.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../sparc.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/systemz.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/systemz.h
deleted file mode 100644
index 8584378a32a..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/systemz.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../systemz.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/x86.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/x86.h
deleted file mode 100644
index dc4bfe07787..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/x86.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../x86.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/include/capstone/xcore.h b/subprojects/packagefiles/capstone-3.0.5/include/capstone/xcore.h
deleted file mode 100644
index 7320f2f6b34..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/include/capstone/xcore.h
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-FileCopyrightText: 2022 hamari
-// SPDX-License-Identifier: LGPL-3.0-only
-
-#include "../xcore.h"
diff --git a/subprojects/packagefiles/capstone-3.0.5/meson.build b/subprojects/packagefiles/capstone-3.0.5/meson.build
deleted file mode 100644
index 70c35888265..00000000000
--- a/subprojects/packagefiles/capstone-3.0.5/meson.build
+++ /dev/null
@@ -1,81 +0,0 @@
-project('capstone', 'c', version: '3.0.5', meson_version: '>=0.55.0')
-
-cs_files = [
- 'arch/AArch64/AArch64BaseInfo.c',
- 'arch/AArch64/AArch64Disassembler.c',
- 'arch/AArch64/AArch64InstPrinter.c',
- 'arch/AArch64/AArch64Mapping.c',
- 'arch/AArch64/AArch64Module.c',
- 'arch/ARM/ARMDisassembler.c',
- 'arch/ARM/ARMInstPrinter.c',
- 'arch/ARM/ARMMapping.c',
- 'arch/ARM/ARMModule.c',
- 'arch/Mips/MipsDisassembler.c',
- 'arch/Mips/MipsInstPrinter.c',
- 'arch/Mips/MipsMapping.c',
- 'arch/Mips/MipsModule.c',
- 'arch/PowerPC/PPCDisassembler.c',
- 'arch/PowerPC/PPCInstPrinter.c',
- 'arch/PowerPC/PPCMapping.c',
- 'arch/PowerPC/PPCModule.c',
- 'arch/Sparc/SparcDisassembler.c',
- 'arch/Sparc/SparcInstPrinter.c',
- 'arch/Sparc/SparcMapping.c',
- 'arch/Sparc/SparcModule.c',
- 'arch/SystemZ/SystemZDisassembler.c',
- 'arch/SystemZ/SystemZInstPrinter.c',
- 'arch/SystemZ/SystemZMapping.c',
- 'arch/SystemZ/SystemZMCTargetDesc.c',
- 'arch/SystemZ/SystemZModule.c',
- 'arch/X86/X86ATTInstPrinter.c',
- 'arch/X86/X86Disassembler.c',
- 'arch/X86/X86DisassemblerDecoder.c',
- 'arch/X86/X86IntelInstPrinter.c',
- 'arch/X86/X86Mapping.c',
- 'arch/X86/X86Module.c',
- 'arch/XCore/XCoreDisassembler.c',
- 'arch/XCore/XCoreInstPrinter.c',
- 'arch/XCore/XCoreMapping.c',
- 'arch/XCore/XCoreModule.c',
- 'cs.c',
- 'MCInst.c',
- 'MCInstrDesc.c',
- 'MCRegisterInfo.c',
- 'SStream.c',
- 'utils.c',
-]
-
-capstone_includes = [include_directories('include')]
-
-libcapstone_c_args = [
- '-DCAPSTONE_X86_ATT_DISABLE_NO',
- '-DCAPSTONE_X86_REDUCE_NO',
- '-DCAPSTONE_USE_SYS_DYN_MEM',
- '-DCAPSTONE_DIET_NO',
- '-DCAPSTONE_HAS_ARM',
- '-DCAPSTONE_HAS_ARM64',
- '-DCAPSTONE_HAS_M68K',
- '-DCAPSTONE_HAS_M680X',
- '-DCAPSTONE_HAS_MIPS',
- '-DCAPSTONE_HAS_POWERPC',
- '-DCAPSTONE_HAS_SPARC',
- '-DCAPSTONE_HAS_SYSZ',
- '-DCAPSTONE_HAS_X86',
- '-DCAPSTONE_HAS_XCORE',
- '-DCAPSTONE_HAS_TMS320C64X',
-]
-warn_trunc_flag = '-Wno-error=stringop-truncation'
-if meson.get_compiler('c').has_argument(warn_trunc_flag)
- libcapstone_c_args += warn_trunc_flag
-endif
-
-libcapstone = library('capstone', cs_files,
- c_args: libcapstone_c_args,
- include_directories: capstone_includes,
- implicit_include_directories: false
-)
-
-capstone_dep = declare_dependency(
- link_with: libcapstone,
- include_directories: capstone_includes
-)