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// Ensure linkage against DbgHelp to resolve UnDecorateSymbolName on MSVC.
14#pragma comment(lib, "Dbghelp.lib")
15#else
16#include <cxxabi.h>
17#endif
18
19namespace BaseLib
20{
21std::string demangle(const char* mangled_name)
22{
23#ifdef _MSC_VER
24 // MSVC demangling using UnDecorateSymbolName
25 char demangled_buffer[1024] = {0};
26 if (UnDecorateSymbolName(mangled_name, demangled_buffer,
27 sizeof(demangled_buffer), UNDNAME_COMPLETE))
28 {
29 return demangled_buffer;
30 }
31#else
32 // GCC/Clang demangling using __cxa_demangle
33 int status = 0;
34 std::unique_ptr<char, decltype(&std::free)> demangled(
35 abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status),
36 &std::free);
37
38 if (status == 0 && demangled)
39 {
40 return demangled.get();
41 }
42#endif
43
44 // Fallback to mangled name if demangling fails
45 return mangled_name;
46}
47
48} // namespace BaseLib
std::string demangle(const char *mangled_name)