Skip to content

Commit 603fe85

Browse files
committed
fixup! Migrate Rust demangler bindings and consumers
1 parent 2883dd9 commit 603fe85

2 files changed

Lines changed: 38 additions & 18 deletions

File tree

plugins/pdb-ng/src/symbol_parser.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use crate::PDBParserInstance;
3939
use binaryninja::architecture::{Architecture, ArchitectureExt, Register, RegisterId};
4040
use binaryninja::binary_view::BinaryViewBase;
4141
use binaryninja::confidence::{Conf, MAX_CONFIDENCE, MIN_CONFIDENCE};
42-
use binaryninja::demangle::demangle_ms;
42+
use binaryninja::demangle::{demangle_ms_with_config, DemanglerConfig};
4343
use binaryninja::rc::Ref;
4444
use binaryninja::types::{FunctionParameter, QualifiedName, StructureBuilder, Type, TypeClass};
4545
use binaryninja::variable::{Variable, VariableSourceType};
@@ -1813,11 +1813,8 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
18131813
raw_name: &String,
18141814
rva: Rva,
18151815
) -> Result<(Option<Conf<Ref<Type>>>, Option<QualifiedName>)> {
1816-
let simplify_templates = self.settings.get_bool_with_opts(
1817-
"analysis.types.templateSimplifier",
1818-
&mut self.settings_query_opts.clone(),
1819-
);
1820-
let (mut t, mut name) = match demangle_ms(&self.arch, raw_name, simplify_templates) {
1816+
let demangler_config = DemanglerConfig::for_binary_view(self.bv);
1817+
let (mut t, mut name) = match demangle_ms_with_config(raw_name, &demangler_config) {
18211818
Some(result) => (
18221819
result.ty.map(|ty| Conf::new(ty, DEMANGLE_CONFIDENCE)),
18231820
result.name,

rust/src/demangle.rs

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ impl DemanglerConfig {
6767
Self::from_api_object(&config)
6868
}
6969

70-
pub fn from_api_object(config: &BNDemanglerConfig) -> Self {
70+
pub(crate) fn from_api_object(config: &BNDemanglerConfig) -> Self {
7171
let platform = match config.platform.is_null() {
72-
true => Self::default().platform,
72+
true => None,
7373
false => {
7474
Some(unsafe { Platform::ref_from_raw(BNNewPlatformReference(config.platform)) })
7575
}
@@ -92,7 +92,7 @@ impl DemanglerConfig {
9292
.expect("default demangler config has no platform")
9393
}
9494

95-
pub fn to_api_object(&self) -> BNDemanglerConfig {
95+
pub(crate) fn to_api_object(&self) -> BNDemanglerConfig {
9696
let platform = self.get_platform();
9797
BNDemanglerConfig {
9898
platform: platform.handle,
@@ -124,9 +124,10 @@ impl DemanglerResult {
124124
}
125125
}
126126

127-
pub fn from_api_object(result: &BNDemanglerResult) -> Self {
127+
pub(crate) fn from_api_object(result: &BNDemanglerResult) -> Self {
128128
let ty = match result.type_.is_null() {
129129
true => None,
130+
// The source result remains independently owned and is freed by the caller.
130131
false => Some(unsafe { Type::ref_from_raw(BNNewTypeReference(result.type_)) }),
131132
};
132133
Self {
@@ -135,13 +136,13 @@ impl DemanglerResult {
135136
}
136137
}
137138

138-
pub fn from_api_object_and_free(result: &mut BNDemanglerResult) -> Self {
139+
pub(crate) fn from_api_object_and_free(result: &mut BNDemanglerResult) -> Self {
139140
let demangler_result = Self::from_api_object(result);
140141
unsafe { BNFreeDemanglerResult(result) };
141142
demangler_result
142143
}
143144

144-
pub fn to_api_object(&self) -> BNDemanglerResult {
145+
pub(crate) fn to_api_object(&self) -> BNDemanglerResult {
145146
BNDemanglerResult {
146147
name: QualifiedName::into_raw(self.name.clone()),
147148
type_: self
@@ -223,9 +224,18 @@ pub fn demangle_generic(
223224
}
224225

225226
pub fn demangle_llvm(mangled_name: &str, simplify: bool) -> Option<DemanglerResult> {
226-
let mut config = DemanglerConfig::default();
227-
config.simplify_templates = simplify;
228-
demangle_with_demangler(llvm_demangler(), mangled_name, &config)
227+
let config = DemanglerConfig {
228+
simplify_templates: simplify,
229+
..DemanglerConfig::default()
230+
};
231+
demangle_llvm_with_config(mangled_name, &config)
232+
}
233+
234+
pub fn demangle_llvm_with_config(
235+
mangled_name: &str,
236+
config: &DemanglerConfig,
237+
) -> Option<DemanglerResult> {
238+
demangle_with_demangler(llvm_demangler(), mangled_name, config)
229239
}
230240

231241
pub fn demangle_gnu3(
@@ -238,7 +248,14 @@ pub fn demangle_gnu3(
238248
.map(|platform| DemanglerConfig::for_platform(&platform, simplify))
239249
.unwrap_or_default();
240250
config.simplify_templates = simplify;
241-
demangle_with_demangler(gnu3_demangler(), mangled_name, &config)
251+
demangle_gnu3_with_config(mangled_name, &config)
252+
}
253+
254+
pub fn demangle_gnu3_with_config(
255+
mangled_name: &str,
256+
config: &DemanglerConfig,
257+
) -> Option<DemanglerResult> {
258+
demangle_with_demangler(gnu3_demangler(), mangled_name, config)
242259
}
243260

244261
pub fn demangle_ms(
@@ -251,7 +268,14 @@ pub fn demangle_ms(
251268
.map(|platform| DemanglerConfig::for_platform(&platform, simplify))
252269
.unwrap_or_default();
253270
config.simplify_templates = simplify;
254-
demangle_with_demangler(msvc_demangler(), mangled_name, &config)
271+
demangle_ms_with_config(mangled_name, &config)
272+
}
273+
274+
pub fn demangle_ms_with_config(
275+
mangled_name: &str,
276+
config: &DemanglerConfig,
277+
) -> Option<DemanglerResult> {
278+
demangle_with_demangler(msvc_demangler(), mangled_name, config)
255279
}
256280

257281
pub fn simplify_demangled_template_name(name: impl Into<QualifiedName>) -> QualifiedName {
@@ -366,7 +390,6 @@ impl Demangler {
366390
let ctxt = Box::into_raw(Box::new(demangler));
367391

368392
let callbacks = Box::into_raw(Box::new(BNDemanglerCallbacks {
369-
size: std::mem::size_of::<BNDemanglerCallbacks>(),
370393
context: ctxt as *mut c_void,
371394
isMangledString: Some(cb_is_mangled_string::<C>),
372395
demangle: Some(cb_demangle::<C>),

0 commit comments

Comments
 (0)