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 | |
parent | becd5d8b40af38d97134dfb491f109e0d1688976 (diff) | |
download | libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.gz libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.bz2 libcxxrt-a283c64f6b95ec2db1b4b6004f27b1e448961e73.tar.xz |
Add __cxa_demangle support
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/exception.cc | 7 | ||||
-rw-r--r-- | src/typeinfo.cc | 38 |
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; +} |