Here is some black magic extracted from upstream that fixes building
editors/libreoffice with libc++ 10.0, at least on amd64.

https://github.com/LibreOffice/core/commit/cc5a6c6afeed1d2cf76d288133971d29ee8d893e

ok?

Index: Makefile
===================================================================
RCS file: /cvs/ports/editors/libreoffice/Makefile,v
retrieving revision 1.239
diff -u -p -r1.239 Makefile
--- Makefile    22 Dec 2020 15:28:19 -0000      1.239
+++ Makefile    10 Jan 2021 23:21:17 -0000
@@ -38,6 +38,8 @@ DPB_PROPERTIES=       parallel
 
 EPOCH=         0
 
+REVISION=      0
+
 MAINTAINER=    Robert Nagy <rob...@openbsd.org>
 
 HOMEPAGE=      http://www.libreoffice.org/
Index: patches/patch-bridges_source_cpp_uno_gcc3_linux_x86-64_except_cxx
===================================================================
RCS file: patches/patch-bridges_source_cpp_uno_gcc3_linux_x86-64_except_cxx
diff -N patches/patch-bridges_source_cpp_uno_gcc3_linux_x86-64_except_cxx
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-bridges_source_cpp_uno_gcc3_linux_x86-64_except_cxx   10 Jan 
2021 23:21:17 -0000
@@ -0,0 +1,69 @@
+$OpenBSD$
+
+gcc3_linux_x86_64 needs a hack to detect the reserve member in LLVM >= 10
+libcxxabi __cxa_exception, in addition to the existing hack for LLVM 5.
+https://github.com/LibreOffice/core/commit/cc5a6c6afeed1d2cf76d288133971d29ee8d893e
+
+Index: bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
+--- bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx.orig
++++ bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
+@@ -82,6 +82,59 @@ extern "C" {
+ static void _GLIBCXX_CDTOR_CALLABI deleteException( void * pExc )
+ {
+     __cxxabiv1::__cxa_exception const * header = 
static_cast<__cxxabiv1::__cxa_exception const *>(pExc) - 1;
++#if defined _LIBCPPABI_VERSION // detect libc++abi
++    // First, the libcxxabi commit
++    // <http://llvm.org/viewvc/llvm-project?view=revision&revision=303175>
++    // "[libcxxabi] Align unwindHeader on a double-word boundary" towards
++    // LLVM 5.0 changed the size of __cxa_exception by adding
++    //
++    //   __attribute__((aligned))
++    //
++    // to the final member unwindHeader, on x86-64 effectively adding a hole 
of
++    // size 8 in front of that member (changing its offset from 88 to 96,
++    // sizeof(__cxa_exception) from 120 to 128, and alignof(__cxa_exception)
++    // from 8 to 16); the "header1" hack below to dynamically determine 
whether we run against a
++    // LLVM 5 libcxxabi is to look at the exceptionDestructor member, which 
must
++    // point to this function (the use of __cxa_exception in fillUnoException 
is
++    // unaffected, as it only accesses members towards the start of the 
struct,
++    // through a pointer known to actually point at the start).  The 
libcxxabi commit
++    // 
<https://github.com/llvm/llvm-project/commit/9ef1daa46edb80c47d0486148c0afc4e0d83ddcf>
++    // "Insert padding before the __cxa_exception header to ensure the 
thrown" in LLVM 6
++    // removes the need for this hack, so the "header1" hack can be removed 
again once we can be
++    // sure that we only run against libcxxabi from LLVM >= 6.
++    //
++    // Second, the libcxxabi commit
++    // 
<https://github.com/llvm/llvm-project/commit/674ec1eb16678b8addc02a4b0534ab383d22fa77>
++    // "[libcxxabi] Insert padding in __cxa_exception struct for 
compatibility" in LLVM 10 changed
++    // the layout of the start of __cxa_exception to
++    //
++    //  [8 byte  void *reserve]
++    //   8 byte  size_t referenceCount
++    //
++    // so the "header2" hack below to dynamically determine whether we run 
against a LLVM >= 10
++    // libcxxabi is to look whether the exceptionDestructor (with its known 
value) has increased its
++    // offset by 8.  As described in the definition of __cxa_exception
++    // (bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx), the "header2" 
hack (together with the
++    // "#if 0" in the definition of __cxa_exception and the corresponding 
hack in fillUnoException)
++    // can be dropped once we can be sure that we only run against new 
libcxxabi that has the
++    // reserve member.
++    if (header->exceptionDestructor != &deleteException) {
++        auto const header1 = reinterpret_cast<__cxa_exception const *>(
++            reinterpret_cast<char const *>(header) - 8);
++        if (header1->exceptionDestructor == &deleteException) {
++            header = header1;
++        } else {
++            auto const header2 = reinterpret_cast<__cxa_exception const *>(
++                reinterpret_cast<char const *>(header) + 8);
++            if (header2->exceptionDestructor == &deleteException) {
++                header = header2;
++            } else {
++                assert(false);
++            }
++        }
++    }
++#endif
++    assert(header->exceptionDestructor == &deleteException);
+     typelib_TypeDescription * pTD = nullptr;
+     OUString unoName( toUNOname( header->exceptionType->name() ) );
+     ::typelib_typedescription_getByName( &pTD, unoName.pData );
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to