/* ----------------------------------------------------------------------- *//**
 *
 * @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 <ostream>

// 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 <bits/ostream.tcc> included from <ostream>. 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:
 * <blockquote>
 *     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.
 * <blockquote>
 *
 * And later on the same page:
 * <blockquote>
 *     For polymorphic classes (classes with virtual functions), the
 *     \c type_info object is written out along with the vtable [...].
 * <blockquote>
 *
 * 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 <bits/ostream.tcc> 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<char>
 *
 * 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<char>::_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<char>::_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
 *
 * <blockquote>
 * // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
 * // Free Software Foundation, Inc.
 *
 * // This file is part of the GNU ISO C++ Library.  This library is free
 * // software; you can redistribute it and/or modify it under the
 * // terms of the GNU General Public License as published by the
 * // Free Software Foundation; either version 2, or (at your option)
 * // any later version.
 *
 * // This library is distributed in the hope that it will be useful,
 * // but WITHOUT ANY WARRANTY; without even the implied warranty of
 * // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * // GNU General Public License for more details.
 *
 * // You should have received a copy of the GNU General Public License along
 * // with this library; see the file COPYING.  If not, write to the Free
 * // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 * // USA.
 *
 * // As a special exception, you may use this file as part of a free software
 * // library without restriction.  Specifically, if other files instantiate
 * // templates or use macros or inline functions from this file, or you compile
 * // this file and link it with other files to produce an executable, this
 * // file does not by itself cause the resulting executable to be covered by
 * // the GNU General Public License.  This exception does not however
 * // invalidate any other reasons why the executable file might be covered by
 * // the GNU General Public License.
 * <blockquote>
 */
void
ctype<char>::_M_widen_init() const {
    char __tmp[sizeof(_M_widen)];
    for (unsigned __i = 0; __i < sizeof(_M_widen); ++__i)
        __tmp[__i] = static_cast<char>(__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 <stdexcept>

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)
