This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Opaque evil patch to fix AIX I/O
- To: gcc-patches at gcc dot gnu dot org, libstdc++ at sources dot redhat dot com
- Subject: Opaque evil patch to fix AIX I/O
- From: Mark Mitchell <mark at codesourcery dot com>
- Date: Thu, 25 Jan 2001 14:48:24 -0800
- Organization: CodeSourcery, LLC
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()