diff options
| author | Mason Reed <mason@vector35.com> | 2025-07-16 14:41:31 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-07-17 06:20:20 -0400 |
| commit | 2f947fd6971e284ebc0f38219c1687afa15d73b0 (patch) | |
| tree | 3326fda2f5d2105fa53609e51705b1a30bed824f /plugins/warp/src | |
| parent | 302b3295e6db60c1ee5a076d8f57ebfd5e1eb30a (diff) | |
[WARP] Construct a minimal version of the function object when user only wants the symbol
We were previously constructing the function type, comments and variables to just throw away, wasting precious cpu cycles!
Diffstat (limited to 'plugins/warp/src')
| -rw-r--r-- | plugins/warp/src/lib.rs | 46 | ||||
| -rw-r--r-- | plugins/warp/src/plugin/debug.rs | 2 | ||||
| -rw-r--r-- | plugins/warp/src/plugin/ffi/function.rs | 2 | ||||
| -rw-r--r-- | plugins/warp/src/processor.rs | 10 |
4 files changed, 35 insertions, 25 deletions
diff --git a/plugins/warp/src/lib.rs b/plugins/warp/src/lib.rs index dd94ada0..bea85cdd 100644 --- a/plugins/warp/src/lib.rs +++ b/plugins/warp/src/lib.rs @@ -105,34 +105,44 @@ pub fn build_variables(func: &BNFunction) -> Vec<FunctionVariable> { variables } +// TODO: Get rid of the minimal bool. pub fn build_function<M: FunctionMutability>( func: &BNFunction, lifted_il: &LowLevelILFunction<M, NonSSA>, + minimal: bool, ) -> Function { - let comments = func - .comments() - .iter() - .map(|c| bn_comment_to_comment(func, c)) - .collect(); - Function { + let mut function = Function { guid: cached_function_guid(func, lifted_il), symbol: from_bn_symbol(&func.symbol()), - // Currently we only store the type if its a user type. - // TODO: In the future we might want to make this configurable. - ty: match func.has_user_type() || func.has_explicitly_defined_type() { - true => Some(from_bn_type( - &func.view(), - &func.function_type(), - MAX_CONFIDENCE, - )), - false => None, - }, // NOTE: Adding adjacent only works if analysis is complete. // NOTE: We do not filter out adjacent functions here. constraints: cached_constraints(func, |_| true), - comments, - variables: build_variables(func), + ty: None, + comments: vec![], + variables: vec![], + }; + + if minimal { + return function; } + + // Currently we only store the type if its a user type. + // TODO: In the future we might want to make this configurable. + function.ty = match func.has_user_type() || func.has_explicitly_defined_type() { + true => Some(from_bn_type( + &func.view(), + &func.function_type(), + MAX_CONFIDENCE, + )), + false => None, + }; + function.comments = func + .comments() + .iter() + .map(|c| bn_comment_to_comment(func, c)) + .collect(); + function.variables = build_variables(func); + function } /// Basic blocks sorted from high to low. diff --git a/plugins/warp/src/plugin/debug.rs b/plugins/warp/src/plugin/debug.rs index fc4e5817..24cdf1c3 100644 --- a/plugins/warp/src/plugin/debug.rs +++ b/plugins/warp/src/plugin/debug.rs @@ -10,7 +10,7 @@ pub struct DebugFunction; impl FunctionCommand for DebugFunction { fn action(&self, _view: &BinaryView, func: &Function) { if let Ok(lifted_il) = func.lifted_il() { - log::info!("{:#?}", build_function(func, &lifted_il)); + log::info!("{:#?}", build_function(func, &lifted_il, false)); } } diff --git a/plugins/warp/src/plugin/ffi/function.rs b/plugins/warp/src/plugin/ffi/function.rs index 3db8f307..a7ec6593 100644 --- a/plugins/warp/src/plugin/ffi/function.rs +++ b/plugins/warp/src/plugin/ffi/function.rs @@ -40,7 +40,7 @@ pub unsafe extern "C" fn BNWARPGetFunction( let Ok(lifted_il) = function.lifted_il() else { return std::ptr::null_mut(); }; - let function = build_function(&function, &lifted_il); + let function = build_function(&function, &lifted_il, false); Arc::into_raw(Arc::new(function)) as *mut BNWARPFunction } diff --git a/plugins/warp/src/processor.rs b/plugins/warp/src/processor.rs index d3ccb300..75e8569e 100644 --- a/plugins/warp/src/processor.rs +++ b/plugins/warp/src/processor.rs @@ -816,11 +816,11 @@ impl WarpFileProcessor { .filter_map(|func| { let lifted_il = func.lifted_il().ok()?; let target = platform_to_target(&func.platform()); - let mut built_function = build_function(&func, &lifted_il); - // User asked to only save symbols, so we will remove the function type. - if self.file_data == FileDataKindField::Symbols { - built_function.ty = None; - } + let built_function = build_function( + &func, + &lifted_il, + self.file_data == FileDataKindField::Symbols, + ); Some((target, built_function)) }) .fold( |
