2017-12-08 01:34:52 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
/** Demangles C++ symbol name.
|
|
|
|
* When demangling fails, returns the original name and sets status to non-zero.
|
2018-05-25 18:13:48 +00:00
|
|
|
* TODO: Write msvc version (now returns the same string)
|
2017-12-08 01:34:52 +00:00
|
|
|
*/
|
|
|
|
std::string demangle(const char * name, int & status);
|
|
|
|
|
|
|
|
inline std::string demangle(const char * name)
|
|
|
|
{
|
|
|
|
int status = 0;
|
|
|
|
return demangle(name, status);
|
|
|
|
}
|
2020-02-03 19:50:08 +00:00
|
|
|
|
|
|
|
// abi::__cxa_demangle returns a C string of known size that should be deleted
|
|
|
|
// with free().
|
|
|
|
struct DemangleResult
|
|
|
|
{
|
|
|
|
char * data = nullptr;
|
|
|
|
size_t size = 0;
|
|
|
|
|
|
|
|
DemangleResult() = default;
|
|
|
|
DemangleResult(DemangleResult &) = delete;
|
|
|
|
DemangleResult(DemangleResult && other)
|
|
|
|
{
|
|
|
|
std::swap(data, other.data);
|
|
|
|
std::swap(size, other.size);
|
|
|
|
}
|
|
|
|
~DemangleResult()
|
|
|
|
{
|
|
|
|
if (data)
|
|
|
|
{
|
|
|
|
free(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
DemangleResult try_demangle(const char * name);
|