Skip to content

Commit 39b1a74

Browse files
committed
Remove NonSSAVariant bound from LowLevelILFunction in Rust API
We don't do enough with the lifted il != non lifted il to justify the bound. This makes modifying IL much less work as the historical lifted il bound is gone.
1 parent c604548 commit 39b1a74

File tree

19 files changed

+202
-293
lines changed

19 files changed

+202
-293
lines changed

arch/msp430/src/architecture.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use binaryninja::architecture::{
2020
BranchKind, FlagClassId, FlagGroupId, FlagId, FlagWriteId, RegisterId,
2121
};
2222
use binaryninja::low_level_il::expression::ValueExpr;
23-
use binaryninja::low_level_il::{MutableLiftedILExpr, MutableLiftedILFunction};
23+
use binaryninja::low_level_il::{LowLevelILMutableExpression, LowLevelILMutableFunction};
2424
use log::error;
2525

2626
const MIN_MNEMONIC: usize = 9;
@@ -194,7 +194,7 @@ impl Architecture for Msp430 {
194194
&self,
195195
data: &[u8],
196196
addr: u64,
197-
il: &MutableLiftedILFunction,
197+
il: &LowLevelILMutableFunction,
198198
) -> Option<(usize, bool)> {
199199
match msp430_asm::decode(data) {
200200
Ok(inst) => {
@@ -226,8 +226,8 @@ impl Architecture for Msp430 {
226226
fn flag_group_llil<'a>(
227227
&self,
228228
_group: Self::FlagGroup,
229-
_il: &'a MutableLiftedILFunction,
230-
) -> Option<MutableLiftedILExpr<'a, ValueExpr>> {
229+
_il: &'a LowLevelILMutableFunction,
230+
) -> Option<LowLevelILMutableExpression<'a, ValueExpr>> {
231231
None
232232
}
233233

arch/msp430/src/lift.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use msp430_asm::single_operand::SingleOperand;
1212
use msp430_asm::two_operand::TwoOperand;
1313

1414
use binaryninja::low_level_il::expression::ValueExpr;
15-
use binaryninja::low_level_il::{MutableLiftedILExpr, MutableLiftedILFunction};
15+
use binaryninja::low_level_il::{LowLevelILMutableExpression, LowLevelILMutableFunction};
1616
use log::info;
1717

1818
macro_rules! auto_increment {
@@ -163,7 +163,7 @@ macro_rules! conditional_jump {
163163
};
164164
}
165165

166-
pub(crate) fn lift_instruction(inst: &Instruction, addr: u64, il: &MutableLiftedILFunction) {
166+
pub(crate) fn lift_instruction(inst: &Instruction, addr: u64, il: &LowLevelILMutableFunction) {
167167
match inst {
168168
Instruction::Rrc(inst) => {
169169
let size = match inst.operand_width() {
@@ -623,8 +623,8 @@ pub(crate) fn lift_instruction(inst: &Instruction, addr: u64, il: &MutableLifted
623623
fn lift_source_operand<'a>(
624624
operand: &Operand,
625625
size: usize,
626-
il: &'a MutableLiftedILFunction,
627-
) -> MutableLiftedILExpr<'a, ValueExpr> {
626+
il: &'a LowLevelILMutableFunction,
627+
) -> LowLevelILMutableExpression<'a, ValueExpr> {
628628
match operand {
629629
Operand::RegisterDirect(r) => il.reg(size, Register::try_from(*r as u32).unwrap()),
630630
Operand::Indexed((r, offset)) => il

arch/riscv/src/lib.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ use binaryninja::low_level_il::lifting::{
4343
LiftableLowLevelIL, LiftableLowLevelILWithSize, LowLevelILLabel,
4444
};
4545
use binaryninja::low_level_il::{
46-
expression::ExpressionHandler, instruction::InstructionHandler, LowLevelILRegisterKind,
47-
MutableLiftedILExpr, MutableLiftedILFunction, RegularLowLevelILFunction,
46+
expression::ExpressionHandler, instruction::InstructionHandler, LowLevelILMutableExpression,
47+
LowLevelILMutableFunction, LowLevelILRegisterKind, LowLevelILRegularFunction,
4848
};
4949
use riscv_dis::{
5050
FloatReg, FloatRegType, Instr, IntRegType, Op, RegFile, Register as RiscVRegister,
@@ -207,7 +207,10 @@ impl<D: RiscVDisassembler> architecture::Register for Register<D> {
207207
impl<'a, D: RiscVDisassembler> LiftableLowLevelIL<'a> for Register<D> {
208208
type Result = ValueExpr;
209209

210-
fn lift(il: &'a MutableLiftedILFunction, reg: Self) -> MutableLiftedILExpr<'a, Self::Result> {
210+
fn lift(
211+
il: &'a LowLevelILMutableFunction,
212+
reg: Self,
213+
) -> LowLevelILMutableExpression<'a, Self::Result> {
211214
match reg.reg_type() {
212215
RegType::Integer(0) => il.const_int(reg.size(), 0),
213216
RegType::Integer(_) => il.reg(reg.size(), reg),
@@ -218,10 +221,10 @@ impl<'a, D: RiscVDisassembler> LiftableLowLevelIL<'a> for Register<D> {
218221

219222
impl<'a, D: RiscVDisassembler> LiftableLowLevelILWithSize<'a> for Register<D> {
220223
fn lift_with_size(
221-
il: &'a MutableLiftedILFunction,
224+
il: &'a LowLevelILMutableFunction,
222225
reg: Self,
223226
size: usize,
224-
) -> MutableLiftedILExpr<'a, ValueExpr> {
227+
) -> LowLevelILMutableExpression<'a, ValueExpr> {
225228
#[cfg(debug_assertions)]
226229
{
227230
if reg.size() < size {
@@ -1062,7 +1065,7 @@ impl<D: RiscVDisassembler> Architecture for RiscVArch<D> {
10621065
&self,
10631066
data: &[u8],
10641067
addr: u64,
1065-
il: &MutableLiftedILFunction,
1068+
il: &LowLevelILMutableFunction,
10661069
) -> Option<(usize, bool)> {
10671070
let max_width = self.default_integer_size();
10681071

@@ -1306,41 +1309,41 @@ impl<D: RiscVDisassembler> Architecture for RiscVArch<D> {
13061309
Op::Ebreak => il.bp().append(),
13071310
Op::Uret => {
13081311
il.intrinsic(
1309-
MutableLiftedILFunction::NO_OUTPUTS,
1312+
LowLevelILMutableFunction::NO_OUTPUTS,
13101313
RiscVIntrinsic::<D>::from(Intrinsic::Uret),
1311-
MutableLiftedILFunction::NO_INPUTS,
1314+
LowLevelILMutableFunction::NO_INPUTS,
13121315
)
13131316
.append();
13141317
il.no_ret().append();
13151318
}
13161319
Op::Sret => {
13171320
il.intrinsic(
1318-
MutableLiftedILFunction::NO_OUTPUTS,
1321+
LowLevelILMutableFunction::NO_OUTPUTS,
13191322
RiscVIntrinsic::<D>::from(Intrinsic::Sret),
1320-
MutableLiftedILFunction::NO_INPUTS,
1323+
LowLevelILMutableFunction::NO_INPUTS,
13211324
)
13221325
.append();
13231326
il.no_ret().append();
13241327
}
13251328
Op::Mret => {
13261329
il.intrinsic(
1327-
MutableLiftedILFunction::NO_OUTPUTS,
1330+
LowLevelILMutableFunction::NO_OUTPUTS,
13281331
RiscVIntrinsic::<D>::from(Intrinsic::Mret),
1329-
MutableLiftedILFunction::NO_INPUTS,
1332+
LowLevelILMutableFunction::NO_INPUTS,
13301333
)
13311334
.append();
13321335
il.no_ret().append();
13331336
}
13341337
Op::Wfi => il
13351338
.intrinsic(
1336-
MutableLiftedILFunction::NO_OUTPUTS,
1339+
LowLevelILMutableFunction::NO_OUTPUTS,
13371340
RiscVIntrinsic::<D>::from(Intrinsic::Wfi),
1338-
MutableLiftedILFunction::NO_INPUTS,
1341+
LowLevelILMutableFunction::NO_INPUTS,
13391342
)
13401343
.append(),
13411344
Op::Fence(i) => il
13421345
.intrinsic(
1343-
MutableLiftedILFunction::NO_OUTPUTS,
1346+
LowLevelILMutableFunction::NO_OUTPUTS,
13441347
RiscVIntrinsic::<D>::from(Intrinsic::Fence),
13451348
[il.const_int(4, i.imm() as u32 as u64)],
13461349
)
@@ -1353,7 +1356,7 @@ impl<D: RiscVDisassembler> Architecture for RiscVArch<D> {
13531356

13541357
if i.rd().id() == 0 {
13551358
il.intrinsic(
1356-
MutableLiftedILFunction::NO_OUTPUTS,
1359+
LowLevelILMutableFunction::NO_OUTPUTS,
13571360
RiscVIntrinsic::<D>::from(Intrinsic::Csrwr),
13581361
[csr, rs1],
13591362
)
@@ -1404,7 +1407,7 @@ impl<D: RiscVDisassembler> Architecture for RiscVArch<D> {
14041407

14051408
if i.rd().id() == 0 {
14061409
il.intrinsic(
1407-
MutableLiftedILFunction::NO_OUTPUTS,
1410+
LowLevelILMutableFunction::NO_OUTPUTS,
14081411
RiscVIntrinsic::<D>::from(Intrinsic::Csrwr),
14091412
[csr, imm],
14101413
)
@@ -2848,7 +2851,7 @@ impl FunctionRecognizer for RiscVELFPLTRecognizer {
28482851
&self,
28492852
bv: &BinaryView,
28502853
func: &Function,
2851-
llil: &RegularLowLevelILFunction,
2854+
llil: &LowLevelILRegularFunction,
28522855
) -> bool {
28532856
// Look for the following code pattern:
28542857
// t3 = plt

plugins/warp/src/cache.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ use crate::{build_function, function_guid};
33
use binaryninja::binary_view::{BinaryView, BinaryViewExt};
44
use binaryninja::confidence::MAX_CONFIDENCE;
55
use binaryninja::function::Function as BNFunction;
6-
use binaryninja::low_level_il::function::{
7-
FunctionMutability, LowLevelILFunction, NonSSA, RegularNonSSA,
8-
};
9-
use binaryninja::low_level_il::RegularLowLevelILFunction;
6+
use binaryninja::low_level_il::function::{FunctionMutability, LowLevelILFunction, NonSSA};
7+
use binaryninja::low_level_il::LowLevelILRegularFunction;
108
use binaryninja::rc::Guard;
119
use binaryninja::rc::Ref as BNRef;
1210
use binaryninja::symbol::Symbol as BNSymbol;
@@ -67,7 +65,7 @@ pub fn try_cached_function_match(function: &BNFunction) -> Option<Function> {
6765
.to_owned()
6866
}
6967

70-
pub fn cached_function(function: &BNFunction, llil: &RegularLowLevelILFunction) -> Function {
68+
pub fn cached_function(function: &BNFunction, llil: &LowLevelILRegularFunction) -> Function {
7169
let view = function.view();
7270
let view_id = ViewID::from(view.as_ref());
7371
let function_cache = FUNCTION_CACHE.get_or_init(Default::default);
@@ -120,7 +118,7 @@ where
120118

121119
pub fn cached_function_guid<M: FunctionMutability>(
122120
function: &BNFunction,
123-
llil: &LowLevelILFunction<M, NonSSA<RegularNonSSA>>,
121+
llil: &LowLevelILFunction<M, NonSSA>,
124122
) -> FunctionGUID {
125123
let view = function.view();
126124
let view_id = ViewID::from(view);
@@ -198,7 +196,7 @@ pub struct FunctionCache {
198196
}
199197

200198
impl FunctionCache {
201-
pub fn function(&self, function: &BNFunction, llil: &RegularLowLevelILFunction) -> Function {
199+
pub fn function(&self, function: &BNFunction, llil: &LowLevelILRegularFunction) -> Function {
202200
let function_id = FunctionID::from(function);
203201
match self.cache.get(&function_id) {
204202
Some(function) => function.value().to_owned(),
@@ -325,7 +323,7 @@ impl GUIDCache {
325323
pub fn function_guid<M: FunctionMutability>(
326324
&self,
327325
function: &BNFunction,
328-
llil: &LowLevelILFunction<M, NonSSA<RegularNonSSA>>,
326+
llil: &LowLevelILFunction<M, NonSSA>,
329327
) -> FunctionGUID {
330328
let function_id = FunctionID::from(function);
331329
match self.cache.get(&function_id) {

plugins/warp/src/lib.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ use binaryninja::binary_view::BinaryViewExt;
1010
use binaryninja::confidence::MAX_CONFIDENCE;
1111
use binaryninja::function::{Function as BNFunction, NativeBlock};
1212
use binaryninja::low_level_il::expression::{ExpressionHandler, LowLevelILExpressionKind};
13-
use binaryninja::low_level_il::function::{
14-
FunctionMutability, LowLevelILFunction, NonSSA, RegularNonSSA,
15-
};
13+
use binaryninja::low_level_il::function::{FunctionMutability, LowLevelILFunction, NonSSA};
1614
use binaryninja::low_level_il::instruction::{
1715
InstructionHandler, LowLevelILInstruction, LowLevelILInstructionKind,
1816
};
@@ -46,7 +44,7 @@ pub fn user_signature_dir() -> PathBuf {
4644

4745
pub fn build_function<M: FunctionMutability>(
4846
func: &BNFunction,
49-
llil: &LowLevelILFunction<M, NonSSA<RegularNonSSA>>,
47+
llil: &LowLevelILFunction<M, NonSSA>,
5048
) -> Function {
5149
let bn_fn_ty = func.function_type();
5250
Function {
@@ -78,7 +76,7 @@ pub fn sorted_basic_blocks(func: &BNFunction) -> Vec<BNRef<BNBasicBlock<NativeBl
7876

7977
pub fn function_guid<M: FunctionMutability>(
8078
func: &BNFunction,
81-
llil: &LowLevelILFunction<M, NonSSA<RegularNonSSA>>,
79+
llil: &LowLevelILFunction<M, NonSSA>,
8280
) -> FunctionGUID {
8381
let basic_blocks = sorted_basic_blocks(func);
8482
let basic_block_guids = basic_blocks
@@ -90,15 +88,15 @@ pub fn function_guid<M: FunctionMutability>(
9088

9189
pub fn basic_block_guid<M: FunctionMutability>(
9290
basic_block: &BNBasicBlock<NativeBlock>,
93-
llil: &LowLevelILFunction<M, NonSSA<RegularNonSSA>>,
91+
llil: &LowLevelILFunction<M, NonSSA>,
9492
) -> BasicBlockGUID {
9593
let func = basic_block.function();
9694
let view = func.view();
9795
let arch = func.arch();
9896
let max_instr_len = arch.max_instr_len();
9997

10098
// NOPs and useless moves are blacklisted to allow for hot-patchable functions.
101-
let is_blacklisted_instr = |instr: &LowLevelILInstruction<M, NonSSA<RegularNonSSA>>| {
99+
let is_blacklisted_instr = |instr: &LowLevelILInstruction<M, NonSSA>| {
102100
match instr.kind() {
103101
LowLevelILInstructionKind::Nop(_) => true,
104102
LowLevelILInstructionKind::SetReg(op) => {
@@ -126,8 +124,8 @@ pub fn basic_block_guid<M: FunctionMutability>(
126124
}
127125
};
128126

129-
let is_variant_instr = |instr: &LowLevelILInstruction<M, NonSSA<RegularNonSSA>>| {
130-
let is_variant_expr = |expr: &LowLevelILExpressionKind<M, NonSSA<RegularNonSSA>>| {
127+
let is_variant_instr = |instr: &LowLevelILInstruction<M, NonSSA>| {
128+
let is_variant_expr = |expr: &LowLevelILExpressionKind<M, NonSSA>| {
131129
// TODO: Checking the section here is slow, we should gather all section ranges outside of this.
132130
match expr {
133131
LowLevelILExpressionKind::ConstPtr(op)

plugins/warp/src/plugin/workflow.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::matcher::cached_function_matcher;
33
use binaryninja::background_task::BackgroundTask;
44
use binaryninja::binary_view::{BinaryView, BinaryViewExt};
55
use binaryninja::command::Command;
6-
use binaryninja::low_level_il::function::RegularNonSSA;
76
use binaryninja::workflow::{Activity, AnalysisContext, Workflow};
87
use std::time::Instant;
98

@@ -74,7 +73,7 @@ pub fn insert_workflow() {
7473
let guid_activity = |ctx: &AnalysisContext| {
7574
let function = ctx.function();
7675
// TODO: Returning RegularNonSSA means we cant modify the il (the lifting code was written just for lifted il, that needs to be fixed)
77-
if let Some(llil) = unsafe { ctx.llil_function::<RegularNonSSA>() } {
76+
if let Some(llil) = unsafe { ctx.llil_function() } {
7877
cached_function_guid(&function, &llil);
7978
}
8079
};

rust/examples/workflow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fn example_activity(analysis_context: &AnalysisContext) {
4141
}
4242
}
4343
}
44-
analysis_context.set_lifted_il_function(&llil);
44+
analysis_context.set_llil_function(&llil.finalized());
4545
}
4646
}
4747

0 commit comments

Comments
 (0)