Skip to content

Commit c29729b

Browse files
committed
Factor out some fields in BNInstructionInfo
1 parent 9c8d4ea commit c29729b

File tree

3 files changed

+47
-59
lines changed

3 files changed

+47
-59
lines changed

binaryninjacore.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,15 +1738,20 @@ extern "C"
17381738
void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount);
17391739
} BNCustomTransform;
17401740

1741+
typedef struct BNBranchInfo
1742+
{
1743+
BNBranchType branchType;
1744+
uint64_t branchTarget;
1745+
BNArchitecture* branchArch; // If null, same architecture as instruction
1746+
} BNBranchInfo;
1747+
17411748
typedef struct BNInstructionInfo
17421749
{
17431750
size_t length;
17441751
size_t branchCount;
17451752
bool archTransitionByTargetAddr;
17461753
uint8_t delaySlots;
1747-
BNBranchType branchType[BN_MAX_INSTRUCTION_BRANCHES];
1748-
uint64_t branchTarget[BN_MAX_INSTRUCTION_BRANCHES];
1749-
BNArchitecture* branchArch[BN_MAX_INSTRUCTION_BRANCHES]; // If null, same architecture as instruction
1754+
BNBranchInfo branchInfo[BN_MAX_INSTRUCTION_BRANCHES];
17501755
} BNInstructionInfo;
17511756

17521757
typedef enum BNRelocationType

python/architecture.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -654,15 +654,15 @@ def _get_instruction_info(self, ctxt, data, addr, max_len, result):
654654
result[0].branchCount = len(info.branches)
655655
for i in range(0, len(info.branches)):
656656
if isinstance(info.branches[i].type, str):
657-
result[0].branchType[i] = BranchType[info.branches[i].type.name]
657+
result[0].branchInfo[i].branchType = BranchType[info.branches[i].type.name]
658658
else:
659-
result[0].branchType[i] = info.branches[i].type
660-
result[0].branchTarget[i] = info.branches[i].target
659+
result[0].branchInfo[i].branchType = info.branches[i].type
660+
result[0].branchInfo[i].branchTarget = info.branches[i].target
661661
arch = info.branches[i].arch
662662
if arch is None:
663-
result[0].branchArch[i] = None
663+
result[0].branchInfo[i].branchArch = None
664664
else:
665-
result[0].branchArch[i] = arch.handle
665+
result[0].branchInfo[i].branchArch = arch.handle
666666
return True
667667
except:
668668
log_error(traceback.format_exc())
@@ -2376,13 +2376,12 @@ def get_instruction_info(self, data: bytes, addr: int) -> Optional[InstructionIn
23762376
result.length = info.length
23772377
result.arch_transition_by_target_addr = info.archTransitionByTargetAddr
23782378
result.branch_delay = info.delaySlots
2379-
for i in range(0, info.branchCount):
2380-
target = info.branchTarget[i]
2381-
if info.branchArch[i]:
2382-
arch = CoreArchitecture._from_cache(info.branchArch[i])
2379+
for branch_info in info.branchInfo:
2380+
if branch_info.branchArch:
2381+
arch = CoreArchitecture._from_cache(branch_info.branchArch)
23832382
else:
23842383
arch = None
2385-
result.add_branch(BranchType(info.branchType[i]), target, arch)
2384+
result.add_branch(BranchType(branch_info.branchType), branch_info.branchTarget, arch)
23862385
return result
23872386

23882387
def get_instruction_text(self, data: bytes, addr: int) -> Optional[Tuple[List['function.InstructionTextToken'], int]]:

rust/src/architecture.rs

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -144,19 +144,23 @@ impl BranchInfo {
144144
}
145145
}
146146

147-
impl From<BranchInfo> for BNBranchType {
147+
impl From<BranchInfo> for BNBranchInfo {
148148
fn from(value: BranchInfo) -> Self {
149-
match value.kind {
150-
BranchKind::Unresolved => BNBranchType::UnresolvedBranch,
151-
BranchKind::Unconditional(_) => BNBranchType::UnconditionalBranch,
152-
BranchKind::False(_) => BNBranchType::FalseBranch,
153-
BranchKind::True(_) => BNBranchType::TrueBranch,
154-
BranchKind::Call(_) => BNBranchType::CallDestination,
155-
BranchKind::FunctionReturn => BNBranchType::FunctionReturn,
156-
BranchKind::SystemCall => BNBranchType::SystemCall,
157-
BranchKind::Indirect => BNBranchType::IndirectBranch,
158-
BranchKind::Exception => BNBranchType::ExceptionBranch,
159-
BranchKind::UserDefined => BNBranchType::UserDefinedBranch,
149+
Self {
150+
branchType: match value.kind {
151+
BranchKind::Unresolved => BNBranchType::UnresolvedBranch,
152+
BranchKind::Unconditional(_) => BNBranchType::UnconditionalBranch,
153+
BranchKind::False(_) => BNBranchType::FalseBranch,
154+
BranchKind::True(_) => BNBranchType::TrueBranch,
155+
BranchKind::Call(_) => BNBranchType::CallDestination,
156+
BranchKind::FunctionReturn => BNBranchType::FunctionReturn,
157+
BranchKind::SystemCall => BNBranchType::SystemCall,
158+
BranchKind::Indirect => BNBranchType::IndirectBranch,
159+
BranchKind::Exception => BNBranchType::ExceptionBranch,
160+
BranchKind::UserDefined => BNBranchType::UserDefinedBranch,
161+
},
162+
branchTarget: value.target().unwrap_or_default(),
163+
branchArch: value.arch.map(|a| a.handle).unwrap_or(std::ptr::null_mut()),
160164
}
161165
}
162166
}
@@ -207,13 +211,16 @@ impl InstructionInfo {
207211

208212
impl From<BNInstructionInfo> for InstructionInfo {
209213
fn from(value: BNInstructionInfo) -> Self {
210-
// TODO: This is quite ugly, but we destructure the branch info so this will have to do.
211214
let mut branch_info = [None; NUM_BRANCH_INFO];
212-
#[allow(clippy::needless_range_loop)]
213-
for i in 0..value.branchCount.min(NUM_BRANCH_INFO) {
214-
let branch_target = value.branchTarget[i];
215+
for (i, info) in value
216+
.branchInfo
217+
.iter()
218+
.take(value.branchCount.min(NUM_BRANCH_INFO))
219+
.enumerate()
220+
{
221+
let branch_target = info.branchTarget;
215222
branch_info[i] = Some(BranchInfo {
216-
kind: match value.branchType[i] {
223+
kind: match info.branchType {
217224
BNBranchType::UnconditionalBranch => BranchKind::Unconditional(branch_target),
218225
BNBranchType::FalseBranch => BranchKind::False(branch_target),
219226
BNBranchType::TrueBranch => BranchKind::True(branch_target),
@@ -225,10 +232,10 @@ impl From<BNInstructionInfo> for InstructionInfo {
225232
BNBranchType::UnresolvedBranch => BranchKind::Unresolved,
226233
BNBranchType::UserDefinedBranch => BranchKind::UserDefined,
227234
},
228-
arch: if value.branchArch[i].is_null() {
235+
arch: if info.branchArch.is_null() {
229236
None
230237
} else {
231-
Some(unsafe { CoreArchitecture::from_raw(value.branchArch[i]) })
238+
Some(unsafe { CoreArchitecture::from_raw(info.branchArch) })
232239
},
233240
});
234241
}
@@ -244,38 +251,15 @@ impl From<BNInstructionInfo> for InstructionInfo {
244251
impl From<InstructionInfo> for BNInstructionInfo {
245252
fn from(value: InstructionInfo) -> Self {
246253
let branch_count = value.branches.into_iter().filter(Option::is_some).count();
247-
// TODO: This is quite ugly, but we destructure the branch info so this will have to do.
248-
let branch_info_0 = value.branches[0].unwrap_or_default();
249-
let branch_info_1 = value.branches[1].unwrap_or_default();
250-
let branch_info_2 = value.branches[2].unwrap_or_default();
251254
Self {
252255
length: value.length,
253256
branchCount: branch_count,
254257
archTransitionByTargetAddr: value.arch_transition_by_target_addr,
255258
delaySlots: value.delay_slots,
256-
branchType: [
257-
branch_info_0.into(),
258-
branch_info_1.into(),
259-
branch_info_2.into(),
260-
],
261-
branchTarget: [
262-
branch_info_0.target().unwrap_or_default(),
263-
branch_info_1.target().unwrap_or_default(),
264-
branch_info_2.target().unwrap_or_default(),
265-
],
266-
branchArch: [
267-
branch_info_0
268-
.arch
269-
.map(|a| a.handle)
270-
.unwrap_or(std::ptr::null_mut()),
271-
branch_info_1
272-
.arch
273-
.map(|a| a.handle)
274-
.unwrap_or(std::ptr::null_mut()),
275-
branch_info_2
276-
.arch
277-
.map(|a| a.handle)
278-
.unwrap_or(std::ptr::null_mut()),
259+
branchInfo: [
260+
value.branches[0].unwrap_or_default().into(),
261+
value.branches[1].unwrap_or_default().into(),
262+
value.branches[2].unwrap_or_default().into(),
279263
],
280264
}
281265
}

0 commit comments

Comments
 (0)