This is the mail archive of the
libstdc++@sourceware.cygnus.com
mailing list for the libstdc++ project.
-ffunction-sections -fdata-sections vs. string-inst
- To: libstdc++ at sourceware dot cygnus dot com
- Subject: -ffunction-sections -fdata-sections vs. string-inst
- From: Benjamin Kosnik <bkoz at cygnus dot com>
- Date: Mon, 12 Jun 2000 19:08:56 -0700 (PDT)
The efforts that have been made to optimize string linking are really
wonderful, but they slooooow down compiles. I'm thinking it's time to
enable -ffunction-sections -fdata-sections instead of this approach,
which
1) gives faster compiles
2) roughly the same results.
As an added benefit, iostreams and the rest of the library gets selective
linking instead of just string. This is definitely the right long-term
approach, as far as I'm concerned.
Any thoughts? Here's the patch to enable this by default. It might be
nice for others to comment, and see what the results are for their
systems. You can get an idea of the relative binary sizes from scoping
the 200006xx-mkcheck.txt file.
Obviously, autoconf should check to make sure these flags are supported
(I suspect that they are supported on most hosts by now anyway, but
I didn't do that in this patch)
-benjamin
---------- Forwarded message ----------
Date: Mon, 12 Jun 2000 13:19:05 -0700
From: Benjamin Kosnik <bkoz@redhat.com>
To: bkoz@cygnus.com
Subject: p string inst
would like to try 3 different configurations, all with a default build
environment (ie, --enable-debugging is off):
1) current CVS and the macro-based solution to different object files
2) macro-based solution removed
3) macro-based solution removed, -ffunciton-sections -fdata-sections enabled.
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/ChangeLog,v
retrieving revision 1.59
diff -u -p -c -p -r1.59 ChangeLog
*** ChangeLog 2000/06/08 21:22:01 1.59
--- ChangeLog 2000/06/12 20:17:11
***************
*** 1,3 ****
--- 1,18 ----
+ 2000-06-11 Benjamin Kosnik <bkoz@redhat.com>
+
+ * src/Makefile.am (string_sources): Simplify, assuming that with
+ -ffunction-sections, -fdata-sections, all this hacking is not
+ necessary.
+ (wstring_sources): Same.
+ (OPTIMIZE_CXXFLAGS): Enable -fdata-sections -ffunction-sections.
+ * src/string-inst.cc: Remove macro blocks.
+
+ * acinclude.m4 (enable_cshadow_headers): Change CSHADOWFLAGS to
+ _GNU_SOURCE instead of _ISOC9X_SOURCE, as _GNU_SOURCE is the
+ superset, and already defined at top level.
+ * aclocal.m4: Regenerate.
+ * configure: Regenerate.
+
2000-06-08 Branko Cibej <branko.cibej@hermes.si>
* acinclude.m4 (GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT): Check for
Index: acinclude.m4
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/acinclude.m4,v
retrieving revision 1.26
diff -u -p -c -p -r1.26 acinclude.m4
*** acinclude.m4 2000/06/08 21:22:02 1.26
--- acinclude.m4 2000/06/12 20:17:33
*************** AC_MSG_RESULT($enable_cshadow_headers)
*** 1573,1579 ****
dnl Option parsed, now set things appropriately
case "$enable_cshadow_headers" in
yes)
! CSHADOWFLAGS="-D_ISOC9X_SOURCE"
CSHADOW_INCLUDES=" -I$srcdir/shadow -I$blddir/cshadow"
;;
no)
--- 1573,1579 ----
dnl Option parsed, now set things appropriately
case "$enable_cshadow_headers" in
yes)
! CSHADOWFLAGS="-D_GNU_SOURCE"
CSHADOW_INCLUDES=" -I$srcdir/shadow -I$blddir/cshadow"
;;
no)
Index: src/Makefile.am
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/src/Makefile.am,v
retrieving revision 1.15
diff -u -p -c -p -r1.15 Makefile.am
*** Makefile.am 2000/05/25 13:09:01 1.15
--- Makefile.am 2000/06/12 20:17:55
*************** EXTRA_LTLIBRARIES = libinst-string.la li
*** 38,62 ****
# Using these options is probably a good idea for thrill-seekers. Just
! # uncomment the lines below and make, everything else is ready to go...
! # OPTIMIZE_CXXFLAGS = \
# -O3 -fstrict-aliasing \
# -fdata-sections -ffunction-sections -fvtable-gc -Wl,--gc-sections
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.in to see how they are set.
AC_CXXFLAGS = \
! @WERROR@ @FMTFLAGS@ @CSHADOWFLAGS@ @CPUFLAGS@ \
! @EXTRA_CXX_FLAGS@ @DEBUGFLAGS@
# Need to manually set this option because AC_CXXFLAGS has to be at
! # the end of the compile line so that -O2 can be over-riden as the
# occasion call for it. (ie, --enable-debug)
AM_CXXFLAGS = \
! $(FORMAT_CXXFLAGS) \
! -fno-implicit-templates \
-Wall -Wno-format -W -Wwrite-strings -Winline \
! $(OPTIMIZE_CXXFLAGS) $(AC_CXXFLAGS)
# Passed down for cross compilers, canadian crosses.
--- 38,61 ----
# Using these options is probably a good idea for thrill-seekers. Just
! # uncomment the lines below and make, everything else is ready to go...
# -O3 -fstrict-aliasing \
# -fdata-sections -ffunction-sections -fvtable-gc -Wl,--gc-sections
+ OPTIMIZE_CXXFLAGS = \
+ -ffunction-sections -fdata-sections
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.in to see how they are set.
AC_CXXFLAGS = \
! @WERROR@ @FMTFLAGS@ @CPUFLAGS@ @EXTRA_CXX_FLAGS@ @DEBUGFLAGS@
# Need to manually set this option because AC_CXXFLAGS has to be at
! # the end of the compile line so that -O2 can be overridden as the
# occasion call for it. (ie, --enable-debug)
AM_CXXFLAGS = \
! -fno-implicit-templates $(OPTIMIZE_CXXFLAGS) \
-Wall -Wno-format -W -Wwrite-strings -Winline \
! $(AC_CXXFLAGS)
# Passed down for cross compilers, canadian crosses.
*************** sources = \
*** 195,257 ****
complex.cc complexf.cc complexl.cc complex_io.cc \
stdexcept.cc ios.cc stdstreams.cc strstream.cc \
locale.cc localename.cc \
! locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc
- string_sources = \
- stringMAIN.cc stringCTORNC.cc stringCTORAL.cc \
- stringCTORCPR.cc stringCTORCPRAL.cc stringCTORPRAL.cc \
- stringCTORPAL.cc stringCTORPP.cc stringCTORII.cc \
- stringMUTATE.cc stringRESERVE.cc \
- stringSWAP.cc stringSLOP.cc \
- stringRESIZE.cc stringAPPCOPY.cc stringAPPCPR.cc stringAPPPR.cc \
- stringAPPDUP.cc stringAPPII.cc stringASSCP.cc stringASSII.cc \
- stringINSII.cc stringREPRR.cc stringREPIIDUP.cc stringREPII.cc \
- stringREPIII.cc stringREP4I.cc stringREPIIPP.cc stringREPIIPP2.cc \
- stringCOPY.cc stringCONII.cc stringCONIIF.cc stringCONPPF.cc \
- stringCONPPF2.cc stringCONSC.cc \
- stringFIND.cc stringFINDC.cc stringRFIND.cc \
- stringRFINDC.cc stringFFO.cc stringFLO.cc stringFFNO.cc \
- stringFLNO.cc stringFLNOC.cc stringCOMPARE.cc stringCOMPARE2.cc \
- stringCOMPAREP.cc stringCOMPAREP2.cc stringADDPS.cc stringADDCS.cc \
- stringEXTRACT.cc stringINSERT.cc stringGETLINE.cc stringSCOPY.cc \
- stringEQ.cc
-
wstring_sources = \
! wstringMAIN.cc wstringCTORNC.cc wstringCTORAL.cc \
! wstringCTORCPR.cc wstringCTORCPRAL.cc wstringCTORPRAL.cc \
! wstringCTORPAL.cc wstringCTORPP.cc \
! wstringCTORII.cc \
! wstringMUTATE.cc wstringRESERVE.cc \
! wstringSWAP.cc wstringSLOP.cc \
! wstringRESIZE.cc wstringAPPCOPY.cc wstringAPPCPR.cc wstringAPPPR.cc \
! wstringAPPDUP.cc wstringAPPII.cc wstringASSCP.cc wstringASSII.cc \
! wstringINSII.cc wstringREPRR.cc wstringREPIIDUP.cc wstringREPII.cc \
! wstringREPIII.cc wstringREP4I.cc wstringREPIIPP.cc wstringREPIIPP2.cc \
! wstringCOPY.cc wstringCONII.cc wstringCONIIF.cc wstringCONPPF.cc \
! wstringCONPPF2.cc wstringCONSC.cc \
! wstringFIND.cc wstringFINDC.cc wstringRFIND.cc \
! wstringRFINDC.cc wstringFFO.cc wstringFLO.cc wstringFFNO.cc \
! wstringFLNO.cc wstringFLNOC.cc wstringCOMPARE.cc wstringCOMPARE2.cc \
! wstringCOMPAREP.cc wstringCOMPAREP2.cc wstringADDPS.cc \
! wstringADDCS.cc wstringEXTRACT.cc wstringINSERT.cc wstringGETLINE.cc \
! wstringSCOPY.cc wstringEQ.cc
VPATH += $(top_srcdir) $(top_srcdir)/std $(top_srcdir)/src
VPATH += $(top_srcdir)/@ctype_include_dir@
# Actual sources for the distro, but don't build these.
! EXTRA_sources = string-inst.cc
libstdc___la_SOURCES = $(sources)
- libinst_string_la_SOURCES = $(string_sources)
-
libinst_wstring_la_SOURCES = $(wstring_sources)
libstdc___la_LIBADD = \
../math/libmath.la ../libio/libio.la \
! libinst-string.la @libinst_wstring_la@
libstdc___la_LDFLAGS = -version-info 3:0:0 -lm
--- 194,218 ----
complex.cc complexf.cc complexl.cc complex_io.cc \
stdexcept.cc ios.cc stdstreams.cc strstream.cc \
locale.cc localename.cc \
! locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
wstring_sources = \
! wstring-inst.cc
VPATH += $(top_srcdir) $(top_srcdir)/std $(top_srcdir)/src
VPATH += $(top_srcdir)/@ctype_include_dir@
# Actual sources for the distro, but don't build these.
! #EXTRA_sources = string-inst.cc
libstdc___la_SOURCES = $(sources)
libinst_wstring_la_SOURCES = $(wstring_sources)
libstdc___la_LIBADD = \
../math/libmath.la ../libio/libio.la \
! @libinst_wstring_la@
libstdc___la_LDFLAGS = -version-info 3:0:0 -lm
*************** locale-inst.o: locale-inst.cc
*** 333,567 ****
locale-inst.lo: locale-inst.cc
$(LTCXXCOMPILE) -fimplicit-templates -c $<
! stringMAIN.lo \
! stringCTORNC.lo \
! stringCTORAL.lo \
! stringCTORCPR.lo \
! stringCTORCPRAL.lo \
! stringCTORPRAL.lo \
! stringCTORPAL.lo \
! stringCTORPP.lo \
! stringCTORII.lo \
! stringMUTATE.lo \
! stringRESERVE.lo \
! stringSWAP.lo \
! stringSLOP.lo \
! stringRESIZE.lo \
! stringAPPCOPY.lo \
! stringAPPCPR.lo \
! stringAPPPR.lo \
! stringAPPDUP.lo \
! stringAPPII.lo \
! stringASSCP.lo \
! stringASSII.lo \
! stringINSII.lo \
! stringREPRR.lo \
! stringREPIIDUP.lo \
! stringREPII.lo \
! stringREPIII.lo \
! stringREP4I.lo \
! stringREPIIPP.lo \
! stringREPIIPP2.lo \
! stringCOPY.lo \
! stringCONII.lo \
! stringCONIIF.lo \
! stringCONPPF.lo \
! stringCONPPF2.lo \
! stringCONSC.lo \
! stringFIND.lo \
! stringFINDC.lo \
! stringRFIND.lo \
! stringRFINDC.lo \
! stringFFO.lo \
! stringFLO.lo \
! stringFFNO.lo \
! stringFLNO.lo \
! stringFLNOC.lo \
! stringCOMPARE.lo \
! stringCOMPARE2.lo \
! stringCOMPAREP.lo \
! stringCOMPAREP2.lo \
! stringADDPS.lo \
! stringADDCS.lo \
! stringEXTRACT.lo \
! stringINSERT.lo \
! stringGETLINE.lo \
! stringSCOPY.lo \
! stringEQ.lo : string-inst.cc
! $(LTCXXCOMPILE) -fimplicit-templates \
! -c -D`echo $@ | tr -dc '0-9A-Z'` $< -o $@
!
! wstringMAIN.lo \
! wstringCTORNC.lo \
! wstringCTORAL.lo \
! wstringCTORCPR.lo \
! wstringCTORCPRAL.lo \
! wstringCTORPRAL.lo \
! wstringCTORPAL.lo \
! wstringCTORPP.lo \
! wstringCTORII.lo \
! wstringMUTATE.lo \
! wstringRESERVE.lo \
! wstringSWAP.lo \
! wstringSLOP.lo \
! wstringRESIZE.lo \
! wstringAPPCOPY.lo \
! wstringAPPCPR.lo \
! wstringAPPPR.lo \
! wstringAPPDUP.lo \
! wstringAPPII.lo \
! wstringASSCP.lo \
! wstringASSII.lo \
! wstringINSII.lo \
! wstringREPRR.lo \
! wstringREPIIDUP.lo \
! wstringREPII.lo \
! wstringREPIII.lo \
! wstringREP4I.lo \
! wstringREPIIPP.lo \
! wstringREPIIPP2.lo \
! wstringCOPY.lo \
! wstringCONII.lo \
! wstringCONIIF.lo \
! wstringCONPPF.lo \
! wstringCONPPF2.lo \
! wstringCONSC.lo \
! wstringFIND.lo \
! wstringFINDC.lo \
! wstringRFIND.lo \
! wstringRFINDC.lo \
! wstringFFO.lo \
! wstringFLO.lo \
! wstringFFNO.lo \
! wstringFLNO.lo \
! wstringFLNOC.lo \
! wstringCOMPARE.lo \
! wstringCOMPARE2.lo \
! wstringCOMPAREP.lo \
! wstringCOMPAREP2.lo \
! wstringADDPS.lo \
! wstringADDCS.lo \
! wstringEXTRACT.lo \
! wstringINSERT.lo \
! wstringGETLINE.lo \
! wstringSCOPY.lo \
! wstringEQ.lo : string-inst.cc
! $(LTCXXCOMPILE) -fimplicit-templates \
! -c -D`echo $@ | tr -dc '0-9A-Z'` -DC=wchar_t $< -o $@
!
! stringMAIN.o \
! stringCTORNC.o \
! stringCTORAL.o \
! stringCTORCPR.o \
! stringCTORCPRAL.o \
! stringCTORPRAL.o \
! stringCTORPAL.o \
! stringCTORPP.o \
! stringCTORII.o \
! stringMUTATE.o \
! stringRESERVE.o \
! stringSWAP.o \
! stringSLOP.o \
! stringRESIZE.o \
! stringAPPCOPY.o \
! stringAPPCPR.o \
! stringAPPPR.o \
! stringAPPDUP.o \
! stringAPPII.o \
! stringASSCP.o \
! stringASSII.o \
! stringINSII.o \
! stringREPRR.o \
! stringREPIIDUP.o \
! stringREPII.o \
! stringREPIII.o \
! stringREP4I.o \
! stringREPIIPP.o \
! stringREPIIPP2.o \
! stringCOPY.o \
! stringCONII.o \
! stringCONIIF.o \
! stringCONPPF.o \
! stringCONPPF2.o \
! stringCONSC.o \
! stringFIND.o \
! stringFINDC.o \
! stringRFIND.o \
! stringRFINDC.o \
! stringFFO.o \
! stringFLO.o \
! stringFFNO.o \
! stringFLNO.o \
! stringFLNOC.o \
! stringCOMPARE.o \
! stringCOMPARE2.o \
! stringCOMPAREP.o \
! stringCOMPAREP2.o \
! stringADDPS.o \
! stringADDCS.o \
! stringEXTRACT.o \
! stringINSERT.o \
! stringGETLINE.o \
! stringSCOPY.o \
! stringEQ.o : string-inst.cc
! $(CXXCOMPILE) -fimplicit-templates \
! -c -D`echo $@ | tr -dc '0-9A-Z'` $< -o $@
!
! wstringMAIN.o \
! wstringCTORNC.o \
! wstringCTORAL.o \
! wstringCTORCPR.o \
! wstringCTORCPRAL.o \
! wstringCTORPRAL.o \
! wstringCTORPAL.o \
! wstringCTORPP.o \
! wstringCTORII.o \
! wstringMUTATE.o \
! wstringRESERVE.o \
! wstringSWAP.o \
! wstringSLOP.o \
! wstringRESIZE.o \
! wstringAPPCOPY.o \
! wstringAPPCPR.o \
! wstringAPPPR.o \
! wstringAPPDUP.o \
! wstringAPPII.o \
! wstringASSCP.o \
! wstringASSII.o \
! wstringINSII.o \
! wstringREPRR.o \
! wstringREPIIDUP.o \
! wstringREPII.o \
! wstringREPIII.o \
! wstringREP4I.o \
! wstringREPIIPP.o \
! wstringREPIIPP2.o \
! wstringCOPY.o \
! wstringCONII.o \
! wstringCONIIF.o \
! wstringCONPPF.o \
! wstringCONPPF2.o \
! wstringCONSC.o \
! wstringFIND.o \
! wstringFINDC.o \
! wstringRFIND.o \
! wstringRFINDC.o \
! wstringFFO.o \
! wstringFLO.o \
! wstringFFNO.o \
! wstringFLNO.o \
! wstringFLNOC.o \
! wstringCOMPARE.o \
! wstringCOMPARE2.o \
! wstringCOMPAREP.o \
! wstringCOMPAREP2.o \
! wstringADDPS.o \
! wstringADDCS.o \
! wstringEXTRACT.o \
! wstringINSERT.o \
! wstringGETLINE.o \
! wstringSCOPY.o \
! wstringEQ.o : string-inst.cc
! $(CXXCOMPILE) -fimplicit-templates \
! -c -D`echo $@ | tr -dc '0-9A-Z'` -DC=wchar_t $< -o $@
--- 294,302 ----
locale-inst.lo: locale-inst.cc
$(LTCXXCOMPILE) -fimplicit-templates -c $<
! # We have to instantiate wstring bits too. . .
! wstring-inst.o: string-inst.cc
! $(CXXCOMPILE) -fimplicit-templates -c -DC=wchar_t $< -o $@
! wstring-inst.lo: string-inst.cc
! $(LTCXXCOMPILE) -fimplicit-templates -c -DC=wchar_t $< -o $@
Index: src/string-inst.cc
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/src/string-inst.cc,v
retrieving revision 1.5
diff -u -p -c -p -r1.5 string-inst.cc
*** string-inst.cc 2000/06/03 01:52:32 1.5
--- string-inst.cc 2000/06/12 20:18:13
*************** namespace std
*** 55,61 ****
{
typedef basic_string<C> S;
- #ifdef MAIN
template C S::_Rep::_S_terminal;
template S::size_type S::_Rep::_S_max_size;
template S::size_type S::_S_empty_rep_storage[];
--- 55,60 ----
*************** namespace std
*** 64,222 ****
template S::_Rep* S::_Rep::_S_create(size_t, S::allocator_type const&);
template void S::_Rep::_M_destroy(S::allocator_type const&) throw();
template void __destroy_aux(S*, S*, __false_type);
- #endif
- #ifdef CTORNC
template
S::basic_string(S::size_type, C, S::allocator_type const&);
- #endif
- #ifdef CTORAL
template
S::basic_string(S::allocator_type const&);
- #endif
- #ifdef CTORCPR
template
S::basic_string(S const&, S::size_type, S::size_type);
- #endif
- #ifdef CTORCPRAL
template
S::basic_string(
S const&, S::size_type, S::size_type, S::allocator_type const&);
- #endif
- #ifdef CTORPRAL
template
S::basic_string(
C const*, S::size_type, S::allocator_type const&);
- #endif
- #ifdef CTORPAL
template
S::basic_string(
C const*, S::allocator_type const&);
- #endif
- #ifdef CTORPP
template
S::basic_string
(C*, C*, const allocator<C>&);
- #endif
- #ifdef CTORII
template
S::basic_string
(S::iterator, S::iterator, const allocator<C>&);
- #endif
- #ifdef MUTATE
template
void S::_M_leak_hard();
template
void S::_M_mutate(S::size_type, S::size_type, S::size_type);
template
C* S::_Rep::_M_clone(S::allocator_type const&, S::size_type);
- #endif
- #ifdef RESERVE
template
void S::reserve(S::size_type);
- #endif
- #ifdef SWAP
template
void S::swap(S&);
- #endif
- #ifdef SLOP
# ifdef _GLIBCPP_ALLOC_CONTROL
template
bool (* S::_Rep::_S_excess_slop)(size_t, size_t);
template
bool S::_Rep::_S_default_excess(size_t, size_t);
# endif
- #endif
- #ifdef RESIZE
template
void S::resize(S::size_type, C);
- #endif
- #ifdef APPCOPY
template
S& S::append(S const&);
- #endif
- #ifdef APPCPR
template
S& S::append(S const&, S::size_type, S::size_type);
- #endif
- #ifdef APPPR
template
S& S::append(C const*, S::size_type);
- #endif
- #ifdef APPDUP
template
S& S::append(S::size_type, C);
- #endif
- #ifdef APPII
template
S&
S::append<S::iterator>
(S::iterator, S::iterator);
- #endif
- #ifdef ASSCP
template
S&
S::assign(S const&);
- #endif
- #ifdef ASSII
template
S&
S::assign<S::iterator>
(S::iterator, S::iterator);
- #endif
- #ifdef INSII
template
void
S::insert<S::iterator> //c*
(S::iterator, S::iterator, S::iterator); //it, c+, c+ and temptype = char*
- #endif
- #ifdef REPRR
template
S& S::replace(
S::size_type, S::size_type, S const&, S::size_type, S::size_type);
- #endif
- #ifdef REPIIDUP
template
S& S::replace(S::iterator, S::iterator, S::size_type, C);
- #endif
- #ifdef REPII
template
S&
S::replace<S::iterator> // c*
(S::iterator, S::iterator, S::iterator, S::iterator); //it, it, c+, c+
- #endif
- #ifdef REPIII
template
S&
S::_M_replace<S::iterator>
(S::iterator, S::iterator, S::iterator, S::iterator, forward_iterator_tag);
- #endif
- #ifdef REP4I
// Only one template keyword allowed here.
// See core issue #46 (NAD)
// http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_closed.html#46
--- 63,169 ----
*************** namespace std
*** 225,286 ****
S::_M_replace<S::const_iterator>
(S::iterator, S::iterator,
S::const_iterator, S::const_iterator, forward_iterator_tag);
- #endif
- #ifdef REPIIPP
template
S&
S::_M_replace<C*>
(S::iterator, S::iterator, C*, C*, forward_iterator_tag);
! #endif
!
! #ifdef REPIIPP2
template
S&
S::_M_replace<const C*>
(S::iterator, S::iterator, const C*, const C*, forward_iterator_tag);
- #endif
- #ifdef COPY
template
S::size_type S::copy(C*, S::size_type, S::size_type) const;
- #endif
- #ifdef CONII
template
C*
S::_S_construct<S::iterator>
(S::iterator, S::iterator, const allocator<C>&);
! #endif
!
! #ifdef CONIIF
template
C*
S::_S_construct<S::iterator>
(S::iterator, S::iterator, const allocator<C>&, forward_iterator_tag);
- #endif
- #ifdef CONPPF
template
C*
S::_S_construct<C*>
(C*, C*, const allocator<C>&, forward_iterator_tag);
- #endif
- #ifdef CONPPF2
template
C*
S::_S_construct<const C*>
(const C*, const C*, const allocator<C>&, forward_iterator_tag);
- #endif
- #ifdef CONSC
template
C*
S::_S_construct(S::size_type, C, S::allocator_type const&);
- #endif
- #ifdef FIND
// These members are explicitly specialized, and can only be in one
// translation unit or else we get multiple copies. . .
#if _GLIBCPP_INSTANTIATING_CHAR
--- 172,215 ----
S::_M_replace<S::const_iterator>
(S::iterator, S::iterator,
S::const_iterator, S::const_iterator, forward_iterator_tag);
template
S&
S::_M_replace<C*>
(S::iterator, S::iterator, C*, C*, forward_iterator_tag);
!
template
S&
S::_M_replace<const C*>
(S::iterator, S::iterator, const C*, const C*, forward_iterator_tag);
template
S::size_type S::copy(C*, S::size_type, S::size_type) const;
template
C*
S::_S_construct<S::iterator>
(S::iterator, S::iterator, const allocator<C>&);
!
template
C*
S::_S_construct<S::iterator>
(S::iterator, S::iterator, const allocator<C>&, forward_iterator_tag);
template
C*
S::_S_construct<C*>
(C*, C*, const allocator<C>&, forward_iterator_tag);
template
C*
S::_S_construct<const C*>
(const C*, const C*, const allocator<C>&, forward_iterator_tag);
template
C*
S::_S_construct(S::size_type, C, S::allocator_type const&);
// These members are explicitly specialized, and can only be in one
// translation unit or else we get multiple copies. . .
#if _GLIBCPP_INSTANTIATING_CHAR
*************** namespace std
*** 300,400 ****
_Char_traits_match<wchar_t, traits_type>(__c));
}
#endif
- #endif
- #ifdef FINDC
template
S::size_type S::find(C, S::size_type) const;
- #endif
- #ifdef RFIND
template
S::size_type S::rfind(C const*, S::size_type, S::size_type) const;
- #endif
- #ifdef RFINDC
template
S::size_type S::rfind(C, S::size_type) const;
- #endif
- #ifdef FFO
template
S::size_type S::find_first_of(C const*, S::size_type, S::size_type) const;
- #endif
- #ifdef FLO
template
S::size_type S::find_last_of(C const*, S::size_type, S::size_type) const;
- #endif
- #ifdef FFNO
template
S::size_type S::find_first_not_of(
C const*, S::size_type, S::size_type) const;
- #endif
- #ifdef FLNO
template
S::size_type S::find_last_not_of(
C const*, S::size_type, S::size_type) const;
- #endif
- #ifdef FLNOC
template
S::size_type S::find_last_not_of(C, S::size_type) const;
- #endif
- #ifdef COMPARE
template
int S::compare(S::size_type, S::size_type, S const&) const;
- #endif
- #ifdef COMPARE2
template
int S::compare(S::size_type, S::size_type, S const&, S::size_type,
S::size_type) const;
- #endif
- #ifdef COMPAREP
template
int S::compare(C const*) const;
- #endif
- #ifdef COMPAREP2
template
int S::compare(
S::size_type, S::size_type, C const*, S::size_type) const;
- #endif
- #ifdef ADDPS
template S operator+(const C*, const S&);
- #endif
- #ifdef ADDCS
template S operator+(C, const S&);
- #endif
- #ifdef EQ
template bool operator==(const S::iterator&, const S::iterator&);
template bool operator==(const S::const_iterator&, const S::const_iterator&);
- #endif
- #ifdef EXTRACT
template basic_istream<C>& operator>>(basic_istream<C>&, S&);
- #endif
- #ifdef INSERT
template basic_ostream<C>& operator<<(basic_ostream<C>&, const S&);
- #endif
- #ifdef GETLINE
template basic_istream<C>& getline(basic_istream<C>&, S&, C);
template basic_istream<C>& getline(basic_istream<C>&, S&);
- #endif
- #ifdef SCOPY
template void _S_string_copy(const S&, C*, allocator<C>::size_type);
- #endif
} // std
--- 229,291 ----
_Char_traits_match<wchar_t, traits_type>(__c));
}
#endif
template
S::size_type S::find(C, S::size_type) const;
template
S::size_type S::rfind(C const*, S::size_type, S::size_type) const;
template
S::size_type S::rfind(C, S::size_type) const;
template
S::size_type S::find_first_of(C const*, S::size_type, S::size_type) const;
template
S::size_type S::find_last_of(C const*, S::size_type, S::size_type) const;
template
S::size_type S::find_first_not_of(
C const*, S::size_type, S::size_type) const;
template
S::size_type S::find_last_not_of(
C const*, S::size_type, S::size_type) const;
template
S::size_type S::find_last_not_of(C, S::size_type) const;
template
int S::compare(S::size_type, S::size_type, S const&) const;
template
int S::compare(S::size_type, S::size_type, S const&, S::size_type,
S::size_type) const;
template
int S::compare(C const*) const;
template
int S::compare(
S::size_type, S::size_type, C const*, S::size_type) const;
template S operator+(const C*, const S&);
template S operator+(C, const S&);
template bool operator==(const S::iterator&, const S::iterator&);
template bool operator==(const S::const_iterator&, const S::const_iterator&);
template basic_istream<C>& operator>>(basic_istream<C>&, S&);
template basic_ostream<C>& operator<<(basic_ostream<C>&, const S&);
template basic_istream<C>& getline(basic_istream<C>&, S&, C);
+
template basic_istream<C>& getline(basic_istream<C>&, S&);
template void _S_string_copy(const S&, C*, allocator<C>::size_type);
} // std