The branch stable/13 has been updated by dim:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=6af57633d7a06ed1ff260f14345caba108f2a16a

commit 6af57633d7a06ed1ff260f14345caba108f2a16a
Author:     Dimitry Andric <[email protected]>
AuthorDate: 2021-02-20 20:39:43 +0000
Commit:     Dimitry Andric <[email protected]>
CommitDate: 2021-02-20 20:39:43 +0000

    Revert "Revert 3c4fd2463bb2 since upstream libcxxrt fixed it in another way"
    
    This reverts commit aeb00dca0d03e235c5aaabeef0ada9931d680a80, since I
    messed up and didn't merge the earlier libcxxrt changes first.
---
 contrib/libcxxrt/exception.cc | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/contrib/libcxxrt/exception.cc b/contrib/libcxxrt/exception.cc
index 0fb26ddb4ed2..0de878e9e6db 100644
--- a/contrib/libcxxrt/exception.cc
+++ b/contrib/libcxxrt/exception.cc
@@ -572,6 +572,19 @@ 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
@@ -580,16 +593,19 @@ static void free_exception(char *e)
  */
 extern "C" void *__cxa_allocate_exception(size_t thrown_size)
 {
-       size_t size = thrown_size + sizeof(__cxa_exception);
+       size_t size = exception_alignment_padding + sizeof(__cxa_exception) +
+           thrown_size;
        char *buffer = alloc_or_die(size);
-       return buffer+sizeof(__cxa_exception);
+       return buffer + exception_alignment_padding + sizeof(__cxa_exception);
 }
 
 extern "C" void *__cxa_allocate_dependent_exception(void)
 {
-       size_t size = sizeof(__cxa_dependent_exception);
+       size_t size = exception_alignment_padding +
+           sizeof(__cxa_dependent_exception);
        char *buffer = alloc_or_die(size);
-       return buffer+sizeof(__cxa_dependent_exception);
+       return buffer + exception_alignment_padding +
+           sizeof(__cxa_dependent_exception);
 }
 
 /**
@@ -617,7 +633,8 @@ 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)
@@ -644,7 +661,8 @@ void __cxa_free_dependent_exception(void *thrown_exception)
        {
                
releaseException(realExceptionFromException(reinterpret_cast<__cxa_exception*>(ex)));
        }
-       free_exception(reinterpret_cast<char*>(ex));
+       free_exception(reinterpret_cast<char*>(ex) -
+           exception_alignment_padding);
 }
 
 /**
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to