Date: Sun, 9 Feb 2014 00:37:17 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r261645 - in stable/9: contrib/libcxxrt lib/libcxxrt Message-ID: <201402090037.s190bHP8082578@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Sun Feb 9 00:37:16 2014 New Revision: 261645 URL: http://svnweb.freebsd.org/changeset/base/261645 Log: MFC r255093 (by theraven): Don't use _Unwind_Backtrace() on ARM as it's currently missing from our libgcc_s. andrew@ has patches to add it, so this can be reverted and sync'd with upstream later. MFC r255815 (by theraven): Import a new libcxxrt. This fixes some potential crashing in the demangler. MFC r260553 (by theraven): Add missing C++11 typeinfos to the libcxxrt version script. PR: 185663 Modified: stable/9/contrib/libcxxrt/exception.cc stable/9/contrib/libcxxrt/libelftc_dem_gnu3.c stable/9/contrib/libcxxrt/typeinfo.cc stable/9/contrib/libcxxrt/unwind-itanium.h stable/9/lib/libcxxrt/Version.map Directory Properties: stable/9/contrib/libcxxrt/ (props changed) stable/9/lib/libcxxrt/ (props changed) Modified: stable/9/contrib/libcxxrt/exception.cc ============================================================================== --- stable/9/contrib/libcxxrt/exception.cc Sun Feb 9 00:34:21 2014 (r261644) +++ stable/9/contrib/libcxxrt/exception.cc Sun Feb 9 00:37:16 2014 (r261645) @@ -715,7 +715,9 @@ static void report_failure(_Unwind_Reaso if (status == 0) { free(demangled); } // Print a back trace if no handler is found. // TODO: Make this optional +#ifndef __arm__ _Unwind_Backtrace(trace, 0); +#endif break; } std::terminate(); Modified: stable/9/contrib/libcxxrt/libelftc_dem_gnu3.c ============================================================================== --- stable/9/contrib/libcxxrt/libelftc_dem_gnu3.c Sun Feb 9 00:34:21 2014 (r261644) +++ stable/9/contrib/libcxxrt/libelftc_dem_gnu3.c Sun Feb 9 00:37:16 2014 (r261645) @@ -405,6 +405,7 @@ static int cpp_demangle_read_expression_ const char *, size_t, const char *, size_t); static int cpp_demangle_read_function(struct cpp_demangle_data *, int *, struct vector_type_qualifier *); +static int cpp_demangle_local_source_name(struct cpp_demangle_data *ddata); static int cpp_demangle_read_local_name(struct cpp_demangle_data *); static int cpp_demangle_read_name(struct cpp_demangle_data *); static int cpp_demangle_read_nested_name(struct cpp_demangle_data *); @@ -453,13 +454,22 @@ __cxa_demangle_gnu3(const char *org) struct cpp_demangle_data ddata; ssize_t org_len; unsigned int limit; - char *rtn; + char *rtn = NULL; if (org == NULL) return (NULL); + org_len = strlen(org); + if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) { + if ((rtn = malloc(org_len + 19)) == NULL) + return (NULL); + snprintf(rtn, org_len + 19, + "global constructors keyed to %s", org + 11); + return (rtn); + } + // Try demangling as a type for short encodings - if (((org_len = strlen(org)) < 2) || (org[0] != '_' || org[1] != 'Z' )) { + if ((org_len < 2) || (org[0] != '_' || org[1] != 'Z' )) { if (!cpp_demangle_data_init(&ddata, org)) return (NULL); if (!cpp_demangle_read_type(&ddata, 0)) @@ -467,13 +477,6 @@ __cxa_demangle_gnu3(const char *org) rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL); goto clean; } - if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) { - if ((rtn = malloc(org_len + 19)) == NULL) - return (NULL); - snprintf(rtn, org_len + 19, - "global constructors keyed to %s", org + 11); - return (rtn); - } if (!cpp_demangle_data_init(&ddata, org + 2)) @@ -604,13 +607,12 @@ cpp_demangle_push_fp(struct cpp_demangle return (0); rtn = 0; - if ((len = strlen(f)) > 0 && - cpp_demangle_push_str(ddata, f, len)) - rtn = 1; + if ((len = strlen(f)) > 0) + rtn = cpp_demangle_push_str(ddata, f, len); free(f); - return (0); + return (rtn); } static int @@ -655,6 +657,7 @@ cpp_demangle_push_subst_v(struct cpp_dem return (0); rtn = cpp_demangle_push_subst(ddata, str, str_len); + free(str); return (rtn); @@ -1868,9 +1871,18 @@ static int cpp_demangle_read_sname(struct cpp_demangle_data *ddata) { long len; + int err; if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 || - len <= 0 || cpp_demangle_push_str(ddata, ddata->cur, len) == 0) + len <= 0) + return (0); + + if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0)) + err = cpp_demangle_push_str(ddata, "(anonymous namespace)", 21); + else + err = cpp_demangle_push_str(ddata, ddata->cur, len); + + if (err == 0) return (0); assert(ddata->output.size > 0); @@ -2054,7 +2066,7 @@ clean: free(subst_str); vector_str_dest(&v); - return (1); + return (rtn); } static int @@ -2996,6 +3008,40 @@ cpp_demangle_read_uqname(struct cpp_dema if (ELFTC_ISDIGIT(*ddata->cur) != 0) return (cpp_demangle_read_sname(ddata)); + + /* local source name */ + if (*ddata->cur == 'L') + return (cpp_demangle_local_source_name(ddata)); + + return (1); +} + +/* + * Read local source name. + * + * References: + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775 + * http://gcc.gnu.org/viewcvs?view=rev&revision=124467 + */ +static int +cpp_demangle_local_source_name(struct cpp_demangle_data *ddata) +{ + /* L */ + if (ddata == NULL || *ddata->cur != 'L') + return (0); + ++ddata->cur; + + /* source name */ + if (!cpp_demangle_read_sname(ddata)) + return (0); + + /* discriminator */ + if (*ddata->cur == '_') { + ++ddata->cur; + while (ELFTC_ISDIGIT(*ddata->cur) != 0) + ++ddata->cur; + } + return (1); } Modified: stable/9/contrib/libcxxrt/typeinfo.cc ============================================================================== --- stable/9/contrib/libcxxrt/typeinfo.cc Sun Feb 9 00:34:21 2014 (r261644) +++ stable/9/contrib/libcxxrt/typeinfo.cc Sun Feb 9 00:37:16 2014 (r261645) @@ -86,7 +86,18 @@ extern "C" char* __cxa_demangle(const ch if (NULL != demangled) { size_t len = strlen(demangled); - buf = (char*)realloc(buf, len+1); + if (buf == NULL) + { + if (n) + { + *n = len; + } + return demangled; + } + if (*n < len+1) + { + buf = (char*)realloc(buf, len+1); + } if (0 != buf) { memcpy(buf, demangled, len); Modified: stable/9/contrib/libcxxrt/unwind-itanium.h ============================================================================== --- stable/9/contrib/libcxxrt/unwind-itanium.h Sun Feb 9 00:34:21 2014 (r261644) +++ stable/9/contrib/libcxxrt/unwind-itanium.h Sun Feb 9 00:37:16 2014 (r261645) @@ -80,7 +80,7 @@ struct _Unwind_Exception _Unwind_Exception_Cleanup_Fn exception_cleanup; unsigned long private_1; unsigned long private_2; - }; + } ; extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *); extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, Modified: stable/9/lib/libcxxrt/Version.map ============================================================================== --- stable/9/lib/libcxxrt/Version.map Sun Feb 9 00:34:21 2014 (r261644) +++ stable/9/lib/libcxxrt/Version.map Sun Feb 9 00:37:16 2014 (r261645) @@ -111,6 +111,19 @@ CXXABI_1.3 { "typeinfo for void"; "typeinfo for wchar_t const*"; "typeinfo for wchar_t"; + # C++11 typeinfo not understood by our linker + # std::nullptr_t + _ZTIDn;_ZTIPDn;_ZTIPKDn; + # char16_t + _ZTIDi;_ZTIPDi;_ZTIPKDi; + # char32_t + _ZTIDs;_ZTIPDs;_ZTIPKDs; + # IEEE 754r decimal floating point + _ZTIDd;_ZTIPDd;_ZTIPKDd; + _ZTIDe;_ZTIPDe;_ZTIPKDe; + _ZTIDf;_ZTIPDf;_ZTIPKDf; + # IEEE 754r half-precision floating point + _ZTIDh;_ZTIPDh;_ZTIPKDh; "typeinfo for bool*"; "typeinfo for wchar_t*"; @@ -195,6 +208,19 @@ CXXABI_1.3 { "typeinfo name for void*"; "typeinfo name for unsigned int*"; "typeinfo name for float*"; + # C++11 typeinfo not understood by our linker + # std::nullptr_t + _ZTSDn;_ZTIPDn;_ZTIPKDn; + # char16_t + _ZTSDi;_ZTIPDi;_ZTIPKDi; + # char32_t + _ZTSDs;_ZTIPDs;_ZTIPKDs; + # IEEE 754r decimal floating point + _ZTSDd;_ZTIPDd;_ZTIPKDd; + _ZTSDe;_ZTIPDe;_ZTIPKDe; + _ZTSDf;_ZTIPDf;_ZTIPKDf; + # IEEE 754r half-precision floating point + _ZTSDh;_ZTIPDh;_ZTIPKDh; "typeinfo name for __cxxabiv1::__array_type_info"; "typeinfo name for __cxxabiv1::__class_type_info";
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402090037.s190bHP8082578>