Patchwork [v3] libstdc++/57920

login
register
mail settings
Submitter Paolo Carlini
Date July 24, 2013, 9:11 a.m.
Message ID <51EF9A53.2090105@oracle.com>
Download mbox | patch
Permalink /patch/261361/
State New
Headers show

Comments

Paolo Carlini - July 24, 2013, 9:11 a.m.
Hi,

On 07/23/2013 12:45 PM, Chung-Ju Wu wrote:
> 2013/7/23 Paolo Carlini <paolo.carlini@oracle.com>:
>> ... in the future, when we manage to actually avoid including <cstdio> from
>> <string> I think we can avoid including it from <random> if we play a bit
>> with void*. Should be safe aliasing-wise. Something like the below,
>> completely untested.
> I tested it on my target.  At least the elf toolchain can be
> successfully built with such changes.
Thanks for testing! I guess we can as well do this now that we are still 
in Stage 1. Also, take the chance to avoid a couple of unnecessary 
reinterpret_casts. Like in the below, which I'm going to apply if 
testing on x86_64-linux goes well.

Paolo.

///////////////////
2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/random.h (random_device): Avoid using the FILE type.
	* include/std/random: Do not include <cstdio>.
	* src/c++11/random.cc: Include it here.
	(random_device::_M_init, random_device::_M_fini,
	random_device::_M_getval): Cast back and forth void* and FILE*.

Patch

Index: include/bits/random.h
===================================================================
--- include/bits/random.h	(revision 201200)
+++ include/bits/random.h	(working copy)
@@ -1638,10 +1638,10 @@ 
 
     union
     {
-    FILE*        _M_file;
-    mt19937      _M_mt;
+      void*      _M_file;
+      mt19937    _M_mt;
+    };
   };
-  };
 
   /* @} */ // group random_generators
 
Index: include/std/random
===================================================================
--- include/std/random	(revision 201200)
+++ include/std/random	(working copy)
@@ -36,7 +36,6 @@ 
 #else
 
 #include <cmath>
-#include <cstdio> // For FILE
 #include <cstdlib>
 #include <string>
 #include <iosfwd>
Index: src/c++11/random.cc
===================================================================
--- src/c++11/random.cc	(revision 201202)
+++ src/c++11/random.cc	(working copy)
@@ -30,13 +30,14 @@ 
 # include <cpuid.h>
 #endif
 
+#include <cstdio>
+
 #ifdef _GLIBCXX_HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-
   namespace
   {
     static unsigned long
@@ -72,7 +73,6 @@ 
 #endif
   }
 
-
   void
   random_device::_M_init(const std::string& token)
   {
@@ -102,8 +102,8 @@ 
       std::__throw_runtime_error(__N("random_device::"
 				     "random_device(const std::string&)"));
 
-    _M_file = std::fopen(fname, "rb");
-    if (! _M_file)
+    _M_file = static_cast<void*>(std::fopen(fname, "rb"));
+    if (!_M_file)
       goto fail;
   }
 
@@ -117,23 +117,24 @@ 
   random_device::_M_fini()
   {
     if (_M_file)
-      std::fclose(_M_file);
+      std::fclose(static_cast<FILE*>(_M_file));
   }
 
   random_device::result_type
   random_device::_M_getval()
   {
 #if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND
-    if (! _M_file)
+    if (!_M_file)
       return __x86_rdrand();
 #endif
 
     result_type __ret;
 #ifdef _GLIBCXX_HAVE_UNISTD_H
-    read(fileno(_M_file), reinterpret_cast<void*>(&__ret), sizeof(result_type));
+    read(fileno(static_cast<FILE*>(_M_file)),
+	 static_cast<void*>(&__ret), sizeof(result_type));
 #else
-    std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
-	       1, _M_file);
+    std::fread(static_cast<void*>(&__ret), sizeof(result_type),
+	       1, static_cast<FILE*>(_M_file));
 #endif
     return __ret;
   }