From 80201094d494278493e2e08f6adc7c2b4c5b0ad6 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Wed, 24 Apr 2024 18:33:11 -0400 Subject: Expose LLVM demangler --- rust/src/demangle.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'rust/src') diff --git a/rust/src/demangle.rs b/rust/src/demangle.rs index 3756ea06..1b940ff9 100644 --- a/rust/src/demangle.rs +++ b/rust/src/demangle.rs @@ -26,6 +26,49 @@ use crate::rc::*; pub type Result = result::Result; +pub fn demangle_llvm( + mangled_name: S, + simplify: bool, +) -> Result> { + let mangled_name_bwn = mangled_name.into_bytes_with_nul(); + let mangled_name_ptr = mangled_name_bwn.as_ref(); + let mut out_name: *mut *mut std::os::raw::c_char = unsafe { std::mem::zeroed() }; + let mut out_size: usize = 0; + let res = unsafe { + BNDemangleLLVM( + mangled_name_ptr.as_ptr() as *const c_char, + &mut out_name, + &mut out_size, + simplify, + ) + }; + + if !res || out_size == 0 { + let cstr = match CStr::from_bytes_with_nul(mangled_name_ptr) { + Ok(cstr) => cstr, + Err(_) => { + log::error!("demangle_llvm: failed to parse mangled name"); + return Err(()); + } + }; + return Ok(vec![cstr.to_string_lossy().into_owned()]); + } + + if out_name.is_null() { + log::error!("demangle_llvm: out_name is NULL"); + return Err(()); + } + + let names = unsafe { ArrayGuard::::new(out_name, out_size, ()) } + .iter() + .map(str::to_string) + .collect(); + + unsafe { BNFreeDemangledName(&mut out_name, out_size) }; + + Ok(names) +} + pub fn demangle_gnu3( arch: &CoreArchitecture, mangled_name: S, -- cgit v1.3.1