Skip to content

Commit 2ed6a26

Browse files
committed
More rust cleanup
- Added unit tests for MLIL and HLIL - "Fixed" MLIL, LLIL, and HLIL having issues regarding Instruction vs Expression indexes - Renamed CallingConvention to CoreCallingConvention and removed architecture generic - Renamed CallingConventionBase to CallingConvention - Simplified calling convention code and fixed some bugs with implicit registers - Added impl Debug to MLIL and HLIL instructions Still need to at some point add an Expression to MLIL and HLIL. We also might want to look into having the Instruction kind just return the expression kind.
1 parent da1b04d commit 2ed6a26

30 files changed

+862
-704
lines changed

arch/riscv/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use binaryninja::{
1515
UnusedRegisterStackInfo,
1616
},
1717
binary_view::{BinaryView, BinaryViewExt},
18-
calling_convention::{register_calling_convention, CallingConventionBase, ConventionBuilder},
18+
calling_convention::{register_calling_convention, CallingConvention, ConventionBuilder},
1919
custom_binary_view::{BinaryViewType, BinaryViewTypeExt},
2020
disassembly::{InstructionTextToken, InstructionTextTokenKind},
2121
function::Function,
@@ -2670,7 +2670,7 @@ impl<D: 'static + RiscVDisassembler + Send + Sync> RiscVCC<D> {
26702670
}
26712671
}
26722672

2673-
impl<D: 'static + RiscVDisassembler + Send + Sync> CallingConventionBase for RiscVCC<D> {
2673+
impl<D: 'static + RiscVDisassembler + Send + Sync> CallingConvention for RiscVCC<D> {
26742674
type Arch = RiscVArch<D>;
26752675

26762676
fn caller_saved_registers(&self) -> Vec<Register<D>> {

plugins/pdb-ng/src/parser.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::symbol_parser::{ParsedDataSymbol, ParsedProcedure, ParsedSymbol};
2525
use crate::type_parser::ParsedType;
2626
use binaryninja::architecture::{Architecture, CoreArchitecture};
2727
use binaryninja::binary_view::{BinaryView, BinaryViewExt};
28-
use binaryninja::calling_convention::CallingConvention;
28+
use binaryninja::calling_convention::CoreCallingConvention;
2929
use binaryninja::confidence::{Conf, MIN_CONFIDENCE};
3030
use binaryninja::debuginfo::{DebugFunctionInfo, DebugInfo};
3131
use binaryninja::platform::Platform;
@@ -48,11 +48,11 @@ pub struct PDBParserInstance<'a, S: Source<'a> + 'a> {
4848
/// Default arch of self.bv
4949
pub(crate) arch: CoreArchitecture,
5050
/// Default calling convention for self.arch
51-
pub(crate) default_cc: Ref<CallingConvention<CoreArchitecture>>,
51+
pub(crate) default_cc: Ref<CoreCallingConvention>,
5252
/// Thiscall calling convention for self.bv, or default_cc if we can't find one
53-
pub(crate) thiscall_cc: Ref<CallingConvention<CoreArchitecture>>,
53+
pub(crate) thiscall_cc: Ref<CoreCallingConvention>,
5454
/// Cdecl calling convention for self.bv, or default_cc if we can't find one
55-
pub(crate) cdecl_cc: Ref<CallingConvention<CoreArchitecture>>,
55+
pub(crate) cdecl_cc: Ref<CoreCallingConvention>,
5656
/// Default platform of self.bv
5757
pub(crate) platform: Ref<Platform>,
5858
/// pdb-rs structure for making lifetime hell a real place

plugins/pdb-ng/src/type_parser.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ use std::sync::OnceLock;
1818
use crate::struct_grouper::group_structure;
1919
use crate::PDBParserInstance;
2020
use anyhow::{anyhow, Result};
21-
use binaryninja::architecture::{Architecture, CoreArchitecture};
21+
use binaryninja::architecture::Architecture;
2222
use binaryninja::binary_view::BinaryViewExt;
23-
use binaryninja::calling_convention::CallingConvention;
23+
use binaryninja::calling_convention::CoreCallingConvention;
2424
use binaryninja::confidence::{Conf, MAX_CONFIDENCE};
2525
use binaryninja::platform::Platform;
2626
use binaryninja::rc::Ref;
@@ -2084,7 +2084,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
20842084
pub(crate) fn find_calling_convention(
20852085
platform: &Platform,
20862086
name: &str,
2087-
) -> Option<Ref<CallingConvention<CoreArchitecture>>> {
2087+
) -> Option<Ref<CoreCallingConvention>> {
20882088
platform
20892089
.calling_conventions()
20902090
.iter()
@@ -2093,10 +2093,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
20932093
}
20942094

20952095
/// Convert pdb calling convention enum to binja
2096-
fn cv_call_t_to_calling_convention(
2097-
&self,
2098-
cv: u8,
2099-
) -> Option<Ref<CallingConvention<CoreArchitecture>>> {
2096+
fn cv_call_t_to_calling_convention(&self, cv: u8) -> Option<Ref<CoreCallingConvention>> {
21002097
match CV_call_t::try_from(cv) {
21012098
Ok(CV_call_t::NEAR_FAST) | Ok(CV_call_t::FAR_FAST) => {
21022099
self.platform.get_fastcall_calling_convention()

plugins/warp/src/convert.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::HashSet;
33
use binaryninja::architecture::Architecture as BNArchitecture;
44
use binaryninja::architecture::ArchitectureExt;
55
use binaryninja::binary_view::{BinaryView, BinaryViewExt};
6-
use binaryninja::calling_convention::CallingConvention as BNCallingConvention;
6+
use binaryninja::calling_convention::CoreCallingConvention as BNCallingConvention;
77
use binaryninja::confidence::{Conf as BNConf, MAX_CONFIDENCE};
88
use binaryninja::rc::Ref as BNRef;
99
use binaryninja::symbol::{Symbol as BNSymbol, SymbolType as BNSymbolType};
@@ -348,17 +348,15 @@ pub fn from_bn_type_internal(
348348
}
349349
}
350350

351-
pub fn from_bn_calling_convention<A: BNArchitecture>(
352-
raw_cc: BNRef<BNCallingConvention<A>>,
353-
) -> CallingConvention {
351+
pub fn from_bn_calling_convention(raw_cc: BNRef<BNCallingConvention>) -> CallingConvention {
354352
// NOTE: Currently calling convention just stores the name.
355353
CallingConvention::new(raw_cc.name().as_str())
356354
}
357355

358356
pub fn to_bn_calling_convention<A: BNArchitecture>(
359357
arch: &A,
360358
calling_convention: &CallingConvention,
361-
) -> BNRef<BNCallingConvention<A>> {
359+
) -> BNRef<BNCallingConvention> {
362360
for cc in &arch.calling_conventions() {
363361
if cc.name().as_str() == calling_convention.name {
364362
return cc.clone();
File renamed without changes.

rust/examples/mlil.rs renamed to rust/examples/medium_level_il.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ mod visitor {
7777
}
7878
Float(float) => {
7979
print_indent(indent);
80-
println!("int {:e}", float);
80+
println!("float {:e}", float);
8181
}
8282
Expr(expr) => print_il_expr(&expr, indent),
8383
Var(var) => {
@@ -135,6 +135,10 @@ mod visitor {
135135
}
136136
ConstantData(_) => println!("contantdata"),
137137
Intrinsic(intrinsic) => println!("intrinsic {}", intrinsic.name()),
138+
InstructionIndex(idx) => {
139+
print_indent(indent);
140+
println!("index {}", idx);
141+
}
138142
}
139143
}
140144
}

rust/src/architecture.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use binaryninjacore_sys::*;
2020
use std::fmt::{Debug, Formatter};
2121

2222
use crate::{
23-
calling_convention::CallingConvention,
23+
calling_convention::CoreCallingConvention,
2424
data_buffer::DataBuffer,
2525
disassembly::InstructionTextToken,
2626
low_level_il::{MutableLiftedILExpr, MutableLiftedILFunction},
@@ -1897,7 +1897,7 @@ impl Architecture for CoreArchitecture {
18971897

18981898
macro_rules! cc_func {
18991899
($get_name:ident, $get_api:ident, $set_name:ident, $set_api:ident) => {
1900-
fn $get_name(&self) -> Option<Ref<CallingConvention<Self>>> {
1900+
fn $get_name(&self) -> Option<Ref<CoreCallingConvention>> {
19011901
let arch = self.as_ref();
19021902

19031903
unsafe {
@@ -1906,12 +1906,15 @@ macro_rules! cc_func {
19061906
if cc.is_null() {
19071907
None
19081908
} else {
1909-
Some(CallingConvention::ref_from_raw(cc, self.handle()))
1909+
Some(CoreCallingConvention::ref_from_raw(
1910+
cc,
1911+
self.as_ref().handle(),
1912+
))
19101913
}
19111914
}
19121915
}
19131916

1914-
fn $set_name(&self, cc: &CallingConvention<Self>) {
1917+
fn $set_name(&self, cc: &CoreCallingConvention) {
19151918
let arch = self.as_ref();
19161919

19171920
assert!(
@@ -1939,12 +1942,12 @@ pub trait ArchitectureExt: Architecture {
19391942
}
19401943
}
19411944

1942-
fn calling_conventions(&self) -> Array<CallingConvention<Self>> {
1945+
fn calling_conventions(&self) -> Array<CoreCallingConvention> {
19431946
unsafe {
19441947
let mut count = 0;
19451948
let calling_convs =
19461949
BNGetArchitectureCallingConventions(self.as_ref().handle, &mut count);
1947-
Array::new(calling_convs, count, self.handle())
1950+
Array::new(calling_convs, count, self.as_ref().handle())
19481951
}
19491952
}
19501953

0 commit comments

Comments
 (0)