From 8e0b04edac3865e29eea5f953fdf4b6761231a59 Mon Sep 17 00:00:00 2001 From: pancake Date: Fri, 30 Oct 2026 18:55:17 +0100 Subject: [PATCH] Fix build with radare2 ABI 168 basic block vectors --- src/PcodeFixupPreprocessor.cpp | 9 +++------ src/R2Utils.h | 14 ++++++++++++++ src/core_ghidra.cpp | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/PcodeFixupPreprocessor.cpp b/src/PcodeFixupPreprocessor.cpp index 46b301a5..2b62a166 100644 --- a/src/PcodeFixupPreprocessor.cpp +++ b/src/PcodeFixupPreprocessor.cpp @@ -132,10 +132,7 @@ static bool is_indirect_reg_call(RAnalOp *op) { static void walk_bb_regflow(RCore *core, RAnalFunction *fn, const std::unordered_map &defs, const std::function &)> &onOp) { - RListIter *iter; - void *pos; - r_list_foreach (fn->bbs, iter, pos) { - RAnalBlock *bb = reinterpret_cast (pos); + r_anal_function_bbs_foreach_cpp (fn, [&](RAnalBlock *bb) { std::unordered_map regs; for (int i = 0; i < bb->ninstr; i++) { ut64 at = r_anal_bb_opaddr_i (bb, i); @@ -156,7 +153,7 @@ static void walk_bb_regflow(RCore *core, RAnalFunction *fn, } r_anal_op_free (op); } - } + }); } void PcodeFixupPreprocessor::fixupSharedReturnJumpToRelocs(RAnalFunction *r2Func, Funcdata *ghFunc, RCore *core, R2Architecture &arch) { @@ -213,7 +210,7 @@ static bool has_data_xref_at(RCore *core, ut64 addr) { void PcodeFixupPreprocessor::fixupNoreturnCallsBeforeData(RAnalFunction *r2Func, Funcdata *ghFunc, RCore *core, R2Architecture &arch) { auto space = arch.getDefaultCodeSpace (); const ut64 fcnMax = r_anal_function_max_addr (r2Func); - r_list_foreach_cpp (r2Func->bbs, [&](RAnalBlock *bb) { + r_anal_function_bbs_foreach_cpp (r2Func, [&](RAnalBlock *bb) { ut64 addr = bb->addr; const ut64 bbend = bb->addr + bb->size; while (addr < bbend) { diff --git a/src/R2Utils.h b/src/R2Utils.h index 6a8fec13..9d6386b3 100644 --- a/src/R2Utils.h +++ b/src/R2Utils.h @@ -4,6 +4,9 @@ #ifndef R2GHIDRA_R2UTILS_H #define R2GHIDRA_R2UTILS_H +#include +#include + typedef struct r_list_t RList; typedef struct r_list_iter_t RListIter; @@ -13,6 +16,17 @@ template void r_list_foreach_cpp(RList *list, const F &c } } +template void r_anal_function_bbs_foreach_cpp(RAnalFunction *function, const F &cb) { +#if R2_ABIVERSION >= 168 + RAnalBlock **it; + R_VEC_FOREACH (&function->bbs, it) { + cb (*it); + } +#else + r_list_foreach_cpp (function->bbs, cb); +#endif +} + template void r_interval_tree_foreach_cpp(RIntervalTree *tree, const F &cb) { RIntervalTreeIter it; for (it = r_rbtree_first (&(tree)->root->node); r_rbtree_iter_has (&it); r_rbtree_iter_next (&(it))) { diff --git a/src/core_ghidra.cpp b/src/core_ghidra.cpp index afa9f9aa..3811b9ad 100644 --- a/src/core_ghidra.cpp +++ b/src/core_ghidra.cpp @@ -210,7 +210,7 @@ static void seedGlobalPointerRegister(R2Architecture &arch, RCore *core, RAnalFu } AddrSpace *space = arch.getDefaultCodeSpace (); ContextDatabase *cdb = arch.getContextDatabase (); - r_list_foreach_cpp (function->bbs, [&](RAnalBlock *bb) { + r_anal_function_bbs_foreach_cpp (function, [&](RAnalBlock *bb) { TrackedSet &tset = cdb->createSet (Address (space, bb->addr), Address (space, bb->addr + bb->size)); tset.push_back ({ reg, value }); });