aboutsummaryrefslogtreecommitdiff
path: root/libphobos/libdruntime
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-09-25 19:50:52 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2021-09-30 15:07:19 +0200
commitefa5449a094d3887e124d400ff0410af2c745b2d (patch)
tree4d063fa0150fe3888801c3776ca111df26f06e18 /libphobos/libdruntime
parentd46a29d919058fb383d19fe35c234fab58286f71 (diff)
downloadgcc-efa5449a094d3887e124d400ff0410af2c745b2d.zip
gcc-efa5449a094d3887e124d400ff0410af2c745b2d.tar.gz
gcc-efa5449a094d3887e124d400ff0410af2c745b2d.tar.bz2
libphobos: Give _Unwind_Exception an alignment that best resembles __attribute__((aligned))
For interoperability with C++ EH, the alignment should match, otherwise D may not be able to intercept exceptions thrown from C++. libphobos/ChangeLog: * libdruntime/gcc/unwind/generic.d (__aligned__): Define. (_Unwind_Exception): Align struct to __aligned__.
Diffstat (limited to 'libphobos/libdruntime')
-rw-r--r--libphobos/libdruntime/gcc/unwind/generic.d22
1 files changed, 21 insertions, 1 deletions
diff --git a/libphobos/libdruntime/gcc/unwind/generic.d b/libphobos/libdruntime/gcc/unwind/generic.d
index 592b3af..68ddd1d 100644
--- a/libphobos/libdruntime/gcc/unwind/generic.d
+++ b/libphobos/libdruntime/gcc/unwind/generic.d
@@ -123,7 +123,27 @@ enum : _Unwind_Reason_Code
// @@@ The IA-64 ABI says that this structure must be double-word aligned.
// Taking that literally does not make much sense generically. Instead we
// provide the maximum alignment required by any type for the machine.
-struct _Unwind_Exception
+ version (ARM) private enum __aligned__ = 8;
+else version (AArch64) private enum __aligned__ = 16;
+else version (HPPA) private enum __aligned__ = 8;
+else version (HPPA64) private enum __aligned__ = 16;
+else version (MIPS_N32) private enum __aligned__ = 16;
+else version (MIPS_N64) private enum __aligned__ = 16;
+else version (MIPS32) private enum __aligned__ = 8;
+else version (MIPS64) private enum __aligned__ = 8;
+else version (PPC) private enum __aligned__ = 16;
+else version (PPC64) private enum __aligned__ = 16;
+else version (RISCV32) private enum __aligned__ = 16;
+else version (RISCV64) private enum __aligned__ = 16;
+else version (S390) private enum __aligned__ = 8;
+else version (SPARC) private enum __aligned__ = 8;
+else version (SPARC64) private enum __aligned__ = 16;
+else version (SystemZ) private enum __aligned__ = 8;
+else version (X86) private enum __aligned__ = 16;
+else version (X86_64) private enum __aligned__ = 16;
+else static assert( false, "Platform not supported.");
+
+align(__aligned__) struct _Unwind_Exception
{
_Unwind_Exception_Class exception_class;
_Unwind_Exception_Cleanup_Fn exception_cleanup;