From 6c7c6d18eee2f2697b79efe6986ec9d8bf6052a1 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Thu, 20 Jun 2013 15:58:58 +0200 Subject: ...and similarly for __cxa_allocate_exception and __cxa_throw Conflicts: configure.ac Change-Id: I87ae299aac97180f0587c553d85b051decca155c --- .../source/cpp_uno/gcc3_linux_x86-64/except.cxx | 4 +-- bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx | 33 ++++++++++++---------- config_host/config_gcc.h.in | 2 ++ configure.ac | 22 +++++++++++++++ 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx index 8229ce8f1e61..18a6eff69fea 100644 --- a/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx @@ -250,7 +250,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) Reference< XInterface >() ); } - pCppExc = __cxa_allocate_exception( pTypeDescr->nSize ); + pCppExc = __cxxabiv1::__cxa_allocate_exception( pTypeDescr->nSize ); ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); // destruct uno exception @@ -269,7 +269,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) } } - __cxa_throw( pCppExc, rtti, deleteException ); + __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException ); } //================================================================================================== diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx index f3f43e5719ea..61702b7f7a01 100644 --- a/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx +++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx @@ -80,27 +80,30 @@ struct __cxa_eh_globals // Therefore, provide a declaration here for old GCC (libstdc++, really) version // that returns a void pointer, and in the code calling it always cast to the // above fake definition of CPPU_CURRENT_NAMESPACE::__cxa_eh_globals (which -// hopefully keeps matching the real definition in libstdc++): +// hopefully keeps matching the real definition in libstdc++); similarly for +// __cxa_allocate_exception and __cxa_throw, though they do not have the +// additional problem of an incompletely declared return type: + #if !HAVE_GCC_CXXABI_H_CXA_GET_GLOBALS -namespace __cxxabiv1 { extern "C" void * __cxa_get_globals () throw(); } +namespace __cxxabiv1 { extern "C" void * __cxa_get_globals() throw(); } #endif -namespace CPPU_CURRENT_NAMESPACE -{ +#if !HAVE_GCC_CXXABI_H_CXA_ALLOCATE_EXCEPTION +namespace __cxxabiv1 { +extern "C" void * __cxa_allocate_exception(std::size_t thrown_size) throw(); +} +#endif -// The following are in cxxabi.h since GCC 4.7 (they are wrapped in -// CPPU_CURRENT_NAMESPACE here as different GCC versions have slightly different -// declarations for them, e.g., with or without throw() specification, so would -// complain about redeclarations of these somewhat implicitly declared -// functions): -#if __GNUC__ == 4 && __GNUC_MINOR__ <= 6 -extern "C" void *__cxa_allocate_exception( - std::size_t thrown_size ) throw(); -extern "C" void __cxa_throw ( - void *thrown_exception, void *tinfo, void (*dest) (void *) ) __attribute__((noreturn)); +#if !HAVE_GCC_CXXABI_H_CXA_THROW +namespace __cxxabiv1 { +extern "C" void __cxa_throw( + void * thrown_exception, void * tinfo, void (* dest)(void *)) + __attribute__((noreturn)); +} #endif -// ----- +namespace CPPU_CURRENT_NAMESPACE +{ //================================================================================================== void raiseException( diff --git a/config_host/config_gcc.h.in b/config_host/config_gcc.h.in index 4376877e2b1d..c9571794d01e 100644 --- a/config_host/config_gcc.h.in +++ b/config_host/config_gcc.h.in @@ -10,7 +10,9 @@ #ifndef CONFIG_GCC_H #define CONFIG_GCC_H +#define HAVE_GCC_CXXABI_H_CXA_ALLOCATE_EXCEPTION 0 #define HAVE_GCC_CXXABI_H_CXA_GET_GLOBALS 0 +#define HAVE_GCC_CXXABI_H_CXA_THROW 0 #endif diff --git a/configure.ac b/configure.ac index e636b695b581..0f492d217767 100644 --- a/configure.ac +++ b/configure.ac @@ -5569,6 +5569,17 @@ if test "$GCC" = "yes"; then ], [AC_MSG_RESULT([no])]) CFLAGS=$save_CFLAGS + AC_MSG_CHECKING([whether $CXX declares __cxa_allocate_exception in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + void * f() { return __cxxabiv1::__cxa_allocate_exception(0); } + ])], [ + AC_DEFINE([HAVE_GCC_CXXABI_H_CXA_ALLOCATE_EXCEPTION],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether $CXX declares __cxa_get_globals in cxxabi.h]) AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ @@ -5580,6 +5591,17 @@ if test "$GCC" = "yes"; then ], [AC_MSG_RESULT([no])]) AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether $CXX declares __cxa_throw in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + void f() { __cxxabiv1::__cxa_throw(0, 0, 0); } + ])], [ + AC_DEFINE([HAVE_GCC_CXXABI_H_CXA_THROW],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if __GNUC__ == 4 && __GNUC_MINOR__ == 7 && (__GNUC_PATCHLEVEL__ == 0 || __GNUC_PATCHLEVEL__ == 1) #else -- cgit v1.2.3