Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Feb 2021 20:03:31 GMT
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 9e86d1669765 - stable/12 - Revert 3c4fd2463bb2 since upstream libcxxrt fixed it in another way
Message-ID:  <202102202003.11KK3VDg005781@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by dim:

URL: https://cgit.FreeBSD.org/src/commit/?id=9e86d16697654c58ae65fd13e2a35fc755ecf73a

commit 9e86d16697654c58ae65fd13e2a35fc755ecf73a
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2021-02-19 18:18:22 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2021-02-20 20:00:55 +0000

    Revert 3c4fd2463bb2 since upstream libcxxrt fixed it in another way
    
    In 0ee0dbfb0d26cf4bc37f24f12e76c7f532b0f368 I imported a more recent
    libcxxrt snapshot, which includes an upstream fix for the padding of
    struct _Unwind_Exception:
    
    https://github.com/libcxxrt/libcxxrt/commit/e458560b7e22fff59af643dba363544b393bd8db
    
    However, we also had a similar fix in our tree as:
    https://cgit.freebsd.org/src/commit/?id=3c4fd2463bb29f65ef1404011fcb31e508cdf2e2
    
    Since having both fixes makes the struct too large again, it leads to
    SIGBUSes when throwing exceptions on amd64 (or other LP64 arches). This
    is most easily tested by running kyua without any arguments.
    
    It looks like our fix is no longer needed now, so revert it to reduce
    diffs against upstream.
    
    PR:             253226
    Reviewed by:    arichardson, kp
    Differential Revision: https://reviews.freebsd.org/D28799
    
    (cherry picked from commit d2b3fadf2db56131376a71b0597876b591a6aee4)
---
 contrib/libcxxrt/exception.cc | 30 ++++++------------------------
 1 file changed, 6 insertions(+), 24 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));
 }
 
 /**



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102202003.11KK3VDg005781>