Remove compat hacks from libcxxrt's _Unwind_Exception

This reverts 9097e3cbca, which was in itself a revert of upstream
libcxxrt commits 88bdf6b290da ("Specify double-word alignment for ARM
unwind") and b96169641f79 ("Updated Itanium unwind"), and a
reapplication of our commit 3c4fd2463b ("libcxxrt: add padding in
__cxa_allocate_* to fix alignment").

The editors/libreoffice port will be patched to be able to cope with the
standards-compliant alignment of _Unwind_Exception and consequently,
that of __cxa_exception. The layouts and sizes of these structures
should then be completely the same for libcxxrt, libunwind and
libc++abi.

PR:		262008
Reviewed by:	emaste, jhb, theraven
MFC after:	3 days
Differential Revision: https://reviews.freebsd.org/D34488
This commit is contained in:
Dimitry Andric 2022-03-08 22:53:16 +01:00
parent 7e64519a47
commit 72df847a94
3 changed files with 13 additions and 28 deletions

View file

@ -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 * 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 * 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) extern "C" void *__cxa_allocate_exception(size_t thrown_size)
{ {
size_t size = exception_alignment_padding + sizeof(__cxa_exception) + size_t size = thrown_size + sizeof(__cxa_exception);
thrown_size;
char *buffer = alloc_or_die(size); 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) extern "C" void *__cxa_allocate_dependent_exception(void)
{ {
size_t size = exception_alignment_padding + size_t size = sizeof(__cxa_dependent_exception);
sizeof(__cxa_dependent_exception);
char *buffer = alloc_or_die(size); char *buffer = alloc_or_die(size);
return buffer + exception_alignment_padding + return buffer+sizeof(__cxa_dependent_exception);
sizeof(__cxa_dependent_exception);
} }
/** /**
@ -633,8 +617,7 @@ extern "C" void __cxa_free_exception(void *thrown_exception)
} }
} }
free_exception(reinterpret_cast<char*>(ex) - free_exception(reinterpret_cast<char*>(ex));
exception_alignment_padding);
} }
static void releaseException(__cxa_exception *exception) 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))); releaseException(realExceptionFromException(reinterpret_cast<__cxa_exception*>(ex)));
} }
free_exception(reinterpret_cast<char*>(ex) - free_exception(reinterpret_cast<char*>(ex));
exception_alignment_padding);
} }
/** /**

View file

@ -97,7 +97,7 @@ struct _Unwind_Exception
} pr_cache; } pr_cache;
/** Force alignment of next item to 8-byte boundary */ /** Force alignment of next item to 8-byte boundary */
long long int :0; long long int :0;
}; } __attribute__((__aligned__(8)));
/* Unwinding functions */ /* Unwinding functions */
_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *ucbp); _Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *ucbp);

View file

@ -79,9 +79,12 @@ struct _Unwind_Exception
{ {
uint64_t exception_class; uint64_t exception_class;
_Unwind_Exception_Cleanup_Fn exception_cleanup; _Unwind_Exception_Cleanup_Fn exception_cleanup;
unsigned long private_1; uintptr_t private_1;
unsigned long private_2; 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_RaiseException (struct _Unwind_Exception *);
extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,