summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-08-12 18:42:48 +0200
committerStephan Bergmann <sbergman@redhat.com>2020-08-12 21:11:26 +0200
commit2cb40c77cd05c1cb5a85468ff9801051829871e4 (patch)
tree4c3cf9e1397df611c41e82227152baa229630bf1
parentbb098efaded60118aa25ccd23083955041ba9cea (diff)
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@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@redhat.com>
-rw-r--r--bridges/Library_cpp_uno.mk1
1 files changed, 1 insertions, 0 deletions
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)