Clean up declaration of __cxa_get_globals

At least Clang trunk towards 3.4 now rejects incompatible declarations of the
same extern "C" function in different namespaces, so that trick of getting at
the function that is exported by libstdc++ but only rudimentarily if at all
exposed in cxxabi.h no longer worked.

TODO: This change should be reflected in any other bridges where it is relevant,
too.

Change-Id: Ie3ccbdb7d75cc98636d02c0435958532620724f2
This commit is contained in:
Stephan Bergmann 2013-06-20 13:57:45 +02:00
parent e79b671507
commit 5ba3d1740b
5 changed files with 54 additions and 9 deletions

View File

@ -22,11 +22,6 @@
#include <string.h>
#include <dlfcn.h>
#include <cxxabi.h>
#ifndef _GLIBCXX_CDTOR_CALLABI // new in GCC 4.7 cxxabi.h
#define _GLIBCXX_CDTOR_CALLABI
#endif
#include <boost/unordered_map.hpp>
#include <rtl/strbuf.hxx>

View File

@ -17,12 +17,20 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "uno/mapping.h"
#include "sal/config.h"
#include <typeinfo>
#include <exception>
#include <cstddef>
#include <cxxabi.h>
#ifndef _GLIBCXX_CDTOR_CALLABI // new in GCC 4.7 cxxabi.h
#define _GLIBCXX_CDTOR_CALLABI
#endif
#include "config_gcc.h"
#include "uno/mapping.h"
namespace CPPU_CURRENT_NAMESPACE
{
@ -65,7 +73,17 @@ struct __cxa_eh_globals
}
extern "C" CPPU_CURRENT_NAMESPACE::__cxa_eh_globals *__cxa_get_globals () throw();
// __cxa_get_globals is exported from libstdc++ since GCC 3.4.0 (CXXABI_1.3),
// but it is only declared in cxxabi.h (in namespace __cxxabiv1) since
// GCC 4.7.0. It returns a pointer to a struct __cxa_eh_globals, but that
// struct is only incompletely declared even in the GCC 4.7.0 cxxabi.h.
// 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++):
#if !HAVE_GCC_CXXABI_H_CXA_GET_GLOBALS
namespace __cxxabiv1 { extern "C" void * __cxa_get_globals () throw(); }
#endif
namespace CPPU_CURRENT_NAMESPACE
{

View File

@ -289,8 +289,11 @@ static void cpp_call(
}
catch (...)
{
// fill uno exception
fillUnoException( __cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() );
// fill uno exception
fillUnoException(
reinterpret_cast< CPPU_CURRENT_NAMESPACE::__cxa_eh_globals * >(
__cxxabiv1::__cxa_get_globals())->caughtExceptions,
*ppUnoExc, pThis->getBridge()->getCpp2Uno());
// temporary params
for ( ; nTempIndizes--; )

View File

@ -0,0 +1,17 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef CONFIG_GCC_H
#define CONFIG_GCC_H
#define HAVE_GCC_CXXABI_H_CXA_GET_GLOBALS 0
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@ -5571,6 +5571,17 @@ if test "$GCC" = "yes"; then
AC_MSG_RESULT([yes])
], [AC_MSG_RESULT([no])])
CFLAGS=$save_CFLAGS
AC_MSG_CHECKING([whether $CXX declares __cxa_get_globals in cxxabi.h])
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <cxxabi.h>
void * f() { return __cxxabiv1::__cxa_get_globals(); }
])], [
AC_DEFINE([HAVE_GCC_CXXABI_H_CXA_GET_GLOBALS],[1])
AC_MSG_RESULT([yes])
], [AC_MSG_RESULT([no])])
AC_LANG_POP([C++])
fi
AC_SUBST(HAVE_GCC_NO_LONG_DOUBLE)
@ -12051,6 +12062,7 @@ fi
AC_CONFIG_FILES([config_host.mk Makefile lo.xcent instsetoo_native/util/openoffice.lst])
AC_CONFIG_HEADERS([config_host/config_clang.h])
AC_CONFIG_HEADERS([config_host/config_features.h])
AC_CONFIG_HEADERS([config_host/config_gcc.h])
AC_CONFIG_HEADERS([config_host/config_global.h])
AC_CONFIG_HEADERS([config_host/config_graphite.h])
AC_CONFIG_HEADERS([config_host/config_lgpl.h])