diff --git a/libstdc++/ChangeLog b/libstdc++/ChangeLog
index 658f5fd44aea66524a7e3b3f6ff0b924c63079d4..12a0e53039e3b40bdcf86ea0c899d9d7e9d99208 100644
--- a/libstdc++/ChangeLog
+++ b/libstdc++/ChangeLog
@@ -33,6 +33,20 @@ Thu Feb 18 19:53:17 1999  Marc Espie <espie@cvs.openbsd.org>
 	* config/openbsd.ml: New file.
 	* config/openbsd.mt: New file.
 
+1999-02-04  Ulrich Drepper  <drepper@cygnus.com>
+
+	* configure.in: Recognize --enable-threads=posix for all
+	platforms.
+	* config/posix.mt: New file.
+
+	* configure.in: Add fragments for Solaris defining macro specifying
+	thread library to be used.
+	* config/sol2pth.mt: New file
+	* config/sol2solth.mt: New file.
+	* stl/stl_alloc.h: Add support for Solaris thread library.
+	* stl/stl_config.h: Recognize _SOLTHREADS and define internal macros
+	appropriately.
+
 1999-01-28  Baron Roberts  <baron@sgi.com>
 
 	* string: Uncomment wstring declaration.
diff --git a/libstdc++/configure.in b/libstdc++/configure.in
index 9590b6b363eb293c46c92d8421cbfcc17cdf710b..0f556cac551c0dcc83223f8a17cc1ce8d9e9a5ec 100644
--- a/libstdc++/configure.in
+++ b/libstdc++/configure.in
@@ -176,6 +176,11 @@ if [ -n "${with_cross_host}" ] ; then
     mv -f Makefile.tem Makefile
 fi
 
+# enable multilib-ing by default.
+if [ -z "${enable_multilib}" ]; then
+    enable_multilib=yes
+fi
+
 . ${topsrcdir}/config-ml.in
 
 gxx_include_dir=
diff --git a/libstdc++/stl/bitset b/libstdc++/stl/bitset
index 64fa59592326af1b3e04e53a5c4ce2dbfcf485d0..36edf09659e86c282a322df253d217a23821fcc5 100644
--- a/libstdc++/stl/bitset
+++ b/libstdc++/stl/bitset
@@ -9,7 +9,7 @@
  * in supporting documentation.  Silicon Graphics makes no
  * representations about the suitability of this software for any
  * purpose.  It is provided "as is" without express or implied warranty.
- */ 
+ */
 
 #ifndef __SGI_STL_BITSET
 #define __SGI_STL_BITSET
@@ -19,12 +19,12 @@
 // THIS FEATURE*.  It is experimental, and it may be removed in
 // future releases.
 
-// A bitset of size N, using words of type _WordT, will have 
+// A bitset of size N, using words of type _WordT, will have
 // N % (sizeof(_WordT) * CHAR_BIT) unused bits.  (They are the high-
 // order bits in the highest word.)  It is a class invariant
 // of class bitset<> that those unused bits are always zero.
 
-// Most of the actual code isn't contained in bitset<> itself, but in the 
+// Most of the actual code isn't contained in bitset<> itself, but in the
 // base class _Base_bitset.  The base class works with whole words, not with
 // individual bits.  This allows us to specialize _Base_bitset for the
 // important special case where the bitset is only a single word.
@@ -51,14 +51,14 @@ __STL_BEGIN_NAMESPACE
 #endif
 
 // structure to aid in counting bits
-template<bool __dummy> 
+template<bool __dummy>
 struct _Bit_count {
   static unsigned char _S_bit_count[256];
 };
 
 // Mapping from 8 bit unsigned integers to the index of the first one
 // bit:
-template<bool __dummy> 
+template<bool __dummy>
 struct _First_one {
   static unsigned char _S_first_one[256];
 };
@@ -162,7 +162,7 @@ struct _Base_bitset {
     return __result;
   }
 
-  unsigned long _M_do_to_ulong() const; 
+  unsigned long _M_do_to_ulong() const;
 
   // find first "on" bit
   size_t _M_do_find_first(size_t __not_found) const;
@@ -173,7 +173,7 @@ struct _Base_bitset {
 
 //
 // Definitions of non-inline functions from _Base_bitset.
-// 
+//
 
 template<size_t _Nw, class _WordT>
 _Base_bitset<_Nw, _WordT>::_Base_bitset(unsigned long __val)
@@ -187,7 +187,7 @@ _Base_bitset<_Nw, _WordT>::_Base_bitset(unsigned long __val)
 }
 
 template<size_t _Nw, class _WordT>
-void _Base_bitset<_Nw, _WordT>::_M_do_left_shift(size_t __shift) 
+void _Base_bitset<_Nw, _WordT>::_M_do_left_shift(size_t __shift)
 {
   if (__shift != 0) {
     const size_t __wshift = __shift / __BITS_PER_WORDT(_WordT);
@@ -195,7 +195,7 @@ void _Base_bitset<_Nw, _WordT>::_M_do_left_shift(size_t __shift)
     const size_t __sub_offset = __BITS_PER_WORDT(_WordT) - __offset;
     size_t __n = _Nw - 1;
     for ( ; __n > __wshift; --__n)
-      _M_w[__n] = (_M_w[__n - __wshift] << __offset) | 
+      _M_w[__n] = (_M_w[__n - __wshift] << __offset) |
                 (_M_w[__n - __wshift - 1] >> __sub_offset);
     if (__n == __wshift)
       _M_w[__n] = _M_w[0] << __offset;
@@ -205,7 +205,7 @@ void _Base_bitset<_Nw, _WordT>::_M_do_left_shift(size_t __shift)
 }
 
 template<size_t _Nw, class _WordT>
-void _Base_bitset<_Nw, _WordT>::_M_do_right_shift(size_t __shift) 
+void _Base_bitset<_Nw, _WordT>::_M_do_right_shift(size_t __shift)
 {
   if (__shift != 0) {
     const size_t __wshift = __shift / __BITS_PER_WORDT(_WordT);
@@ -214,7 +214,7 @@ void _Base_bitset<_Nw, _WordT>::_M_do_right_shift(size_t __shift)
     const size_t __limit = _Nw - __wshift - 1;
     size_t __n = 0;
     for ( ; __n < __limit; ++__n)
-      _M_w[__n] = (_M_w[__n + __wshift] >> __offset) | 
+      _M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
                   (_M_w[__n + __wshift + 1] << __sub_offset);
     _M_w[__limit] = _M_w[_Nw-1] >> __offset;
     for (size_t __n1 = __limit + 1; __n1 < _Nw; ++__n1)
@@ -228,12 +228,12 @@ unsigned long _Base_bitset<_Nw, _WordT>::_M_do_to_ulong() const
   const overflow_error __overflow("bitset");
 
   if (sizeof(_WordT) >= sizeof(unsigned long)) {
-    for (size_t __i = 1; __i < _Nw; ++__i) 
-      if (_M_w[__i]) 
+    for (size_t __i = 1; __i < _Nw; ++__i)
+      if (_M_w[__i])
         __STL_THROW(__overflow);
 
     const _WordT __mask = static_cast<_WordT>(static_cast<unsigned long>(-1));
-    if (_M_w[0] & ~__mask) 
+    if (_M_w[0] & ~__mask)
       __STL_THROW(__overflow);
 
     return static_cast<unsigned long>(_M_w[0] & __mask);
@@ -244,18 +244,18 @@ unsigned long _Base_bitset<_Nw, _WordT>::_M_do_to_ulong() const
 
     size_t __min_nwords = __nwords;
     if (_Nw > __nwords) {
-      for (size_t __i = __nwords; __i < _Nw; ++__i) 
-        if (_M_w[__i]) 
+      for (size_t __i = __nwords; __i < _Nw; ++__i)
+        if (_M_w[__i])
           __STL_THROW(__overflow);
     }
-    else 
+    else
       __min_nwords = _Nw;
-      
+
     // If unsigned long is 8 bytes and _WordT is 6 bytes, then an unsigned
     // long consists of all of one word plus 2 bytes from another word.
     const size_t __part = sizeof(unsigned long) % sizeof(_WordT);
 
-    if (__part != 0 && __nwords <= _Nw && 
+    if (__part != 0 && __nwords <= _Nw &&
         (_M_w[__min_nwords - 1] >> ((sizeof(_WordT) - __part) * CHAR_BIT)) != 0)
       __STL_THROW(__overflow);
 
@@ -269,7 +269,7 @@ unsigned long _Base_bitset<_Nw, _WordT>::_M_do_to_ulong() const
 } // End _M_do_to_ulong
 
 template<size_t _Nw, class _WordT>
-size_t _Base_bitset<_Nw, _WordT>::_M_do_find_first(size_t __not_found) const 
+size_t _Base_bitset<_Nw, _WordT>::_M_do_find_first(size_t __not_found) const
 {
   for ( size_t __i = 0; __i < _Nw; __i++ ) {
     _WordT __thisword = _M_w[__i];
@@ -292,7 +292,7 @@ size_t _Base_bitset<_Nw, _WordT>::_M_do_find_first(size_t __not_found) const
 
 template<size_t _Nw, class _WordT>
 size_t
-_Base_bitset<_Nw, _WordT>::_M_do_find_next(size_t __prev, 
+_Base_bitset<_Nw, _WordT>::_M_do_find_next(size_t __prev,
                                            size_t __not_found) const
 {
   // make bound inclusive
@@ -359,7 +359,7 @@ struct _Base_bitset<1, _WordT> {
 
   _Base_bitset( void ) { _M_do_reset(); }
 
-  _Base_bitset(unsigned long __val); 
+  _Base_bitset(unsigned long __val);
 
   static size_t _S_whichword( size_t __pos ) {
     return __pos / __BITS_PER_WORDT(_WordT);
@@ -412,7 +412,7 @@ struct _Base_bitset<1, _WordT> {
         return static_cast<unsigned long>(_M_w);
     else {
       const _WordT __mask = static_cast<_WordT>(static_cast<unsigned long>(-1));
-      if (_M_w & ~__mask) 
+      if (_M_w & ~__mask)
         __STL_THROW(overflow_error("bitset"));
       return static_cast<unsigned long>(_M_w);
     }
@@ -421,7 +421,7 @@ struct _Base_bitset<1, _WordT> {
   size_t _M_do_find_first(size_t __not_found) const;
 
   // find the next "on" bit that follows "prev"
-  size_t _M_do_find_next(size_t __prev, size_t __not_found) const; 
+  size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
 
 };
 
@@ -431,7 +431,7 @@ struct _Base_bitset<1, _WordT> {
 //
 
 template <class _WordT>
-_Base_bitset<1, _WordT>::_Base_bitset(unsigned long __val) 
+_Base_bitset<1, _WordT>::_Base_bitset(unsigned long __val)
 {
   _M_do_reset();
   const size_t __n = min(sizeof(unsigned long)*CHAR_BIT,
@@ -462,8 +462,8 @@ size_t _Base_bitset<1, _WordT>::_M_do_find_first(size_t __not_found) const
 }
 
 template <class _WordT>
-size_t 
-_Base_bitset<1, _WordT>::_M_do_find_next(size_t __prev, 
+size_t
+_Base_bitset<1, _WordT>::_M_do_find_next(size_t __prev,
                                          size_t __not_found ) const
 {
   // make bound inclusive
@@ -499,12 +499,12 @@ _Base_bitset<1, _WordT>::_M_do_find_next(size_t __prev,
 
 //
 // One last specialization: _M_do_to_ulong() and the constructor from
-// unsigned long are very simple if the bitset consists of a single 
+// unsigned long are very simple if the bitset consists of a single
 // word of type unsigned long.
 //
 
 template<>
-inline unsigned long 
+inline unsigned long
 _Base_bitset<1, unsigned long>::_M_do_to_ulong() const { return _M_w; }
 
 template<>
@@ -531,7 +531,7 @@ template <class _WordT> struct _Sanitize<_WordT, 0> {
 //   Type _WordT may be any unsigned integral type.
 
 template<size_t _Nb, class _WordT = unsigned long>
-class bitset : private _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT> 
+class bitset : private _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT>
 {
 private:
   typedef _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT> _Base;
@@ -620,16 +620,16 @@ public:
 
   // 23.3.5.1 constructors:
   bitset() {}
-  bitset(unsigned long __val) : 
+  bitset(unsigned long __val) :
     _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT>(__val) {}
 
   template<class _CharT, class _Traits, class _Alloc>
   explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
                   size_t __pos = 0,
-                  size_t __n = size_t(basic_string<_CharT,_Traits,_Alloc>::npos))
-    : _Base() 
+                  size_t __n = basic_string<_CharT,_Traits,_Alloc>::npos)
+    : _Base()
   {
-    if (__pos > __s.size()) 
+    if (__pos > __s.size())
       __STL_THROW(out_of_range("bitset"));
     _M_copy_from_string(__s, __pos, __n);
   }
@@ -742,7 +742,7 @@ public:
     return _Unchecked_flip(__pos);
   }
 
-  bitset<_Nb,_WordT> operator~() const { 
+  bitset<_Nb,_WordT> operator~() const {
     return bitset<_Nb,_WordT>(*this).flip();
   }
 
@@ -753,7 +753,7 @@ public:
 
   unsigned long to_ulong() const { return _M_do_to_ulong(); }
 
-#ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
+#if __STL_EXPLICIT_FUNCTION_TMPL_ARGS
   template <class _CharT, class _Traits, class _Alloc>
   basic_string<_CharT, _Traits, _Alloc> to_string() const {
     basic_string<_CharT, _Traits, _Alloc> __result;
@@ -802,14 +802,14 @@ public:
   // EXTENSIONS: bit-find operations.  These operations are
   // experimental, and are subject to change or removal in future
   // versions.
-  // 
+  //
 
   // find the index of the first "on" bit
-  size_t _Find_first() const 
+  size_t _Find_first() const
     { return _M_do_find_first(_Nb); }
 
   // find the index of the next "on" bit after prev
-  size_t _Find_next( size_t __prev ) const 
+  size_t _Find_next( size_t __prev ) const
     { return _M_do_find_next(__prev, _Nb); }
 
 };
@@ -846,8 +846,8 @@ void bitset<_Nb, _WordT>
   ::_M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
 {
   __s.assign(_Nb, '0');
-  
-  for (size_t __i = 0; __i < _Nb; ++__i) 
+
+  for (size_t __i = 0; __i < _Nb; ++__i)
     if (_Unchecked_test(__i))
       __s[_Nb - 1 - __i] = '1';
 }
@@ -894,7 +894,7 @@ operator>>(istream& __is, bitset<_Nb,_WordT>& __x) {
   // In new templatized iostreams, use istream::sentry
   if (__is.flags() & ios::skipws) {
     char __c;
-    do 
+    do
       __is.get(__c);
     while (__is && isspace(__c));
     if (__is)
@@ -915,7 +915,7 @@ operator>>(istream& __is, bitset<_Nb,_WordT>& __x) {
       __tmp.push_back(__c);
   }
 
-  if (__tmp.empty()) 
+  if (__tmp.empty())
     __is.clear(__is.rdstate() | ios::failbit);
   else
     __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb);
@@ -1061,4 +1061,3 @@ __STL_END_NAMESPACE
 // Local Variables:
 // mode:C++
 // End:
-