summaryrefslogtreecommitdiff
path: root/python/demangle.py
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-04-24 18:33:11 -0400
committerMason Reed <mason@vector35.com>2024-05-03 11:25:32 -0400
commit80201094d494278493e2e08f6adc7c2b4c5b0ad6 (patch)
treef770620e12d5b8c21155c2a67b3d66e34816b2ed /python/demangle.py
parent92a468d7566de31e6867a77c5cf1c64e33792109 (diff)
Expose LLVM demangler
Diffstat (limited to 'python/demangle.py')
-rw-r--r--python/demangle.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/python/demangle.py b/python/demangle.py
index 874b13cf..158880f0 100644
--- a/python/demangle.py
+++ b/python/demangle.py
@@ -46,6 +46,39 @@ def get_qualified_name(names):
return "::".join(names)
+def demangle_llvm(mangled_name: str, options=None):
+ """
+ ``demangle_llvm`` demangles a mangled name to a Type object.
+
+ :param str mangled_name: a mangled (msvc/itanium/rust/dlang) name
+ :param options: (optional) Whether to simplify demangled names : None falls back to user settings, a BinaryView uses that BinaryView's settings, or a boolean to set it directly
+ :type options: Tuple[bool, BinaryView, None]
+ :return: returns demangled name or None on error
+ :rtype: str
+ """
+ outName = ctypes.POINTER(ctypes.c_char_p)()
+ outSize = ctypes.c_ulonglong()
+ names = []
+ if (
+ isinstance(options, binaryview.BinaryView) and core.BNDemangleLLVMWithOptions(
+ mangled_name, ctypes.byref(outName), ctypes.byref(outSize), options
+ )
+ ) or (
+ isinstance(options, bool) and core.BNDemangleLLVM(
+ mangled_name, ctypes.byref(outName), ctypes.byref(outSize), options
+ )
+ ) or (
+ options is None and core.BNDemangleLLVMWithOptions(
+ mangled_name, ctypes.byref(outName), ctypes.byref(outSize), None
+ )
+ ):
+ for i in range(outSize.value):
+ names.append(outName[i].decode('utf8')) # type: ignore
+ core.BNFreeDemangledName(ctypes.byref(outName), outSize.value)
+ return names
+ return None
+
+
def demangle_ms(archOrPlatform:Union[Architecture, Platform], mangled_name:str, options=False):
"""
``demangle_ms`` demangles a mangled Microsoft Visual Studio C++ name to a Type object.