FreeBSD Bugzilla – Attachment 233272 Details for
Bug 262008
editors/libreoffice failed to build
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
editors/libreoffice: apply __cxa_exception workaround for powerpc*
editors__libreoffice-cxa-exception-workaround-powerpc-1.diff (text/plain), 8.00 KB, created by
Dimitry Andric
on 2022-04-17 13:26:27 UTC
(
hide
)
Description:
editors/libreoffice: apply __cxa_exception workaround for powerpc*
Filename:
MIME Type:
Creator:
Dimitry Andric
Created:
2022-04-17 13:26:27 UTC
Size:
8.00 KB
patch
obsolete
>commit 68ae7c433aafa9de59922d9a6153a0d2365f6417 >Author: Dimitry Andric <dim@FreeBSD.org> >Date: Sun Apr 17 15:24:02 2022 +0200 > > editors/libreoffice: apply __cxa_exception workaround for powerpc* > >diff --git a/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc64_except.cxx b/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc64_except.cxx >new file mode 100644 >index 000000000000..c89e53c92750 >--- /dev/null >+++ b/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc64_except.cxx >@@ -0,0 +1,67 @@ >+--- bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx.orig 2022-03-23 13:32:00 UTC >++++ bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx >+@@ -189,10 +189,63 @@ type_info * RTTI::getRTTI( typelib_CompoundTypeDescrip >+ return rtti; >+ } >+ >+- >++extern "C" >+ static void deleteException( void * pExc ) >+ { >+ __cxa_exception const * header = ((__cxa_exception const *)pExc - 1); >++#if 1 >++ // 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 = 0; >+ OUString unoName( toUNOname( header->exceptionType->name() ) ); >+ ::typelib_typedescription_getByName( &pTD, unoName.pData ); >diff --git a/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc_except.cxx b/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc_except.cxx >new file mode 100644 >index 000000000000..a77a177bd483 >--- /dev/null >+++ b/editors/libreoffice/files/patch-bridges_source_cpp__uno_gcc3__linux__powerpc_except.cxx >@@ -0,0 +1,67 @@ >+--- bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx.orig 2022-03-23 13:32:00 UTC >++++ bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx >+@@ -189,10 +189,63 @@ type_info * RTTI::getRTTI( typelib_CompoundTypeDescrip >+ return rtti; >+ } >+ >+- >++extern "C" >+ static void deleteException( void * pExc ) >+ { >+ __cxa_exception const * header = ((__cxa_exception const *)pExc - 1); >++#if 1 >++ // 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 = 0; >+ OUString unoName( toUNOname( header->exceptionType->name() ) ); >+ ::typelib_typedescription_getByName( &pTD, unoName.pData );
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 262008
:
231887
|
231895
|
232152
|
232274
|
232330
| 233272