OGS
DemangleTypeInfo.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "DemangleTypeInfo.h"
5
6#include <memory>
7
8#ifdef _MSC_VER
9// clang-format off
10#include <windows.h>
11#include <dbghelp.h>
12// clang-format on
13#else
14#include <cxxabi.h>
15#endif
16
17namespace BaseLib
18{
19std::string demangle(const char* mangled_name)
20{
21#ifdef _MSC_VER
22 // MSVC demangling using UnDecorateSymbolName
23 char demangled_buffer[1024] = {0};
24 if (UnDecorateSymbolName(mangled_name, demangled_buffer,
25 sizeof(demangled_buffer), UNDNAME_COMPLETE))
26 {
27 return demangled_buffer;
28 }
29#else
30 // GCC/Clang demangling using __cxa_demangle
31 int status = 0;
32 std::unique_ptr<char, decltype(&std::free)> demangled(
33 abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status),
34 &std::free);
35
36 if (status == 0 && demangled)
37 {
38 return demangled.get();
39 }
40#endif
41
42 // Fallback to mangled name if demangling fails
43 return mangled_name;
44}
45
46} // namespace BaseLib
std::string demangle(const char *mangled_name)