[Libreoffice-commits] core.git: bridges/Library_cpp_uno.mk

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Wed Aug 12 19:12:03 UTC 2020


 bridges/Library_cpp_uno.mk |    1 +
 1 file changed, 1 insertion(+)

New commits:
commit 2cb40c77cd05c1cb5a85468ff9801051829871e4
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Aug 12 18:42:48 2020 +0200
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Wed Aug 12 21:11:26 2020 +0200

    Let exceptions pass through aarch64 callVirtualFunction built with Clang
    
    At least with Clang 12 trunk on Linux, CustomTarget_testtools/uno_test aborted
    with
    
    libc++abi: terminating with uncaught exception of type com::sun::star::uno::RuntimeException
    
    at
    
    > #0  0x0000ffffad97e598 in raise () from /lib64/libc.so.6
    > #1  0x0000ffffad96ada0 in abort () from /lib64/libc.so.6
    > #2  0x0000ffffadbf704c in abort_message (format=format at entry=0xffffadbfa398 "terminating with %s exception of type %s") at /llvm/llvm-project/libcxxabi/src/abort_message.cpp:78
    > #3  0x0000ffffadbe50ec in demangling_terminate_handler () at /llvm/llvm-project/libcxxabi/src/cxa_default_handlers.cpp:67
    > #4  0x0000ffffadbf633c in std::__terminate (func=<optimized out>) at /llvm/llvm-project/libcxxabi/src/cxa_handlers.cpp:59
    > #5  0x0000ffffadbf92ac in __cxxabiv1::failed_throw (exception_header=0x361b5970) at /llvm/llvm-project/libcxxabi/src/cxa_exception.cpp:152
    > #6  __cxxabiv1::__cxa_throw (thrown_object=0x361b59f0, tinfo=0x43f5a0 <typeinfo for com::sun::star::uno::RuntimeException>, dest=0xffffa0575b84 <com::sun::star::uno::RuntimeException::~RuntimeException()>) at /llvm/llvm-project/libcxxabi/src/cxa_exception.cpp:283
    > #7  0x0000ffffa056944c in bridge_object::(anonymous namespace)::Test_Impl::getRaiseAttr1 (this=0x361810c0) at testtools/source/bridgetest/cppobj.cxx:296
    > #8  0x0000ffffa0644b70 in callVirtualFunction (function=281473371790408, gpr=0xffffcc4c1b68, fpr=0xffffcc4c1b28, stack=0xffffcc4c18d0, sp=0, ret=0xffffcc4c1cf0) at bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx:38
    > #9  0x0000ffffa064c5b4 in (anonymous namespace)::call (proxy=0x36193710, slot=..., returnType=0x3615b380, count=0, parameters=0x0, returnValue=0xffffcc4c1cf0, arguments=0xffffcc4c1cf0, exception=0xffffcc4c1e78) at bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx:176
    > #10 0x0000ffffa064bd58 in bridges::cpp_uno::shared::unoInterfaceProxyDispatch (pUnoI=0x36193710, pMemberDescr=0x361a5b70, pReturn=0xffffcc4c1cf0, pArgs=0xffffcc4c1cf0, ppException=0xffffcc4c1e78) at bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx:328
    > #11 0x0000ffffa064b174 in (anonymous namespace)::call (proxy=0x361a9280, description=..., returnType=0x3615b380, count=0, parameters=0x0, gpr=0xffffcc4c2070, fpr=0xffffcc4c20b0, stack=0xffffcc4c20f0, indirectRet=0x361a92a8) at bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx:120
    > #12 0x0000ffffa064a900 in vtableCall (functionIndex=37, vtableOffset=0, gpr=0xffffcc4c2070, fpr=0xffffcc4c20b0, stack=0xffffcc4c20f0, indirectRet=0x361a92a8) at bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx:240
    > #13 0x0000ffffa065c1cc in vtableSlotCall () from instdir/program/libgcc3_uno.so
    > #14 0x0000ffffa05f9ce0 in bridge_test::performTest (xContext=uno::Reference to (cppu::(anonymous namespace)::ComponentContext *) 0x3616eac0, xLBT=uno::Reference to (com::sun::star::uno::XInterface *) 0x361a92a8, noCurrentContext=false) at testtools/source/bridgetest/bridgetest.cxx:527
    > #15 0x0000ffffa05f7400 in bridge_test::(anonymous namespace)::TestBridgeImpl::run (this=0x361806e0, rArgs=uno::Sequence of length 1 = {...}) at testtools/source/bridgetest/bridgetest.cxx:1168
    > #16 0x00000000004050c0 in sal_main () at cpputools/source/unoexe/unoexe.cxx:517
    > #17 0x00000000004040cc in main (argc=8, argv=0xffffcc4c4458) at cpputools/source/unoexe/unoexe.cxx:357
    
    The reason is that _Unwind_RaiseException (in libgcc_s.so.1) called from
    __cxa_throw (in libc++abi.so.1) for some reason does not find unwind information
    for the callVirtualFunction frame #8, so returns _URC_FATAL_PHASE2_ERROR.  This
    looks similar to the issue discussed in the comment at the top of
    bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx introduced with
    0fdbb5b0eabbaa571f3747fda12a56c938cba474 "Make cpp_uno/gcc3_linux_x86-64 bridge
    work with GCC 4.7".  Though what happens to fix it here appears to be
    -fasynchronous-unwind-tables.  (The -fnon-call-exceptions mentioned in that
    comment appears to be ignored by Clang.)
    
    The actual difference that -fasynchronous-unwind-tables makes in the generated
    callvirtualfunction.s is that it drops a single line
    
    >  .Lfunc_begin0:
    >       .file   7 "" "bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx"
    >       .loc    7 32 0                          // bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx:32:0
    > -     .cfi_sections .debug_frame
    >       .cfi_startproc
    >  // %bb.0:
    >       stp     d15, d14, [sp, #-128]!          // 16-byte Folded Spill
    
    Change-Id: Ib60e9f4958c6041b10ca959a0953e998ac6f141a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100614
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/bridges/Library_cpp_uno.mk b/bridges/Library_cpp_uno.mk
index 9adc891f4e3d..5e78bcb676a6 100644
--- a/bridges/Library_cpp_uno.mk
+++ b/bridges/Library_cpp_uno.mk
@@ -31,6 +31,7 @@ bridge_exception_objects := abi cpp2uno uno2cpp
 $(eval $(call gb_Library_add_exception_objects,$(gb_CPPU_ENV)_uno, \
     bridges/source/cpp_uno/$(bridges_SELECTED_BRIDGE)/callvirtualfunction, \
     $(if $(HAVE_GCC_STACK_CLASH_PROTECTION),-fno-stack-clash-protection) \
+	$(if $(COM_IS_CLANG),-fasynchronous-unwind-tables) \
 ))
 
 else ifeq ($(OS),iOS)


More information about the Libreoffice-commits mailing list