Kaydet (Commit) c17f0175 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

...and similarly for __cxa_allocate_exception and __cxa_throw

Change-Id: I87ae299aac97180f0587c553d85b051decca155c
üst 41de10f5
...@@ -250,7 +250,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) ...@@ -250,7 +250,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
Reference< XInterface >() ); Reference< XInterface >() );
} }
pCppExc = __cxa_allocate_exception( pTypeDescr->nSize ); pCppExc = __cxxabiv1::__cxa_allocate_exception( pTypeDescr->nSize );
::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
// destruct uno exception // destruct uno exception
...@@ -269,7 +269,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) ...@@ -269,7 +269,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
} }
} }
__cxa_throw( pCppExc, rtti, deleteException ); __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
} }
//================================================================================================== //==================================================================================================
......
...@@ -80,27 +80,30 @@ struct __cxa_eh_globals ...@@ -80,27 +80,30 @@ struct __cxa_eh_globals
// Therefore, provide a declaration here for old GCC (libstdc++, really) version // 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 // 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 // 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 #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 #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 #if !HAVE_GCC_CXXABI_H_CXA_THROW
// CPPU_CURRENT_NAMESPACE here as different GCC versions have slightly different namespace __cxxabiv1 {
// declarations for them, e.g., with or without throw() specification, so would extern "C" void __cxa_throw(
// complain about redeclarations of these somewhat implicitly declared void * thrown_exception, void * tinfo, void (* dest)(void *))
// functions): __attribute__((noreturn));
#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));
#endif #endif
// ----- namespace CPPU_CURRENT_NAMESPACE
{
//================================================================================================== //==================================================================================================
void raiseException( void raiseException(
......
...@@ -10,7 +10,9 @@ ...@@ -10,7 +10,9 @@
#ifndef CONFIG_GCC_H #ifndef CONFIG_GCC_H
#define 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_GET_GLOBALS 0
#define HAVE_GCC_CXXABI_H_CXA_THROW 0
#endif #endif
......
...@@ -5572,6 +5572,17 @@ if test "$GCC" = "yes"; then ...@@ -5572,6 +5572,17 @@ if test "$GCC" = "yes"; then
], [AC_MSG_RESULT([no])]) ], [AC_MSG_RESULT([no])])
CFLAGS=$save_CFLAGS 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_MSG_CHECKING([whether $CXX declares __cxa_get_globals in cxxabi.h])
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
...@@ -5582,6 +5593,17 @@ if test "$GCC" = "yes"; then ...@@ -5582,6 +5593,17 @@ if test "$GCC" = "yes"; then
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
], [AC_MSG_RESULT([no])]) ], [AC_MSG_RESULT([no])])
AC_LANG_POP([C++]) 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 fi
AC_SUBST(HAVE_GCC_NO_LONG_DOUBLE) AC_SUBST(HAVE_GCC_NO_LONG_DOUBLE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment