svn commit: r255813 - vendor/libcxxrt/dist

David Chisnall theraven at FreeBSD.org
Mon Sep 23 11:35:51 UTC 2013


Author: theraven
Date: Mon Sep 23 11:35:49 2013
New Revision: 255813
URL: http://svnweb.freebsd.org/changeset/base/255813

Log:
  Imported newer libcxxrt into vendor branch.

Modified:
  vendor/libcxxrt/dist/libelftc_dem_gnu3.c
  vendor/libcxxrt/dist/typeinfo.cc
  vendor/libcxxrt/dist/unwind-itanium.h

Modified: vendor/libcxxrt/dist/libelftc_dem_gnu3.c
==============================================================================
--- vendor/libcxxrt/dist/libelftc_dem_gnu3.c	Mon Sep 23 10:36:03 2013	(r255812)
+++ vendor/libcxxrt/dist/libelftc_dem_gnu3.c	Mon Sep 23 11:35:49 2013	(r255813)
@@ -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: vendor/libcxxrt/dist/typeinfo.cc
==============================================================================
--- vendor/libcxxrt/dist/typeinfo.cc	Mon Sep 23 10:36:03 2013	(r255812)
+++ vendor/libcxxrt/dist/typeinfo.cc	Mon Sep 23 11:35:49 2013	(r255813)
@@ -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: vendor/libcxxrt/dist/unwind-itanium.h
==============================================================================
--- vendor/libcxxrt/dist/unwind-itanium.h	Mon Sep 23 10:36:03 2013	(r255812)
+++ vendor/libcxxrt/dist/unwind-itanium.h	Mon Sep 23 11:35:49 2013	(r255813)
@@ -80,7 +80,7 @@ struct _Unwind_Exception
     _Unwind_Exception_Cleanup_Fn exception_cleanup;
     unsigned long private_1;
     unsigned long private_2;
-  } __attribute__((__aligned__));
+  } ;
 
 extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
 extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,


More information about the svn-src-all mailing list