Opaque evil patch to fix AIX I/O

Mark Mitchell mark@codesourcery.com
Thu Jan 25 14:42:00 GMT 2001


This patch, while causing distinguished members of the V3 team to and
retch with absolute disgust at my utter lack of taste, gets AIX I/O
working.  See the libstdc++ list for much heated discussion of the
techniques involved...

Tested on powerpc-ibm-aix4.3.2.0 and by rebuilding V3 on
i686-pc-linux-gnu.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

2001-01-25  Mark Mitchell  <mark@codesourcery.com>

	* src/Makefile.am (sources): Add globals.cc.
	* src/Makefile.in: Regenerated.
	* src/globals.cc: New file.
	* src/ios.cc (cin): Don't define here, just declare extern.
	(cout): Likewise.
	(cerr): Likewise.
	(clog): Likewise.
	(wcin): Likewise.
	(wcout): Likewise.
	(wcerr): Likewise.
	(wclog): Likewise.

Index: src/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/Makefile.am,v
retrieving revision 1.64
diff -c -p -r1.64 Makefile.am
*** Makefile.am	2001/01/11 07:27:49	1.64
--- Makefile.am	2001/01/25 22:37:23
*************** sources = \
*** 176,181 ****
--- 176,182 ----
  	limitsMEMBERS.cc \
  	complex_io.cc \
  	stdexcept.cc bitset.cc \
+         globals.cc \
  	c++io.cc ios.cc strstream.cc \
  	locale.cc localename.cc codecvt.cc \
  	locale-inst.cc stl-inst.cc misc-inst.cc valarray-inst.cc string-inst.cc
Index: src/globals.cc
===================================================================
RCS file: globals.cc
diff -N globals.cc
*** /dev/null	Tue May  5 13:32:27 1998
--- globals.cc	Thu Jan 25 14:37:24 2001
***************
*** 0 ****
--- 1,61 ----
+ // Copyright (C) 2001 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.
+ 
+ // On AIX, and perhaps other systems, library initialization order
+ // is not guaranteed.  For example, the static initializers for the 
+ // main program might run before the static initializers for this
+ // library.  That means that we cannot rely on static initialization in 
+ // the library; there is no guarantee that things will get initialized
+ // in time.  This file contains definitions of all global variables
+ // that require initialization as arrays of characters.
+ 
+ #include <istream>
+ #include <ostream>
+ 
+ namespace std {
+   typedef char fake_istream[sizeof (istream)] 
+   __attribute__ ((aligned (__alignof__ (istream))));
+   typedef char fake_ostream[sizeof (ostream)] 
+   __attribute__ ((aligned (__alignof__ (ostream))));
+ 
+   fake_istream cin;
+   fake_ostream cout;
+   fake_ostream cerr;
+   fake_ostream clog;
+ 
+ #ifdef _GLIBCPP_USE_WCHAR_T
+   typedef char fake_wistream[sizeof (wistream)] 
+   __attribute__ ((aligned (__alignof__ (wistream))));
+   typedef char fake_wostream[sizeof (wostream)] 
+   __attribute__ ((aligned (__alignof__ (wostream))));
+ 
+   fake_wistream wcin;
+   fake_wostream wcout;
+   fake_wostream wcerr;
+   fake_wostream wclog;
+ #endif
+ }
Index: src/ios.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/ios.cc,v
retrieving revision 1.12
diff -c -p -r1.12 ios.cc
*** ios.cc	2001/01/17 07:44:57	1.12
--- ios.cc	2001/01/25 22:37:24
***************
*** 35,40 ****
--- 35,41 ----
  #include <bits/std_ostream.h>
  #include <bits/std_istream.h>
  #include <bits/std_fstream.h>
+ #include <stdio.h>
  
  namespace std 
  {
*************** namespace std 
*** 109,123 ****
    int ios_base::Init::_S_ios_base_init = 0;
    bool ios_base::Init::_S_synced_with_stdio = true;
  
!   istream cin(NULL);
!   ostream cout(NULL);
!   ostream cerr(NULL);
!   ostream clog(NULL);
  #ifdef _GLIBCPP_USE_WCHAR_T
!   wistream wcin(NULL);
!   wostream wcout(NULL);
!   wostream wcerr(NULL);
!   wostream wclog(NULL);
  #endif
  
    ios_base::failure::failure(const string& __str) throw()
--- 110,124 ----
    int ios_base::Init::_S_ios_base_init = 0;
    bool ios_base::Init::_S_synced_with_stdio = true;
  
!   extern istream cin;
!   extern ostream cout;
!   extern ostream cerr;
!   extern ostream clog;
  #ifdef _GLIBCPP_USE_WCHAR_T
!   extern wistream wcin;
!   extern wostream wcout;
!   extern wostream wcerr;
!   extern wostream wclog;
  #endif
  
    ios_base::failure::failure(const string& __str) throw()


More information about the Libstdc++ mailing list