[Libreoffice-commits] core.git: bridges/source config_host/config_gcc.h.in configure.ac

Stephan Bergmann sbergman at redhat.com
Thu Jun 20 06:59:31 PDT 2013


 bridges/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(-)

New commits:
commit c17f01753ce94e9f57d6e4a2763152240fbcd50a
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Jun 20 15:58:58 2013 +0200

    ...and similarly for __cxa_allocate_exception and __cxa_throw
    
    Change-Id: I87ae299aac97180f0587c553d85b051decca155c

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 8229ce8..18a6eff 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 f3f43e5..61702b7 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 4376877..c957179 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 9998743..465e7fd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5572,6 +5572,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 <cxxabi.h>
+            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([
@@ -5582,6 +5593,17 @@ if test "$GCC" = "yes"; then
             AC_MSG_RESULT([yes])
         ], [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 <cxxabi.h>
+            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++])
 fi
 
 AC_SUBST(HAVE_GCC_NO_LONG_DOUBLE)


More information about the Libreoffice-commits mailing list