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 --- python/demangle.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'python/demangle.py') 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. -- cgit v1.3.1