diff --git a/rust/src/architecture.rs b/rust/src/architecture.rs index 6831844ef..4cffbad27 100644 --- a/rust/src/architecture.rs +++ b/rust/src/architecture.rs @@ -983,8 +983,8 @@ impl FlagGroup for CoreFlagGroup { } } -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct CoreIntrinsic(*mut BNArchitecture, u32); +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +pub struct CoreIntrinsic(pub(crate) *mut BNArchitecture, pub(crate) u32); impl Intrinsic for crate::architecture::CoreIntrinsic { fn name(&self) -> Cow { diff --git a/rust/src/hlil/instruction.rs b/rust/src/hlil/instruction.rs index f98b18847..bb9c68683 100644 --- a/rust/src/hlil/instruction.rs +++ b/rust/src/hlil/instruction.rs @@ -1,11 +1,10 @@ use binaryninjacore_sys::BNGetHighLevelILByIndex; use binaryninjacore_sys::BNHighLevelILOperation; +use crate::architecture::CoreIntrinsic; use crate::operand_iter::OperandIter; use crate::rc::Ref; -use crate::types::{ - ConstantData, ILIntrinsic, RegisterValue, RegisterValueType, SSAVariable, Variable, -}; +use crate::types::{ConstantData, RegisterValue, RegisterValueType, SSAVariable, Variable}; use super::operation::*; use super::{HighLevelILFunction, HighLevelILLiftedInstruction, HighLevelILLiftedInstructionKind}; @@ -812,11 +811,11 @@ impl HighLevelILInstruction { cond_false: self.lift_operand(op.cond_false), }), Intrinsic(op) => Lifted::Intrinsic(LiftedIntrinsic { - intrinsic: ILIntrinsic::new(self.function.get_function().arch(), op.intrinsic), + intrinsic: CoreIntrinsic(self.function.get_function().arch().0, op.intrinsic), params: self.lift_instruction_list(op.first_param, op.num_params), }), IntrinsicSsa(op) => Lifted::IntrinsicSsa(LiftedIntrinsicSsa { - intrinsic: ILIntrinsic::new(self.function.get_function().arch(), op.intrinsic), + intrinsic: CoreIntrinsic(self.function.get_function().arch().0, op.intrinsic), params: self.lift_instruction_list(op.first_param, op.num_params), dest_memory: op.dest_memory, src_memory: op.src_memory, diff --git a/rust/src/hlil/lift.rs b/rust/src/hlil/lift.rs index 731a785c1..300a7f1fb 100644 --- a/rust/src/hlil/lift.rs +++ b/rust/src/hlil/lift.rs @@ -1,7 +1,9 @@ -use super::{operation::*, HighLevelILFunction}; +use super::operation::*; +use super::HighLevelILFunction; +use crate::architecture::CoreIntrinsic; use crate::rc::Ref; -use crate::types::{ConstantData, ILIntrinsic, SSAVariable, Variable}; +use crate::types::{ConstantData, SSAVariable, Variable}; #[derive(Clone)] pub enum HighLevelILLiftedOperand { @@ -11,7 +13,7 @@ pub enum HighLevelILLiftedOperand { Float(f64), Int(u64), IntList(Vec), - Intrinsic(ILIntrinsic), + Intrinsic(CoreIntrinsic), Label(GotoLabel), MemberIndex(Option), Var(Variable), diff --git a/rust/src/hlil/operation.rs b/rust/src/hlil/operation.rs index ee0d437b5..e762a74bc 100644 --- a/rust/src/hlil/operation.rs +++ b/rust/src/hlil/operation.rs @@ -1,8 +1,10 @@ use binaryninjacore_sys::BNGetGotoLabelName; +use crate::architecture::CoreIntrinsic; use crate::function::Function; use crate::rc::Ref; -use crate::types::{ConstantData, ILIntrinsic, SSAVariable, Variable}; +use crate::string::BnString; +use crate::types::{ConstantData, SSAVariable, Variable}; use super::HighLevelILLiftedInstruction; @@ -13,10 +15,8 @@ pub struct GotoLabel { } impl GotoLabel { - pub fn name(&self) -> &str { - let raw_str = unsafe { BNGetGotoLabelName(self.function.handle, self.target) }; - let c_str = unsafe { core::ffi::CStr::from_ptr(raw_str) }; - c_str.to_str().unwrap() + pub fn name(&self) -> BnString { + unsafe { BnString::from_raw(BNGetGotoLabelName(self.function.handle, self.target)) } } } @@ -320,7 +320,7 @@ pub struct Intrinsic { } #[derive(Clone, Debug, PartialEq)] pub struct LiftedIntrinsic { - pub intrinsic: ILIntrinsic, + pub intrinsic: CoreIntrinsic, pub params: Vec, } @@ -335,7 +335,7 @@ pub struct IntrinsicSsa { } #[derive(Clone, Debug, PartialEq)] pub struct LiftedIntrinsicSsa { - pub intrinsic: ILIntrinsic, + pub intrinsic: CoreIntrinsic, pub params: Vec, pub dest_memory: u64, pub src_memory: u64, diff --git a/rust/src/mlil/instruction.rs b/rust/src/mlil/instruction.rs index cb7628853..00c97cb22 100644 --- a/rust/src/mlil/instruction.rs +++ b/rust/src/mlil/instruction.rs @@ -3,11 +3,10 @@ use binaryninjacore_sys::BNGetMediumLevelILByIndex; use binaryninjacore_sys::BNMediumLevelILInstruction; use binaryninjacore_sys::BNMediumLevelILOperation; +use crate::architecture::CoreIntrinsic; use crate::operand_iter::OperandIter; use crate::rc::Ref; -use crate::types::{ - ConstantData, ILIntrinsic, RegisterValue, RegisterValueType, SSAVariable, Variable, -}; +use crate::types::{ConstantData, RegisterValue, RegisterValueType, SSAVariable, Variable}; use super::lift::*; use super::operation::*; @@ -906,7 +905,7 @@ impl MediumLevelILInstruction { output: OperandIter::new(&*self.function, op.first_output, op.num_outputs) .vars() .collect(), - intrinsic: ILIntrinsic::new(self.function.get_function().arch(), op.intrinsic), + intrinsic: CoreIntrinsic(self.function.get_function().arch().0, op.intrinsic), params: OperandIter::new(&*self.function, op.first_param, op.num_params) .exprs() .map(|expr| expr.lift()) @@ -925,7 +924,7 @@ impl MediumLevelILInstruction { output: OperandIter::new(&*self.function, op.first_output, op.num_outputs) .ssa_vars() .collect(), - intrinsic: ILIntrinsic::new(self.function.get_function().arch(), op.intrinsic), + intrinsic: CoreIntrinsic(self.function.get_function().arch().0, op.intrinsic), params: OperandIter::new(&*self.function, op.first_param, op.num_params) .exprs() .map(|expr| expr.lift()) diff --git a/rust/src/mlil/lift.rs b/rust/src/mlil/lift.rs index e8548b064..7a5e159ba 100644 --- a/rust/src/mlil/lift.rs +++ b/rust/src/mlil/lift.rs @@ -1,7 +1,8 @@ use std::collections::BTreeMap; +use crate::architecture::CoreIntrinsic; use crate::rc::Ref; -use crate::types::{ConstantData, ILIntrinsic, SSAVariable, Variable}; +use crate::types::{ConstantData, SSAVariable, Variable}; use super::operation::*; use super::MediumLevelILFunction; @@ -9,7 +10,7 @@ use super::MediumLevelILFunction; #[derive(Clone)] pub enum MediumLevelILLiftedOperand { ConstantData(ConstantData), - Intrinsic(ILIntrinsic), + Intrinsic(CoreIntrinsic), Expr(MediumLevelILLiftedInstruction), ExprList(Vec), Float(f64), diff --git a/rust/src/mlil/operation.rs b/rust/src/mlil/operation.rs index 822688a61..278d1edb7 100644 --- a/rust/src/mlil/operation.rs +++ b/rust/src/mlil/operation.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use crate::types::{ConstantData, ILIntrinsic, SSAVariable, Variable}; +use crate::{architecture::CoreIntrinsic, types::{ConstantData, SSAVariable, Variable}}; use super::MediumLevelILLiftedInstruction; @@ -355,7 +355,7 @@ pub struct Intrinsic { #[derive(Clone, Debug, PartialEq)] pub struct LiftedIntrinsic { pub output: Vec, - pub intrinsic: ILIntrinsic, + pub intrinsic: CoreIntrinsic, pub params: Vec, } @@ -371,7 +371,7 @@ pub struct IntrinsicSsa { #[derive(Clone, Debug, PartialEq)] pub struct LiftedIntrinsicSsa { pub output: Vec, - pub intrinsic: ILIntrinsic, + pub intrinsic: CoreIntrinsic, pub params: Vec, } diff --git a/rust/src/symbol.rs b/rust/src/symbol.rs index f022fd3f9..d7a73a0ae 100644 --- a/rust/src/symbol.rs +++ b/rust/src/symbol.rs @@ -14,7 +14,6 @@ //! Interfaces for the various kinds of symbols in a binary. -use std::ffi::CStr; use std::fmt; use std::hash::{Hash, Hasher}; use std::ptr; @@ -249,24 +248,15 @@ impl Symbol { } pub fn full_name(&self) -> BnString { - unsafe { - let name = BNGetSymbolFullName(self.handle); - BnString::from_raw(name) - } + unsafe { BnString::from_raw(BNGetSymbolFullName(self.handle)) } } - pub fn short_name(&self) -> &str { - unsafe { - let name = BNGetSymbolShortName(self.handle); - CStr::from_ptr(name).to_str().unwrap() - } + pub fn short_name(&self) -> BnString { + unsafe { BnString::from_raw(BNGetSymbolShortName(self.handle)) } } - pub fn raw_name(&self) -> &str { - unsafe { - let name = BNGetSymbolRawName(self.handle); - CStr::from_ptr(name).to_str().unwrap() - } + pub fn raw_name(&self) -> BnString { + unsafe { BnString::from_raw(BNGetSymbolRawName(self.handle)) } } pub fn address(&self) -> u64 { diff --git a/rust/src/types.rs b/rust/src/types.rs index 1a5918012..7adc449e3 100644 --- a/rust/src/types.rs +++ b/rust/src/types.rs @@ -1194,11 +1194,9 @@ impl Type { } } - pub fn generate_auto_demangled_type_id<'a, S: BnStrCompatible>(name: S) -> &'a str { + pub fn generate_auto_demangled_type_id(name: S) -> BnString { let mut name = QualifiedName::from(name); - unsafe { CStr::from_ptr(BNGenerateAutoDemangledTypeId(&mut name.0)) } - .to_str() - .unwrap() + unsafe { BnString::from_raw(BNGenerateAutoDemangledTypeId(&mut name.0)) } } } @@ -2717,29 +2715,6 @@ impl DataVariableAndName { } } -///////////////////////// -// ILIntrinsic - -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub struct ILIntrinsic { - arch: CoreArchitecture, - index: u32, -} - -impl ILIntrinsic { - pub(crate) fn new(arch: CoreArchitecture, index: u32) -> Self { - Self { arch, index } - } - - pub fn name(&self) -> &str { - let name_ptr = unsafe { BNGetArchitectureIntrinsicName(self.arch.0, self.index) }; - let name_raw = unsafe { core::ffi::CStr::from_ptr(name_ptr) }; - name_raw.to_str().unwrap() - } - - // TODO impl inputs and outputs function -} - ///////////////////////// // RegisterValueType