aboutsummaryrefslogtreecommitdiff
path: root/contrib/libcxxrt
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libcxxrt')
-rw-r--r--contrib/libcxxrt/exception.cc30
-rw-r--r--contrib/libcxxrt/libelftc_dem_gnu3.c14
-rw-r--r--contrib/libcxxrt/unwind-arm.h3
-rw-r--r--contrib/libcxxrt/unwind-itanium.h10
4 files changed, 26 insertions, 31 deletions
diff --git a/contrib/libcxxrt/exception.cc b/contrib/libcxxrt/exception.cc
index 0de878e9e6db..0fb26ddb4ed2 100644
--- a/contrib/libcxxrt/exception.cc
+++ b/contrib/libcxxrt/exception.cc
@@ -572,19 +572,6 @@ static void free_exception(char *e)
}
}
-#ifdef __LP64__
-/**
- * There's an ABI bug in __cxa_exception: unwindHeader requires 16-byte
- * alignment but it was broken by the addition of the referenceCount.
- * The unwindHeader is at offset 0x58 in __cxa_exception. In order to keep
- * compatibility with consumers of the broken __cxa_exception, explicitly add
- * padding on allocation (and account for it on free).
- */
-static const int exception_alignment_padding = 8;
-#else
-static const int exception_alignment_padding = 0;
-#endif
-
/**
* Allocates an exception structure. Returns a pointer to the space that can
* be used to store an object of thrown_size bytes. This function will use an
@@ -593,19 +580,16 @@ static const int exception_alignment_padding = 0;
*/
extern "C" void *__cxa_allocate_exception(size_t thrown_size)
{
- size_t size = exception_alignment_padding + sizeof(__cxa_exception) +
- thrown_size;
+ size_t size = thrown_size + sizeof(__cxa_exception);
char *buffer = alloc_or_die(size);
- return buffer + exception_alignment_padding + sizeof(__cxa_exception);
+ return buffer+sizeof(__cxa_exception);
}
extern "C" void *__cxa_allocate_dependent_exception(void)
{
- size_t size = exception_alignment_padding +
- sizeof(__cxa_dependent_exception);
+ size_t size = sizeof(__cxa_dependent_exception);
char *buffer = alloc_or_die(size);
- return buffer + exception_alignment_padding +
- sizeof(__cxa_dependent_exception);
+ return buffer+sizeof(__cxa_dependent_exception);
}
/**
@@ -633,8 +617,7 @@ extern "C" void __cxa_free_exception(void *thrown_exception)
}
}
- free_exception(reinterpret_cast<char*>(ex) -
- exception_alignment_padding);
+ free_exception(reinterpret_cast<char*>(ex));
}
static void releaseException(__cxa_exception *exception)
@@ -661,8 +644,7 @@ void __cxa_free_dependent_exception(void *thrown_exception)
{
releaseException(realExceptionFromException(reinterpret_cast<__cxa_exception*>(ex)));
}
- free_exception(reinterpret_cast<char*>(ex) -
- exception_alignment_padding);
+ free_exception(reinterpret_cast<char*>(ex));
}
/**
diff --git a/contrib/libcxxrt/libelftc_dem_gnu3.c b/contrib/libcxxrt/libelftc_dem_gnu3.c
index a8d061591826..6e88f7b4bb4c 100644
--- a/contrib/libcxxrt/libelftc_dem_gnu3.c
+++ b/contrib/libcxxrt/libelftc_dem_gnu3.c
@@ -541,9 +541,19 @@ __cxa_demangle_gnu3(const char *org)
char *rtn;
bool has_ret, more_type;
- if (org == NULL || (org_len = strlen(org)) < 2)
+ if (org == NULL)
return (NULL);
+ org_len = strlen(org);
+ // Try demangling as a type for short encodings
+ 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))
+ goto clean;
+ 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);
@@ -552,8 +562,6 @@ __cxa_demangle_gnu3(const char *org)
return (rtn);
}
- if (org[0] != '_' || org[1] != 'Z')
- return (NULL);
if (!cpp_demangle_data_init(&ddata, org + 2))
return (NULL);
diff --git a/contrib/libcxxrt/unwind-arm.h b/contrib/libcxxrt/unwind-arm.h
index a4bf1bd058bc..ec81237e573b 100644
--- a/contrib/libcxxrt/unwind-arm.h
+++ b/contrib/libcxxrt/unwind-arm.h
@@ -29,6 +29,7 @@
*/
typedef enum
{
+ _URC_NO_REASON = 0,
_URC_OK = 0, /* operation completed successfully */
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
_URC_END_OF_STACK = 5,
@@ -96,7 +97,7 @@ struct _Unwind_Exception
} pr_cache;
/** Force alignment of next item to 8-byte boundary */
long long int :0;
-};
+} __attribute__((__aligned__(8)));
/* Unwinding functions */
_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *ucbp);
diff --git a/contrib/libcxxrt/unwind-itanium.h b/contrib/libcxxrt/unwind-itanium.h
index 0ca9488605aa..199d91de283d 100644
--- a/contrib/libcxxrt/unwind-itanium.h
+++ b/contrib/libcxxrt/unwind-itanium.h
@@ -40,6 +40,7 @@ extern "C" {
typedef enum
{
_URC_NO_REASON = 0,
+ _URC_OK = 0,
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
_URC_FATAL_PHASE2_ERROR = 2,
_URC_FATAL_PHASE1_ERROR = 3,
@@ -78,9 +79,12 @@ struct _Unwind_Exception
{
uint64_t exception_class;
_Unwind_Exception_Cleanup_Fn exception_cleanup;
- unsigned long private_1;
- unsigned long private_2;
- } ;
+ uintptr_t private_1;
+ uintptr_t private_2;
+#if __SIZEOF_POINTER__ == 4
+ uint32_t reserved[3];
+#endif
+ } __attribute__((__aligned__));
extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,