This is the mail archive of the libstdc++@sourceware.cygnus.com mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

-ffunction-sections -fdata-sections vs. string-inst




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
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]