summaryrefslogtreecommitdiff
path: root/src
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
parentbecd5d8b40af38d97134dfb491f109e0d1688976 (diff)
downloadlibcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.gz
libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.bz2
libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.xz
Add __cxa_demangle support
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/exception.cc7
-rw-r--r--src/typeinfo.cc38
3 files changed, 43 insertions, 4 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d30da28..7633f03 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -8,6 +8,8 @@ set(CXXRT_SOURCES
stdexcept.cc
memory.cc
aux.cc
+ libelftc_dem_gnu3.c
+ libelftc_vstr.c
)
diff --git a/src/exception.cc b/src/exception.cc
index 749f743..0ecc679 100644
--- a/src/exception.cc
+++ b/src/exception.cc
@@ -443,18 +443,17 @@ static void report_failure(_Unwind_Reason_Code err, void *thrown_exception)
fprintf(stderr, "Fatal error during phase 2 unwinding\n");
break;
case _URC_END_OF_STACK:
- fprintf(stderr, "Terminating due to uncaught exception %p:\n",
+ fprintf(stderr, "Terminating due to uncaught exception %p",
thrown_exception);
-/* TODO: Uncomment this when __cxa_demangle() is implemented.
size_t bufferSize = 128;
char *demangled = (char*)malloc(bufferSize);
const char *mangled = __cxa_current_exception_type()->name();
int status;
__cxa_demangle(mangled, demangled, &bufferSize, &status);
- fprintf(stderr, "Terminating due to uncaught of type %s:\n",
+ fprintf(stderr, " of type %s\n",
status == 0 ? (const char*)demangled : mangled);
-*/
+ if (status == 0) { free(demangled); }
// Print a back trace if no handler is found.
// TODO: Make this optional
_Unwind_Backtrace(trace, 0);
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;
+}