Remove compat hacks from libcxxrt's _Unwind_Exception
This reverts9097e3cbca
, 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 commit3c4fd2463b
("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:
parent
7e64519a47
commit
72df847a94
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -97,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);
|
||||
|
@ -79,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 *,
|
||||
|
Loading…
Reference in New Issue
Block a user