PR libstdc++/67578 Implement non-trivial std::random_device::entropy
authorXi Ruoyao <ryxi@stu.xidian.edu.cn>
Tue, 23 May 2017 16:11:57 +0000 (16:11 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 23 May 2017 16:11:57 +0000 (17:11 +0100)
2017-05-23  Xi Ruoyao  <ryxi@stu.xidian.edu.cn>
    Jonathan Wakely  <jwakely@redhat.com>

PR libstdc++/67578
* acinclude.m4: Bump libtool_VERSION.
* config/abi/pre/gnu.ver: Create GLIBCXX_3.4.24 with new symbol.
* config.h.in: Regenerate.
* configure: Regenerate.
* configure.ac: Add test for <linux/random.h>.
* doc/xml/manual/abi.xml: Document new library version.
* include/bits/random.h (random_device::entropy)
[_GLIBCXX_USE_RANDOM_TR1]: Add call to new _M_getentropy member.
(random_device::_M_getentropy): Declare.
* src/c++11/random.cc (random_device::_M_getentropy): Define.
* testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.24 to known
versions, and make it the latest version.

Co-Authored-By: Jonathan Wakely <jwakely@redhat.com>
From-SVN: r248374

libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/config.h.in
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/configure
libstdc++-v3/configure.ac
libstdc++-v3/doc/xml/manual/abi.xml
libstdc++-v3/include/bits/random.h
libstdc++-v3/src/c++11/random.cc
libstdc++-v3/testsuite/util/testsuite_abi.cc

index 5b34ccf1166928be75abbcf4b50023d905e30cc9..536e710f1effa8dd02ac6421d8acfc5111c9b994 100644 (file)
@@ -1,3 +1,20 @@
+2017-05-23  Xi Ruoyao  <ryxi@stu.xidian.edu.cn>
+           Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/67578
+       * acinclude.m4: Bump libtool_VERSION.
+       * config/abi/pre/gnu.ver: Create GLIBCXX_3.4.24 with new symbol.
+       * config.h.in: Regenerate.
+       * configure: Regenerate.
+       * configure.ac: Add test for <linux/random.h>.
+       * doc/xml/manual/abi.xml: Document new library version.
+       * include/bits/random.h (random_device::entropy)
+       [_GLIBCXX_USE_RANDOM_TR1]: Add call to new _M_getentropy member.
+       (random_device::_M_getentropy): Declare.
+       * src/c++11/random.cc (random_device::_M_getentropy): Define.
+       * testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.24 to known
+       versions, and make it the latest version.
+
 2017-05-23  Xi Ruoyao  <ryxi@stu.xidian.edu.cn>
 
        PR libstdc++/67214
index 61c8cb29084a5b2bbcfbc99a142fd0c2aa9727e8..baeea67c459fb59b9fbedf60d29fb3e090c9ec60 100644 (file)
@@ -3750,7 +3750,7 @@ changequote([,])dnl
 fi
 
 # For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:23:0
+libtool_VERSION=6:24:0
 
 # Everything parsed; figure out what files and settings to use.
 case $enable_symvers in
index f1527d9938b45b23b53850fa87f21e80d3fb6bfb..e31e054c0244be2eb44f810838ed7615de62e572 100644 (file)
 /* Define if futex syscall is available. */
 #undef HAVE_LINUX_FUTEX
 
+/* Define to 1 if you have the <linux/random.h> header file. */
+#undef HAVE_LINUX_RANDOM_H
+
 /* Define to 1 if you have the <locale.h> header file. */
 #undef HAVE_LOCALE_H
 
index 268fb9479a9e6475b77b884768b3141beafb695f..48e2ec870fc3106cefe517a9982116c8272acff5 100644 (file)
@@ -1967,6 +1967,13 @@ GLIBCXX_3.4.23 {
 
 } GLIBCXX_3.4.22;
 
+GLIBCXX_3.4.24 {
+
+    # std::random_device::_M_getentropy() const
+    _ZNKSt13random_device13_M_getentropyEv;
+
+} GLIBCXX_3.4.23;
+
 # Symbols in the support library (libsupc++) have their own tag.
 CXXABI_1.3 {
 
index 7c10c9e42df33d88ee352c5e7a08c87fbea30f11..282b4617db8331aab2c867f5f150103cff041647 100755 (executable)
@@ -21795,7 +21795,7 @@ for ac_header in endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
 locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
 strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
 sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
-wchar.h wctype.h
+wchar.h wctype.h linux/random.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -79268,7 +79268,7 @@ $as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
 fi
 
 # For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:23:0
+libtool_VERSION=6:24:0
 
 # Everything parsed; figure out what files and settings to use.
 case $enable_symvers in
index 8e973503be01d1f4bc3591559f4a1da0710b2e48..270dcbaf7234c9b3da2cafa9599f19f570f5205a 100644 (file)
@@ -237,7 +237,7 @@ AC_CHECK_HEADERS([endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
 locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
 strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
 sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
-wchar.h wctype.h])
+wchar.h wctype.h linux/random.h])
 
 # Only do link tests if native. Else, hardcode.
 if $GLIBCXX_IS_NATIVE; then
index d086d9ecf2dc4e0b7b968b6da49a38f283a76415..d17f06e25fb3f97887857dfaa99465694b1f6a83 100644 (file)
@@ -266,6 +266,7 @@ compatible.
     <listitem><para>GCC 5.1.0: libstdc++.so.6.0.21</para></listitem>
     <listitem><para>GCC 6.1.0: libstdc++.so.6.0.22</para></listitem>
     <listitem><para>GCC 7.1.0: libstdc++.so.6.0.23</para></listitem>
+    <listitem><para>GCC 8.0.0: libstdc++.so.6.0.24</para></listitem>
     </itemizedlist>
     <para>
       Note 1: Error should be libstdc++.so.3.0.3.
@@ -334,6 +335,7 @@ compatible.
     <listitem><para>GCC 5.1.0: GLIBCXX_3.4.21, CXXABI_1.3.9</para></listitem>
     <listitem><para>GCC 6.1.0: GLIBCXX_3.4.22, CXXABI_1.3.10</para></listitem>
     <listitem><para>GCC 7.1.0: GLIBCXX_3.4.23, CXXABI_1.3.11</para></listitem>
+    <listitem><para>GCC 8.0.0: GLIBCXX_3.4.24, CXXABI_1.3.11</para></listitem>
     </itemizedlist>
     </listitem>
 
index d39cc3e0666e8a70002088a73572b36675393419..bb761ec8fb0615f1c67bf2d7ffd7349f4347de7c 100644 (file)
@@ -1603,7 +1603,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     double
     entropy() const noexcept
-    { return 0.0; }
+    {
+#ifdef _GLIBCXX_USE_RANDOM_TR1
+      return this->_M_getentropy();
+#else
+      return 0.0;
+#endif
+    }
 
     result_type
     operator()()
@@ -1627,6 +1633,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     result_type _M_getval();
     result_type _M_getval_pretr1();
+    double _M_getentropy() const noexcept;
 
     union
     {
index df798742fcefd72e8311ca0a92304c1c8cd05f0d..5011cf2bb6b720df4f41c748cb80ca87d974eb19 100644 (file)
 # include <unistd.h>
 #endif
 
+#ifdef _GLIBCXX_HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+
+#ifdef _GLIBCXX_HAVE_LINUX_RANDOM_H
+# include <linux/random.h>
+#endif
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
   namespace
@@ -161,6 +169,33 @@ namespace std _GLIBCXX_VISIBILITY(default)
     return _M_mt();
   }
 
+  double
+  random_device::_M_getentropy() const noexcept
+  {
+#if defined _GLIBCXX_HAVE_SYS_IOCTL_H && defined RNDGETENTCNT
+    if (!_M_file)
+      return 0.0;
+
+    const int fd = fileno(static_cast<FILE*>(_M_file));
+    if (fd < 0)
+      return 0.0;
+
+    int ent;
+    if (ioctl(fd, RNDGETENTCNT, &ent) < 0)
+      return 0.0;
+
+    if (ent < 0)
+      return 0.0;
+
+    if (static_cast<unsigned>(ent) > sizeof(result_type) * 8)
+      return static_cast<double>(sizeof(result_type) * 8);
+
+    return static_cast<double>(ent);
+#else
+    return 0.0;
+#endif
+  }
+
   template class mersenne_twister_engine<
     uint_fast32_t,
     32, 624, 397, 31,
index f5fc594d194aedf50704bd9f2969fb4fba5f2b3c..ee7572ea2444d70c15b528f95dd42f0b1723adcb 100644 (file)
@@ -204,6 +204,7 @@ check_version(symbol& test, bool added)
       known_versions.push_back("GLIBCXX_LDBL_3.4.21");
       known_versions.push_back("GLIBCXX_3.4.22");
       known_versions.push_back("GLIBCXX_3.4.23");
+      known_versions.push_back("GLIBCXX_3.4.24");
       known_versions.push_back("CXXABI_1.3");
       known_versions.push_back("CXXABI_LDBL_1.3");
       known_versions.push_back("CXXABI_1.3.1");
@@ -234,7 +235,7 @@ check_version(symbol& test, bool added)
        test.version_status = symbol::incompatible;
 
       // Check that added symbols are added in the latest pre-release version.
-      bool latestp = (test.version_name == "GLIBCXX_3.4.23"
+      bool latestp = (test.version_name == "GLIBCXX_3.4.24"
                     || test.version_name == "CXXABI_1.3.11"
                     || test.version_name == "CXXABI_FLOAT128"
                     || test.version_name == "CXXABI_TM_1");