From bb2b2a247232830b94d9dc3daa914913756ac847 Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Fri, 17 Jun 2005 07:33:56 +0000 Subject: [multiple changes] 2005-06-17 Jakub Jelinek Benjamin Kosnik * config/abi/alpha-linux-gnu/baseline_symbols.txt: Update. * config/abi/hppa-linux-gnu/baseline_symbols.txt: Same. * config/abi/mips-linux-gnu/baseline_symbols.txt: Same. * config/abi/sparc-linux-gnu/baseline_symbols.txt: Same. * config/abi/alpha-freebsd5/baseline_symbols.txt: Remove. * config/abi/i386-freebsd4/baseline_symbols.txt: Same. * config/abi/i386-freebsd5/baseline_symbols.txt: Same. * config/abi/sparc-freebsd5/baseline_symbols.txt: Same. * config/abi/arm-linux-gnu/baseline_symbols.txt: Remove. * config/abi/m68k-linux-gnu/baseline_symbols.txt: Same. 2005-06-17 Jakub Jelinek * config/abi/ia64-linux-gnu/baseline_symbols.txt: Update. * config/abi/s390x-linux-gnu/baseline_symbols.txt: Update. * config/abi/s390-linux-gnu/baseline_symbols.txt: Update. * config/abi/x86_64-linux-gnu/baseline_symbols.txt: Update. * config/abi/x86_64-linux-gnu/32/baseline_symbols.txt: Update. * config/abi/powerpc-linux-gnu/baseline_symbols.txt: Update. * config/abi/i486-linux-gnu/baseline_symbols.txt: Update. * config/abi/i386-linux-gnu/baseline_symbols.txt: Update. * config/abi/powerpc64-linux-gnu/baseline_symbols.txt: New file. * config/abi/powerpc64-linux-gnu/32/baseline_symbols.txt: New file. 2005-06-16 Jakub Jelinek * src/compatibility.cc: Include bits/c++config.h first. (_GLIBCXX_SYMVER_COMPATIBILITY): Define if _GLIBCXX_SYMVER and PIC are both defined. * include/bits/char_traits.h (char_traits::eq): Rename only if _GLIBCXX_SYMVER_COMPATIBILITY is defined. 2005-06-16 Jakub Jelinek * acinclude.m4 ((GLIBCXX_ENABLE_SYMVERS): Rename _GLIBCXX_SIZE_T_IS_INT to _GLIBCXX_SIZE_T_IS_UINT. Define _GLIBCXX_PTRDIFF_T_IS_INT. * configure: Regenerate. * config.h.in: Regenerate. * src/compatibility.cc (istream:ignore(streamsize)): Use _GLIBCXX_PTRDIFF_T_IS_INT instead of _GLIBCXX_SIZE_T_IS_INT. * config/abi/compatibility.h: Rename _GLIBCXX_SIZE_T_IS_INT to _GLIBCXX_SIZE_T_IS_UINT. Use _GLIBCXX_PTRDIFF_T_IS_INT instead for symbols with streamsize arguments. 2005-06-16 Jakub Jelinek * config/linker-map.gnu: Also export _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[il][il]. 2005-06-15 Benjamin Kosnik * configure.ac (libtool_VERSION): To 6:6:0. * configure: Regenerate. * config/linker-map.gnu: Edit. * src/istream.cc: Move istream::ignore(streamsize) specializations... * src/compatibility.cc: ...here. New. * include/bits/char_traits.h (char_traits::eq): Rename when appropriate. * acinclude.m4 (GLIBCXX_ENABLE_SYMVERS): Define _GLIBCXX_SIZE_T_IS_INT. Bump glibcxx_min_gnu_ld_version to 21590. * configure: Regenerate. * acconfig.h: Remove _GLIBCXX_ASM_SYMVER. * config.h.in: Regenerate. * src/Makefile.am (sources): Add compatibility.cc. * src/Makefile.in: Regenerate. * include/Makefile.am (host_headers_noinst): Add compatibility.h. * include/Makefile.in: Regenerate. * testsuite/testsuite_abi.h (symbol): Add data members. * testsuite/testsuite_abi.cc (check_version): Add GLIBCXX_3.4.5, GLIBCXX_3.4.6. Remove deprecated versions. Do a better job version checking. From-SVN: r101125 --- libstdc++-v3/src/compatibility.cc | 389 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 libstdc++-v3/src/compatibility.cc (limited to 'libstdc++-v3/src/compatibility.cc') diff --git a/libstdc++-v3/src/compatibility.cc b/libstdc++-v3/src/compatibility.cc new file mode 100644 index 00000000000..380649d8f18 --- /dev/null +++ b/libstdc++-v3/src/compatibility.cc @@ -0,0 +1,389 @@ +// Compatibility symbols for previous versions -*- C++ -*- + +// Copyright (C) 2005 +// 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. + +#include + +#if defined(_GLIBCXX_SYMVER) && defined(PIC) +# define _GLIBCXX_SYMVER_COMPATIBILITY 1 +#endif + +#include +#include +#include +#include + +namespace std +{ + // std::istream ignore explicit specializations. +#if defined(_GLIBCXX_SYMVER) && defined(PIC) + template<> + basic_istream& + basic_istream::ignore(streamsize __n) +#ifdef _GLIBCXX_PTRDIFF_T_IS_INT + asm ("_W_ZNSi6ignoreEi"); +#else + asm ("_W_ZNSi6ignoreEl"); +#endif + +#ifdef _GLIBCXX_USE_WCHAR_T + template<> + basic_istream& + basic_istream::ignore(streamsize __n) +#ifdef _GLIBCXX_PTRDIFF_T_IS_INT + asm ("_W_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi"); +#else + asm ("_W_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEl"); +#endif +#endif +#endif // _GLIBCXX_SYMVER && PIC + + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n) + { + if (__n == 1) + return ignore(); + + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + // See comment in istream.tcc. + bool __large_ignore = false; + while (true) + { + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof)) + { + streamsize __size = std::min(streamsize(__sb->egptr() + - __sb->gptr()), + streamsize(__n - _M_gcount)); + if (__size > 1) + { + __sb->gbump(__size); + _M_gcount += __size; + __c = __sb->sgetc(); + } + else + { + ++_M_gcount; + __c = __sb->snextc(); + } + } + if (__n == numeric_limits::max() + && !traits_type::eq_int_type(__c, __eof)) + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } + else + break; + } + + if (__large_ignore) + _M_gcount = numeric_limits::max(); + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + +#ifdef _GLIBCXX_USE_WCHAR_T + template<> + basic_istream& + basic_istream:: + ignore(streamsize __n) + { + if (__n == 1) + return ignore(); + + _M_gcount = 0; + sentry __cerb(*this, true); + if (__cerb && __n > 0) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + const int_type __eof = traits_type::eof(); + __streambuf_type* __sb = this->rdbuf(); + int_type __c = __sb->sgetc(); + + bool __large_ignore = false; + while (true) + { + while (_M_gcount < __n + && !traits_type::eq_int_type(__c, __eof)) + { + streamsize __size = std::min(streamsize(__sb->egptr() + - __sb->gptr()), + streamsize(__n - _M_gcount)); + if (__size > 1) + { + __sb->gbump(__size); + _M_gcount += __size; + __c = __sb->sgetc(); + } + else + { + ++_M_gcount; + __c = __sb->snextc(); + } + } + if (__n == numeric_limits::max() + && !traits_type::eq_int_type(__c, __eof)) + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } + else + break; + } + + if (__large_ignore) + _M_gcount = numeric_limits::max(); + + if (traits_type::eq_int_type(__c, __eof)) + __err |= ios_base::eofbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } +#endif +} + +// NB: These symbols renames should go into the shared library only, +// and only those shared libraries that support versioning. +#if defined(_GLIBCXX_SYMVER) && defined(PIC) + +/* gcc-3.4.4 +_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv +_ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv + */ +namespace std +{ + template + istreambuf_iterator& + istreambuf_iterator::operator++(); + +#ifdef _GLIBCXX_USE_WCHAR_T + template + istreambuf_iterator& + istreambuf_iterator::operator++(); +#endif +} // namespace std + +/* gcc-4.0.0 +_ZNSs4_Rep26_M_set_length_and_sharableEj +_ZNSs7_M_copyEPcPKcj +_ZNSs7_M_moveEPcPKcj +_ZNSs9_M_assignEPcjc +_ZNKSs11_M_disjunctEPKc +_ZNKSs15_M_check_lengthEjjPKc +_ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEj +_ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwj +_ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwj +_ZNSbIwSt11char_traitsIwESaIwEE9_M_assignEPwjw +_ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw +_ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc + +_ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv +_ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv +_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv +_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv +_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv +_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv + +_ZNSi6ignoreEi +_ZNSi6ignoreEv +_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi +_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv + +_ZNSt11char_traitsIcE2eqERKcS2_ +_ZNSt11char_traitsIwE2eqERKwS2_ + */ +namespace std +{ + // std::char_traits is explicitly specialized + bool (* __p1)(const char&, const char&) = &char_traits::eq; + + // std::string + template + void + basic_string::_M_copy(char*, const char*, size_t); + + template + void + basic_string::_M_move(char*, const char*, size_t); + + template + void + basic_string::_M_assign(char*, size_t, char); + + template + bool + basic_string::_M_disjunct(const char*) const; + + template + void + basic_string::_M_check_length(size_t, size_t, const char*) const; + + template + void + basic_string::_Rep::_M_set_length_and_sharable(size_t); + + + // std::istream + template + basic_istream& + basic_istream::ignore(); + + template + bool + basic_fstream::is_open() const; + + template + bool + basic_ifstream::is_open() const; + + template + bool + basic_ofstream::is_open() const; + +#ifdef _GLIBCXX_USE_WCHAR_T + bool (* __p2)(const wchar_t&, const wchar_t&) = &char_traits::eq; + + // std::wstring + template + void + basic_string::_M_copy(wchar_t*, const wchar_t*, size_t); + + template + void + basic_string::_M_move(wchar_t*, const wchar_t*, size_t); + + template + void + basic_string::_M_assign(wchar_t*, size_t, wchar_t); + + template + bool + basic_string::_M_disjunct(const wchar_t*) const; + + template + void + basic_string::_M_check_length(size_t, size_t, + const char*) const; + + template + void + basic_string::_Rep::_M_set_length_and_sharable(size_t); + + template + basic_istream& + basic_istream::ignore(); + + template + bool + basic_fstream::is_open() const; + + template + bool + basic_ifstream::is_open() const; + + template + bool + basic_ofstream::is_open() const; +#endif +} + +// The rename syntax for default exported names is +// asm (".symver name1,exportedname@GLIBCXX_3.4") +// asm (".symver name2,exportedname@@GLIBCXX_3.4.5") +// In the future, GLIBCXX_ABI > 6 should remove all uses of +// _GLIBCXX_*_SYMVER macros in this file. + +#define _GLIBCXX_3_4_SYMVER(name) \ + extern "C" void \ + _X##name() \ + __attribute__ ((alias(#name))); \ + asm (".symver " "_X" #name "," #name "@GLIBCXX_3.4"); + +#define _GLIBCXX_3_4_5_SYMVER(name) \ + extern "C" void \ + _Y##name() \ + __attribute__ ((alias(#name))); \ + asm (".symver " "_Y" #name "," #name "@@GLIBCXX_3.4.5"); + +#define _GLIBCXX_3_4_SYMVER_SPECIAL(name) \ + extern "C" void \ + _X##name() \ + __attribute__ ((alias("_W" #name))); \ + asm (".symver " "_X" #name "," #name "@GLIBCXX_3.4"); + +#define _GLIBCXX_3_4_5_SYMVER_SPECIAL(name) \ + extern "C" void \ + _Y##name() \ + __attribute__ ((alias("_W" #name))); \ + asm (".symver " "_Y" #name "," #name "@@GLIBCXX_3.4.5"); + +#define _GLIBCXX_ASM_SYMVER(cur, old, version) \ + asm (".symver " #cur "," #old "@@" #version); + +#define _GLIBCXX_APPLY_SYMVER _GLIBCXX_3_4_SYMVER +#define _GLIBCXX_APPLY_SYMVER_SPECIAL _GLIBCXX_3_4_SYMVER_SPECIAL +#include +#undef _GLIBCXX_APPLY_SYMVER +#undef _GLIBCXX_APPLY_SYMVER_SPECIAL + +#define _GLIBCXX_APPLY_SYMVER _GLIBCXX_3_4_5_SYMVER +#define _GLIBCXX_APPLY_SYMVER_SPECIAL _GLIBCXX_3_4_5_SYMVER_SPECIAL +#include +#undef _GLIBCXX_APPLY_SYMVER +#undef _GLIBCXX_APPLY_SYMVER_SPECIAL + +#endif -- cgit v1.2.1