/* ----------------------------------------------------------------------- *//** * * @file libstdcxx-compatibility.cpp * * @brief Declarations/definitions for using an "old" libstdc++ with a newer g++ * * This file follows ideas proposed here: http://glandium.org/blog/?p=1901 * Unfortunately, MADlib seems to use libstdc++ to a greater extend than * Firefox 4.0 did, so we need to do a bit more. * * The declarations and definitions in this file make it possible to build * MADlib with the following versions of gcc (please add to the list), while * continuing to only rely on libstdc++.so.6.0.8 (which corresponds to * gcc 4.1.2, and labels GLIBCXX_3.4.8, CXXABI_1.3.1). * * As of September 2012, there is still the need to support libstdc++.so.6.0.8, * as this is the libstdc++ that shipped with RedHad/CentOS 5. * * Tested with the following versions of gcc: * - gcc 4.4.2 * - gcc 4.5.4 * - gcc 4.6.2 * * For a mapping between gcc versions, libstdc++ versions, and symbol versioning * on the libstdc++.so binary, see: * http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html * *//* ----------------------------------------------------------------------- */ #include // The following macro was introduced with this commit: // http://gcc.gnu.org/viewcvs?diff_format=h&view=revision&revision=173774 #ifndef _GLIBCXX_USE_NOEXCEPT #define _GLIBCXX_USE_NOEXCEPT throw() #endif #define GCC_VERSION ( __GNUC__ * 10000 \ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) // CXXABI_1.3.2 symbols #if (LIBSTDCXX_COMPAT < 40300 && GCC_VERSION >= 40300) namespace __cxxabiv1 { /** * @brief Virtual destructor for forced-unwinding class * * We provide an implementation to avoid CXXABI_1.3.2 symbol versions. * * Older versions of libstdc++ had the problem that POSIX thread cancellations * while writing to an ostream caused an abort: * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28145 * * Newer versions have an additional catch block for references of type * __cxxabiv1::__forced_unwind, which represents the POSIX cancellation object: * http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html * See, e.g., file included from . Catching * exceptions of this type requires its \c type_info object. However, this * object is not normally present in the current binary, as explained in the * following. * * The type __cxxabiv1::__forced_unwind was only introduced in May 2007 (see * attachments to the previous bug report) and thus after the release of * gcc 4.1.2 (Feb 13, 2007, see http://gcc.gnu.org/releases.html). * * As http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html explains: *
* If the class declares any non-inline, non-pure virtual functions, the * first one is chosen as the "key method" for the class, and the vtable is * only emitted in the translation unit where the key method is defined. *
* * And later on the same page: *
* For polymorphic classes (classes with virtual functions), the * \c type_info object is written out along with the vtable [...]. *
* * Hence, to include a vtable, we need a definition for the key method, which is * the constructor. See the declaration here: * http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/cxxabi_forced.h */ __forced_unwind::~__forced_unwind() _GLIBCXX_USE_NOEXCEPT { } } // namespace __cxxabiv1 #endif // (LIBSTDCXX_COMPAT < 40300 && GCC_VERSION >= 40300) // GLIBCXX_3.4.9 symbols #if (LIBSTDCXX_COMPAT < 40200 && GCC_VERSION >= 40200) namespace std { /** * @brief Write a value to an ostream * * In recent versions of libstdc++, \c _M_insert contains the implementation for * the various operator<<() overloads. Now, as http://glandium.org/blog/?p=1901 * explains, newer libstdc++ versions contain various instantiations for * \c _M_insert, even though contains a general (template) * definition. * * Older versions of libstdc++ did not contain implementations for \c _M_insert, * so we instantiate them here. See this change: * http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/include/bits/ostream.tcc?r1=109235&r2=109236& */ template ostream& ostream::_M_insert(bool); // The following four lines are not needed and commented out. Specialized // implementations exist for ostream<<([unsigned] {short|int}). // template ostream& ostream::_M_insert(short); // template ostream& ostream::_M_insert(unsigned short); // template ostream& ostream::_M_insert(int); // template ostream& ostream::_M_insert(unsigned int); template ostream& ostream::_M_insert(long); template ostream& ostream::_M_insert(unsigned long); #ifdef _GLIBCXX_USE_LONG_LONG template ostream& ostream::_M_insert(long long); template ostream& ostream::_M_insert(unsigned long long); #endif template ostream& ostream::_M_insert(float); template ostream& ostream::_M_insert(double); template ostream& ostream::_M_insert(long double); template ostream& ostream::_M_insert(const void*); /** * @brief Write a sequence of characters to an ostream * * This function was only added with this commit: * http://gcc.gnu.org/viewcvs?view=revision&revision=123692 */ template ostream& __ostream_insert(ostream&, const char*, streamsize); } // namespace std #endif // (LIBSTDCXX_COMPAT < 40200 && GCC_VERSION >= 40200) // GLIBCXX_3.4.11 symbols #if (LIBSTDCXX_COMPAT < 40400 && GCC_VERSION >= 40400) namespace std { /** * @brief Initialize an internal data structure of ctype * * This was previously an inline function and moved out of line with this * commit: * http://gcc.gnu.org/viewcvs?view=revision&revision=140238 * * See also this bug report: * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37455 * * std::ctype::_M_widen_init() is a function added to libstdc++ by * Jerry Quinn with revision 74662 on Dec 16, 2003: * http://gcc.gnu.org/viewcvs?diff_format=h&view=revision&revision=74662 * * With explicit permission by Jerry Quinn from Oct 9, 2012, we include a * verbatim copy of _M_widen_init() here. However, a static_cast was added to * avoid a warning. * * Revision 74662 of the libstdc++-v3 file include/bits/locale_facets.h, where * std::ctype::_M_widen_init() has been copied from, also included the * following notice in the file header: * http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/include/bits/locale_facets.h?diff_format=h&view=markup&pathrev=74662 * *
* As a special exception, you may use this file as part of a free software * library without restriction. [...] *
*/ void ctype::_M_widen_init() const { char __tmp[sizeof(_M_widen)]; for (unsigned __i = 0; __i < sizeof(_M_widen); ++__i) __tmp[__i] = static_cast(__i); do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen); _M_widen_ok = 1; // Set _M_widen_ok to 2 if memcpy can't be used. for (unsigned __i = 0; __i < sizeof(_M_widen); ++__i) if (__tmp[__i] != _M_widen[__i]) { _M_widen_ok = 2; break; } } } // namespace std #endif // (LIBSTDCXX_COMPAT < 40400 && GCC_VERSION >= 40400) // GLIBCXX_3.5.15 symbols #if (LIBSTDCXX_COMPAT < 40600 && GCC_VERSION >= 40600) #include namespace std { /** * @brief Empty dtors for standard exceptions * * Later versions of libstdc++ added destructors to some standard exceptions. * Definitions for these are missing in older versions of libstdc++. * * Of course, additing destructors is potentially dangerous and can change the * ABI. However, these classes derived from \c runtime_error and \c logic_error * before and therefore have always had virtual members. * * The first commit that added these destructors is: * http://gcc.gnu.org/viewcvs?diff_format=h&view=revision&revision=170975 * This commit was included already in the first gcc 4.6.0 release: * http://gcc.gnu.org/viewcvs/tags/gcc_4_6_0_release/libstdc%2B%2B-v3/src/stdexcept.cc */ domain_error::~domain_error() _GLIBCXX_USE_NOEXCEPT { } invalid_argument::~invalid_argument() _GLIBCXX_USE_NOEXCEPT { } length_error::~length_error() _GLIBCXX_USE_NOEXCEPT { } out_of_range::~out_of_range() _GLIBCXX_USE_NOEXCEPT { } runtime_error::~runtime_error() _GLIBCXX_USE_NOEXCEPT { } range_error::~range_error() _GLIBCXX_USE_NOEXCEPT { } overflow_error::~overflow_error() _GLIBCXX_USE_NOEXCEPT { } underflow_error::~underflow_error() _GLIBCXX_USE_NOEXCEPT { } } // namespace std #endif // (LIBSTDCXX_COMPAT < 40600 && GCC_VERSION >= 40600)