PR libstdc++/67578 Implement non-trivial std::random_device::entropy
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
This commit is contained in:
parent
e4ea7a4cfe
commit
78aa76df40
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -267,6 +267,9 @@
|
|||
/* 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
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -38,6 +38,14 @@
|
|||
# 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,
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue