From 1e161eb96e4ed72e43c158253069f974fff5b36f Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Fri, 26 Feb 2016 08:10:38 +0100 Subject: Use config_cxxabi.h to check for __*class_type_info ...as needed e.g. when building on Linux with clang -stdlib=libc++ against libc++abi Change-Id: I1f6f5ebcf5410c65453549ecea77581ccdaabc17 --- bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx | 75 ++++++++++++++++++---- config_host/config_cxxabi.h.in | 4 ++ configure.ac | 48 ++++++++++++++ 3 files changed, 113 insertions(+), 14 deletions(-) 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 0c9e2c5e0a88..bac7ef6fec15 100644 --- a/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx +++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx @@ -33,25 +33,72 @@ #include "uno/any2.h" #include "uno/mapping.h" -#ifdef _LIBCPP_VERSION +#if !HAVE_CXXABI_H_CLASS_TYPE_INFO +// , +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +class __class_type_info: public std::type_info { +public: + explicit __class_type_info(char const * n): type_info(n) {} + ~__class_type_info() override; +}; +} +#endif -namespace __cxxabiv1 -{ - struct __class_type_info : public std::type_info - { - explicit __class_type_info( const char *__n ) : type_info( __n ) { } - virtual ~__class_type_info(); - }; +#if !HAVE_CXXABI_H_SI_CLASS_TYPE_INFO +// , +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +class __si_class_type_info: public __class_type_info { +public: + __class_type_info const * __base_type; + explicit __si_class_type_info( + char const * n, __class_type_info const *base): + __class_type_info(n), __base_type(base) {} + ~__si_class_type_info() override; +}; +} +#endif - struct __si_class_type_info : public __class_type_info - { - explicit __si_class_type_info( const char *__n, const __class_type_info *__b ) : - __class_type_info( __n ), __base_type( __b ) { } - virtual ~__si_class_type_info(); - const __class_type_info *__base_type; +#if !HAVE_CXXABI_H_BASE_CLASS_TYPE_INFO +// , +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +struct __base_class_type_info { + __class_type_info const * __base_type; +#if defined _GLIBCXX_LLP64 + long long __offset_flags; +#else + long __offset_flags; +#endif + enum __offset_flags_masks { + __virtual_mask = 0x1, + __public_mask = 0x2, + __offset_shift = 8 }; +}; } +#endif +#if !HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO +// , +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +class __vmi_class_type_info: public __class_type_info { +public: + unsigned int __flags; + unsigned int __base_count; + __base_class_type_info __base_info[1]; + enum __flags_masks { + __non_diamond_repeat_mask = 0x1, + __diamond_shaped_mask = 0x2, + __flags_unknown_mask = 0x10 + }; + explicit __vmi_class_type_info(char const * n, int flags): + __class_type_info(n), __flags(flags), __base_count(0) {} + ~__vmi_class_type_info() override; +}; +} #endif #if !HAVE_CXXABI_H_CXA_EH_GLOBALS diff --git a/config_host/config_cxxabi.h.in b/config_host/config_cxxabi.h.in index 09bf8ab6bc18..74a226b3eb9f 100644 --- a/config_host/config_cxxabi.h.in +++ b/config_host/config_cxxabi.h.in @@ -10,11 +10,15 @@ #ifndef CONFIG_CXXABI_H #define CONFIG_CXXABI_H +#define HAVE_CXXABI_H_BASE_CLASS_TYPE_INFO 0 +#define HAVE_CXXABI_H_CLASS_TYPE_INFO 0 #define HAVE_CXXABI_H_CXA_ALLOCATE_EXCEPTION 0 #define HAVE_CXXABI_H_CXA_EH_GLOBALS 0 #define HAVE_CXXABI_H_CXA_EXCEPTION 0 #define HAVE_CXXABI_H_CXA_GET_GLOBALS 0 #define HAVE_CXXABI_H_CXA_THROW 0 +#define HAVE_CXXABI_H_SI_CLASS_TYPE_INFO 0 +#define HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO 0 #endif diff --git a/configure.ac b/configure.ac index 9b1f2dc5c32f..de6eaae7f1e8 100644 --- a/configure.ac +++ b/configure.ac @@ -6043,6 +6043,30 @@ if test "$GCC" = "yes"; then ], [AC_MSG_RESULT([no])]) CFLAGS=$save_CFLAGS + AC_MSG_CHECKING([whether $CXX defines __base_class_type_info in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + #include + std::size_t f() { return sizeof(__cxxabiv1::__base_class_type_info); } + ])], [ + AC_DEFINE([HAVE_CXXABI_H_BASE_CLASS_TYPE_INFO],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + + AC_MSG_CHECKING([whether $CXX defines __class_type_info in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + #include + std::size_t f() { return sizeof(__cxxabiv1::__class_type_info); } + ])], [ + AC_DEFINE([HAVE_CXXABI_H_CLASS_TYPE_INFO],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether $CXX declares __cxa_allocate_exception in cxxabi.h]) AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ @@ -6100,6 +6124,30 @@ if test "$GCC" = "yes"; then ], [AC_MSG_RESULT([no])]) AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether $CXX defines __si_class_type_info in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + #include + std::size_t f() { return sizeof(__cxxabiv1::__si_class_type_info); } + ])], [ + AC_DEFINE([HAVE_CXXABI_H_SI_CLASS_TYPE_INFO],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + + AC_MSG_CHECKING([whether $CXX defines __vmi_class_type_info in cxxabi.h]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include + #include + std::size_t f() { return sizeof(__cxxabiv1::__vmi_class_type_info); } + ])], [ + AC_DEFINE([HAVE_CXXABI_H_VMI_CLASS_TYPE_INFO],[1]) + AC_MSG_RESULT([yes]) + ], [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether STL uses __attribute__((warn_unused))]) AC_LANG_PUSH([C++]) save_CXXFLAGS=$CXXFLAGS -- cgit