GCC modified for the FreeChainXenon project
Find a file
Jonathan Wakely 10f26de915 PR libstdc++/87431 re-adjust never-valueless optimizations
Avoid creating arbitrarily large objects on the stack when emplacing
trivially copyable objects into a variant. Currently we provide the
strong exception-safety guarantee for all trivially copyable types, by
constructing a second variant and then doing a non-throwing move
assignment from the temporary. This patch restricts that behaviour to
trivially copyable types that are no larger than 256 bytes. For larger
types the object will be emplaced directly into the variant, and if its
initialization throws then the variant becomes valueless.

Also implement Antony Polukhin's suggestion to whitelist specific types
that are not trivially copyable but can be efficiently move-assigned.
Emplacing those types will never cause a variant to become valueless.
The whitelisted types are: std::shared_ptr, std::weak_ptr,
std::unique_ptr, std::function, and std::any. Additionally,
std::basic_string, std::vector, and __gnu_debug::vector are whitelisted
if their allocator traits give them a non-throwing move assignment
operator. Specifically, this means std::string is whitelisted, but
std::pmr::string is not.

As part of this patch, additional if-constexpr branches are added for
the cases where the initialization is known to be non-throwing (so the
overhead of the try-catch block can be avoided) and where a scalar is
being produced by a potentially-throwing conversion operator (so that
the overhead of constructing and move-assigning a variant is avoided).
These changes should have no semantic effect, just better codegen.

	PR libstdc++/87431 (again)
	* include/bits/basic_string.h (__variant::_Never_valueless_alt):
	Define partial specialization for basic_string.
	* include/bits/shared_ptr.h (_Never_valueless_alt): Likewise for
	shared_ptr and weak_ptr.
	* include/bits/std_function.h (_Never_valueless_alt): Likewise for
	function.
	* include/bits/stl_vector.h (_Never_valueless_alt): Likewise for
	vector.
	* include/bits/unique_ptr.h (_Never_valueless_alt): Likewise for
	unique_ptr.
	* include/debug/vector (_Never_valueless_alt): Likewise for debug
	vector.
	* include/std/any (_Never_valueless_alt): Define explicit
	specialization for any.
	* include/std/variant (_Never_valueless_alt): Define primary template.
	(__never_valueless): Use _Never_valueless_alt instead of
	is_trivially_copyable.
	(variant::emplace<N>(Args&&...)): Add special case for non-throwing
	initializations to avoid try-catch overhead. Add special case for
	scalars produced by potentially-throwing conversions. Use
	_Never_valueless_alt instead of is_trivially_copyable for the
	remaining strong exception-safety cases.
	(variant::emplace<N>(initializer_list<U>, Args&&...)): Likewise.
	* testsuite/20_util/variant/87431.cc: Run both test functions.
	* testsuite/20_util/variant/exception_safety.cc: New test.
	* testsuite/20_util/variant/run.cc: Use pmr::string instead of string,
	so the variant becomes valueless.

From-SVN: r270170
2019-04-05 17:56:09 +01:00
config mh-mingw: Also set __USE_MINGW_ACCESS flag for C++ code. 2019-03-18 22:36:56 +00:00
contrib Fix ChangeLog entries. 2019-04-05 09:04:41 +00:00
fixincludes Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
gcc Guard notes for -Waddress-of-packed-member on warning emission (PR c/89985) 2019-04-05 15:15:37 +00:00
gnattools PR81878: fix --disable-bootstrap --enable-languages=ada 2018-11-20 00:07:47 +00:00
gotools re PR go/89406 (Go testing leaves many temporary directories in /tmp around) 2019-03-01 05:25:36 +00:00
include [ARC]PR 88409: miscompilation due to missing cc clobber in longlong.h macros 2019-04-03 11:53:03 +02:00
INSTALL
intl iconv.m4 (AM_ICONV_LINK): Don't overwrite CPPFLAGS. 2018-11-07 15:41:21 -07:00
libada Update copyright years. 2019-01-01 13:31:55 +01:00
libatomic Update copyright years. 2019-01-01 13:31:55 +01:00
libbacktrace re PR libbacktrace/89669 (/usr/ccs/bin/ld: Unsatisfied symbols: backtrace_uncompress_zdebug) 2019-03-11 20:40:34 +00:00
libcc1 Update copyright years. 2019-01-01 13:31:55 +01:00
libcpp Fix typo in comment 2019-04-03 18:56:41 +01:00
libdecnumber Update copyright years. 2019-01-01 13:31:55 +01:00
libffi Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
libgcc extend.texi (__clear_cache): Correct signature. 2019-02-21 16:23:12 -07:00
libgfortran re PR libfortran/79540 (FAIL: gfortran.dg/fmt_fw_d.f90 -O0 execution test) 2019-03-25 11:48:36 +00:00
libgo compiler,runtime: pass old slice's ptr/len/cap by value to growslice 2019-03-19 18:42:43 +00:00
libgomp team.c (gomp_team_start): Initialize pool->threads[0]. 2019-03-27 18:30:44 +00:00
libhsail-rt Update copyright years. 2019-01-01 13:31:55 +01:00
libiberty hash-table.h (remove_elt_with_hash): Return if slot is NULL rather than if is_empty (*slot). 2019-03-14 23:47:01 +01:00
libitm Update copyright years. 2019-01-01 13:31:55 +01:00
libobjc encoding.c (DFmode): #undef before #define. 2019-03-06 16:49:13 +01:00
liboffloadmic PR other/16615 [1/5] 2019-01-09 16:37:45 -05:00
libphobos re PR d/88462 (All D execution tests FAIL on Solaris/SPARC) 2019-04-01 14:44:04 +00:00
libquadmath Update copyright years. 2019-01-01 13:31:55 +01:00
libsanitizer re PR sanitizer/80953 (Support libsanitizer on Solaris) 2019-03-13 09:19:25 +00:00
libssp Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-v3 PR libstdc++/87431 re-adjust never-valueless optimizations 2019-04-05 17:56:09 +01:00
libvtv Fix testsuite 2019-02-20 08:07:19 -08:00
lto-plugin Remove a legacy lto-symtab.c file. 2019-02-26 17:27:36 +00:00
maintainer-scripts Improve error message for bad arguments to script 2019-02-23 21:19:04 +00:00
zlib Makefile.am (noinst_LTLIBRARIES): Rename libzgcj_convience.la to libz_convenience.la. 2019-01-21 17:23:58 +00:00
.dir-locals.el
.gitattributes
.gitignore
ABOUT-NLS
ar-lib Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
ChangeLog Revert r254150 (PR bootstrap/89829). 2019-03-28 08:44:44 +00:00
ChangeLog.jit
ChangeLog.tree-ssa
compile
config-ml.in Add D front-end, libphobos library, and D2 testsuite. 2018-10-28 19:51:47 +00:00
config.guess Update config.guess, config.sub (PR target/88535) 2019-01-03 11:28:27 +00:00
config.rpath
config.sub Update config.guess, config.sub (PR target/88535) 2019-01-03 11:28:27 +00:00
configure GCN back-end config 2019-01-17 12:34:28 +00:00
configure.ac GCN back-end config 2019-01-17 12:34:28 +00:00
COPYING
COPYING.LIB
COPYING.RUNTIME
COPYING3
COPYING3.LIB
depcomp
install-sh
libtool-ldflags
libtool.m4 Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
MAINTAINERS MAINTAINERS (Various Maintainers): Remove myself from dfp.c and related, and libdecnumber. 2019-03-28 17:55:57 +11:00
Makefile.def Add D front-end, libphobos library, and D2 testsuite. 2018-10-28 19:51:47 +00:00
Makefile.in Revert r254150 (PR bootstrap/89829). 2019-03-28 08:44:44 +00:00
Makefile.tpl Revert r254150 (PR bootstrap/89829). 2019-03-28 08:44:44 +00:00
missing
mkdep
mkinstalldirs
move-if-change
multilib.am Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
README
symlink-tree
test-driver Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
ylwrap

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.