diff options
author | anonymous <local@localhost> | 2010-09-29 23:20:49 +0000 |
---|---|---|
committer | anonymous <local@localhost> | 2010-09-29 23:20:58 +0000 |
commit | a283c64f6b95ec2db1b4b6004f27b1e448961e73 (patch) | |
tree | 01d89942a1ba29a1ce64127911bdf978d80cef87 /src/typeinfo.cc | |
parent | becd5d8b40af38d97134dfb491f109e0d1688976 (diff) | |
download | libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.gz libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.bz2 libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.xz |
Add __cxa_demangle support
Diffstat (limited to 'src/typeinfo.cc')
-rw-r--r-- | src/typeinfo.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/typeinfo.cc b/src/typeinfo.cc index cc2b3c7..6d16668 100644 --- a/src/typeinfo.cc +++ b/src/typeinfo.cc @@ -1,4 +1,7 @@ #include "typeinfo.h" +#include <string.h> +#include <stdlib.h> +#include <stdio.h> using std::type_info; @@ -39,3 +42,38 @@ ABI_NAMESPACE::__vmi_class_type_info::~__vmi_class_type_info() {} ABI_NAMESPACE::__pbase_type_info::~__pbase_type_info() {} ABI_NAMESPACE::__pointer_type_info::~__pointer_type_info() {} ABI_NAMESPACE::__pointer_to_member_type_info::~__pointer_to_member_type_info() {} + +// From libelftc +extern "C" char *cpp_demangle_gnu3(const char *); +extern "C" bool is_cpp_mangled_gnu3(const char *); + +extern "C" char* __cxa_demangle(const char* mangled_name, + char* buf, + size_t* n, + int* status) +{ + char *demangled = cpp_demangle_gnu3(mangled_name); + if (NULL != demangled) + { + size_t len = strlen(demangled); + buf = (char*)realloc(buf, len+1); + if (0 != buf) + { + memcpy(buf, demangled, len); + buf[len] = 0; + *n = len; + *status = 0; + } + else + { + *status = -1; + } + free(demangled); + } + else + { + *status = -2; + return NULL; + } + return buf; +} |