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:
Xi Ruoyao 2017-05-23 16:11:57 +00:00 committed by Jonathan Wakely
parent e4ea7a4cfe
commit 78aa76df40
10 changed files with 78 additions and 6 deletions

View 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

View 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

View File

@ -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

View 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 {

View File

@ -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

View 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

View 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>

View 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
{

View File

@ -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,

View 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");