demangle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "crucible/core/demangle.hpp" #include <cstdlib> #include "crucible/core/platform.hpp" #ifdef CRUCIBLE_PLATFORM_IS_POSIX_LIKE #include <cxxabi.h> #endif // CRUCIBLE_PLATFORM_IS_POSIX_LIKE namespace crucible::core { auto demangle(FFI_String<char> const &mangled_symbol) -> Demangle_Result<FFI_String<char>> { #ifdef CRUCIBLE_PLATFORM_IS_POSIX_LIKE char *demangled_symbol_data { nullptr }; std::size_t demangled_symbol_size { 0 }; int demangled_symbol_status { 0 }; demangled_symbol_data = abi::__cxa_demangle(mangled_symbol.data(), nullptr, &demangled_symbol_size, &demangled_symbol_status); FFI_String<char> demangled_symbol; if (demangled_symbol_data) { demangled_symbol = make_ffi_string(demangled_symbol_data, demangled_symbol_size); std::free(demangled_symbol_data); } if (demangled_symbol_status == 0) { return make_success<FFI_String<char>>(demangled_symbol.data(), demangled_symbol.size()); } if (demangled_symbol_status == -1) { return make_failure<Demangle_Error>(Insufficient_Demangle_Memory {}); } if (demangled_symbol_status == -2) { return make_success(mangled_symbol); } if (demangled_symbol_status == -3) { return make_failure<Demangle_Error>(Invalid_Demangle_Arguments {}); } return make_failure<Demangle_Error>(Unknown_Demangle_Error {}); #endif // CRUCIBLE_PLATFORM_IS_POSIX_LIKE #ifdef CRUCIBLE_PLATFORM_IS_WINDOWS_LIKE // MSVC already gives us unmangled symbols from everywhere that matters return make_success(mangled_symbol); #endif // CRUCIBLE_PLATFORM_IS_WINDOWS_LIKE } }