summaryrefslogtreecommitdiff
path: root/src/typeinfo.cc
diff options
context:
space:
mode:
authoranonymous <local@localhost>2010-09-29 23:20:49 +0000
committeranonymous <local@localhost>2010-09-29 23:20:58 +0000
commita283c64f6b95ec2db1b4b6004f27b1e448961e73 (patch)
tree01d89942a1ba29a1ce64127911bdf978d80cef87 /src/typeinfo.cc
parentbecd5d8b40af38d97134dfb491f109e0d1688976 (diff)
downloadlibcxxrt-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.cc38
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;
+}