Commit Graph

16 Commits

Author SHA1 Message Date
Björn Schäpers b1c839be83 libstdc++: Deliver names of C functions in <stacktrace>
__cxa_demangle is only to demangle C++ names, for all C functions,
extern "C" functions, and including main it returns -2, in that case
just adapt the given name. Otherwise it's kept empty, which doesn't look
nice in the stacktrace.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (stacktrace_entry::_S_demangle): Use
	raw __name if __cxa_demangle could not demangle it.

Signed-off-by: Björn Schäpers <bjoern@hazardy.de>
2023-01-14 20:49:45 +00:00
Jonathan Wakely 881c6cabce libstdc++: Fix size passed to operator delete [PR108097]
The number of elements gets stored in _M_capacity so use a separate
variable for the number of bytes to allocate.

libstdc++-v3/ChangeLog:

	PR libstdc++/108097
	* include/std/stacktrace (basic_stracktrace::_Impl): Do not
	multiply N by sizeof(value_type) when allocating.
2022-12-14 14:11:13 +00:00
Jonathan Wakely 2327d93314 libstdc++: Make operator<< for stacktraces less templated (LWG 3515)
This change was approved for C++23 last month.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (operator<<): Only output to narrow
	ostreams (LWG 3515).
	* testsuite/19_diagnostics/stacktrace/synopsis.cc:
2022-12-12 14:00:08 +00:00
Björn Schäpers 40adb39566 libstdc++: Add error handler for <stacktrace>
Not providing an error handler results in a null pointer dereference
when an error occurs.

Co-authored-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (stacktrace_entry::_S_err_handler): New
	static function.
	(stacktrace_entry, basic_stacktrace): Pass &_S_err_handler to
	all calls to libbacktrace.
2022-12-02 00:17:42 +00:00
Arsen Arsenović 18f176d0b2 libstdc++: Mark headers that must be hosted as such [PR103626]
PR libstdc++/103626 - _GLIBCXX_HOSTED should respect -ffreestanding

Co-authored-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/103626
	* include/Makefile.am: Add new header.
	* include/Makefile.in: Regenerate.
	* include/bits/requires_hosted.h: New header.
	* include/experimental/algorithm: Include
	<bits/requires_hosted.h>.
	* include/experimental/any: Likewise.
	* include/experimental/array: Likewise.
	* include/experimental/buffer: Likewise.
	* include/experimental/chrono: Likewise.
	* include/experimental/deque: Likewise.
	* include/experimental/executor: Likewise.
	* include/experimental/filesystem: Likewise.
	* include/experimental/forward_list: Likewise.
	* include/experimental/functional: Likewise.
	* include/experimental/internet: Likewise.
	* include/experimental/io_context: Likewise.
	* include/experimental/iterator: Likewise.
	* include/experimental/list: Likewise.
	* include/experimental/map: Likewise.
	* include/experimental/memory: Likewise.
	* include/experimental/memory_resource: Likewise.
	* include/experimental/net: Likewise.
	* include/experimental/netfwd: Likewise.
	* include/experimental/numeric: Likewise.
	* include/experimental/optional: Likewise.
	* include/experimental/propagate_const: Likewise.
	* include/experimental/random: Likewise.
	* include/experimental/ratio: Likewise.
	* include/experimental/regex: Likewise.
	* include/experimental/scope: Likewise.
	* include/experimental/set: Likewise.
	* include/experimental/simd: Likewise.
	* include/experimental/socket: Likewise.
	* include/experimental/source_location: Likewise.
	* include/experimental/string: Likewise.
	* include/experimental/string_view: Likewise.
	* include/experimental/system_error: Likewise.
	* include/experimental/timer: Likewise.
	* include/experimental/tuple: Likewise.
	* include/experimental/unordered_map: Likewise.
	* include/experimental/unordered_set: Likewise.
	* include/experimental/utility: Likewise.
	* include/experimental/vector: Likewise.
	* include/std/barrier: Likewise.
	* include/std/chrono: Likewise.
	* include/std/condition_variable: Likewise.
	* include/std/deque: Likewise.
	* include/std/execution: Likewise.
	* include/std/filesystem: Likewise.
	* include/std/forward_list: Likewise.
	* include/std/fstream: Likewise.
	* include/std/future: Likewise.
	* include/std/iomanip: Likewise.
	* include/std/ios: Likewise.
	* include/std/iosfwd: Likewise.
	* include/std/iostream: Likewise.
	* include/std/istream: Likewise.
	* include/std/latch: Likewise.
	* include/std/list: Likewise.
	* include/std/locale: Likewise.
	* include/std/map: Likewise.
	* include/std/memory_resource: Likewise.
	* include/std/mutex: Likewise.
	* include/std/ostream: Likewise.
	* include/std/queue: Likewise.
	* include/std/random: Likewise.
	* include/std/regex: Likewise.
	* include/std/semaphore: Likewise.
	* include/std/set: Likewise.
	* include/std/shared_mutex: Likewise.
	* include/std/spanstream: Likewise.
	* include/std/sstream: Likewise.
	* include/std/stack: Likewise.
	* include/std/stacktrace: Likewise.
	* include/std/stop_token: Likewise.
	* include/std/streambuf: Likewise.
	* include/std/string: Likewise.
	* include/std/syncstream: Likewise.
	* include/std/system_error: Likewise.
	* include/std/thread: Likewise.
	* include/std/unordered_map: Likewise.
	* include/std/unordered_set: Likewise.
	* include/std/valarray: Likewise.
	* include/std/vector: Likewise.
	* include/tr1/array: Likewise.
	* include/tr1/ccomplex: Likewise.
	* include/tr1/cctype: Likewise.
	* include/tr1/cfenv: Likewise.
	* include/tr1/cfloat: Likewise.
	* include/tr1/cinttypes: Likewise.
	* include/tr1/climits: Likewise.
	* include/tr1/cmath: Likewise.
	* include/tr1/complex: Likewise.
	* include/tr1/complex.h: Likewise.
	* include/tr1/cstdarg: Likewise.
	* include/tr1/cstdbool: Likewise.
	* include/tr1/cstdint: Likewise.
	* include/tr1/cstdio: Likewise.
	* include/tr1/cstdlib: Likewise.
	* include/tr1/ctgmath: Likewise.
	* include/tr1/ctime: Likewise.
	* include/tr1/ctype.h: Likewise.
	* include/tr1/cwchar: Likewise.
	* include/tr1/cwctype: Likewise.
	* include/tr1/fenv.h: Likewise.
	* include/tr1/float.h: Likewise.
	* include/tr1/functional: Likewise.
	* include/tr1/inttypes.h: Likewise.
	* include/tr1/limits.h: Likewise.
	* include/tr1/math.h: Likewise.
	* include/tr1/memory: Likewise.
	* include/tr1/random: Likewise.
	* include/tr1/regex: Likewise.
	* include/tr1/stdarg.h: Likewise.
	* include/tr1/stdbool.h: Likewise.
	* include/tr1/stdint.h: Likewise.
	* include/tr1/stdio.h: Likewise.
	* include/tr1/stdlib.h: Likewise.
	* include/tr1/tgmath.h: Likewise.
	* include/tr1/tuple: Likewise.
	* include/tr1/type_traits: Likewise.
	* include/tr1/unordered_map: Likewise.
	* include/tr1/unordered_set: Likewise.
	* include/tr1/utility: Likewise.
	* include/tr1/wchar.h: Likewise.
	* include/tr1/wctype.h: Likewise.
	* include/c_global/cmath: Likewise.
	* include/ext/algorithm: Include <bits/requires_hosted.h>.
	* include/ext/bitmap_allocator.h: Likewise.
	* include/ext/cmath: Likewise.
	* include/ext/codecvt_specializations.h: Likewise.
	* include/ext/debug_allocator.h: Likewise.
	* include/ext/enc_filebuf.h: Likewise.
	* include/ext/extptr_allocator.h: Likewise.
	* include/ext/functional: Likewise.
	* include/ext/malloc_allocator.h: Likewise.
	* include/ext/memory: Likewise.
	* include/ext/mt_allocator.h: Likewise.
	* include/ext/new_allocator.h: Likewise.
	* include/ext/numeric: Likewise.
	* include/ext/pod_char_traits.h: Likewise.
	* include/ext/pool_allocator.h: Likewise.
	* include/ext/random: Likewise.
	* include/ext/random.tcc: Likewise.
	* include/ext/rb_tree: Likewise.
	* include/ext/rc_string_base.h: Likewise.
	* include/ext/rope: Likewise.
	* include/ext/ropeimpl.h: Likewise.
	* include/ext/slist: Likewise.
	* include/ext/sso_string_base.h: Likewise.
	* include/ext/stdio_filebuf.h: Likewise.
	* include/ext/stdio_sync_filebuf.h: Likewise.
	* include/ext/string_conversions.h: Likewise.
	* include/ext/throw_allocator.h: Likewise.
	* include/ext/vstring.h: Likewise.
	* include/ext/vstring.tcc: Likewise.
	* include/ext/vstring_fwd.h: Likewise.
	* include/ext/vstring_util.h: Likewise.
	* include/std/charconv: Likewise.
	(__cpp_lib_to_chars): Do not define for freestanding.
	* include/std/version: Adjust which macros get defined in
	freestanding.
	* include/ext/pointer.h [!_GLIBCXX_HOSTED]: Omit iostream
	functionality from freestanding.
	* include/std/algorithm [!_GLIBCXX_HOSTED]: Omit PSTL algos.
	* include/std/memory [!_GLIBCXX_HOSTED]: Omit
	<bits/stl_tempbuf.h> in freestanding
	* include/bits/algorithmfwd.h [!_GLIBCXX_HOSTED]: Omit leftover
	random_shuffle and stable_partition definition.
	* include/bits/stl_algo.h [!_GLIBCXX_HOSTED]: Omit
	random_shuffle and stable_partition from freestanding.
	* include/bits/ranges_algo.h [!_GLIBCXX_HOSTED]: Omit
	stable_partition from freestanding.
	* include/bits/concept_check.h: Remove needless HOSTED check.
	* include/std/iterator: Include <bits/ranges_base.h>.
	* include/std/numeric (__cpp_lib_parallel_algorithms): Do not
	define for freestanding.
	* include/std/functional (__cpp_lib_boyer_moore_searcher):
	Likewise.
	* testsuite/lib/prune.exp: Match error for hosted-only libstdc++
	tests.
2022-10-03 15:43:48 +01:00
Jonathan Wakely 6f038efd93 libstdc++: Avoid including <cstdint> for std::char_traits
We should prefer the __UINT_LEAST16_TYPE__ and __UINT_LEAST32_TYPE__
macros, if available, so that we don't need all of <cstdint> in every
header that uses std::char_traits.

libstdc++-v3/ChangeLog:

	* include/bits/char_traits.h: Only include <cstdint> when
	necessary.
	* include/std/stacktrace: Use __UINTPTR_TYPE__ instead of
	uintptr_t.
	* src/c++11/cow-stdexcept.cc: Include <stdint.h>.
	* src/c++17/floating_to_chars.cc: Likewise.
	* testsuite/20_util/assume_aligned/1.cc: Include <cstdint>.
	* testsuite/20_util/assume_aligned/3.cc: Likewise.
	* testsuite/20_util/shared_ptr/creation/array.cc: Likewise.
2022-05-19 23:39:21 +01:00
Jonathan Wakely 8ccdc7ce33 libstdc++: Ensure pmr aliases work without <memory_resource>
Currently the alias templates for std::pmr::vector, std::pmr::string
etc. are defined using a forward declaration for polymorphic_allocator.
This means you can't actually use the alias templates unless you also
include <memory_resource>. The rationale for that is that it's a fairly
large header, and most users don't need it. This isn't uncontroversial
though, and LWG 3681 questions whether it's even conforming.

This change adds a new <bits/memory_resource.h> header with the minimum
needed to use polymorphic_allocator and the std::pmr container aliases.
Including <memory_resource> is still necessary to use the program-wide
resource objects, or the pool resources or monotonic buffer resource.

libstdc++-v3/ChangeLog:

	* include/Makefile.am: Add new header.
	* include/Makefile.in: Regenerate.
	* include/bits/memory_resource.h: New file.
	* include/std/deque: Include <bits/memory_resource.h>.
	* include/std/forward_list: Likewise.
	* include/std/list: Likewise.
	* include/std/map: Likewise.
	* include/std/memory_resource (pmr::memory_resource): Move to
	new <bits/memory_resource.h> header.
	(pmr::polymorphic_allocator): Likewise.
	* include/std/regex: Likewise.
	* include/std/set: Likewise.
	* include/std/stacktrace: Likewise.
	* include/std/string: Likewise.
	* include/std/unordered_map: Likewise.
	* include/std/unordered_set: Likewise.
	* include/std/vector: Likewise.
	* testsuite/21_strings/basic_string/types/pmr_typedefs.cc:
	Remove <memory_resource> header and check construction.
	* testsuite/23_containers/deque/types/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/forward_list/pmr_typedefs.cc:
	Likewise.
	* testsuite/23_containers/list/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/map/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/multimap/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/multiset/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/set/pmr_typedefs.cc: Likewise.
	* testsuite/23_containers/unordered_map/pmr_typedefs.cc:
	Likewise.
	* testsuite/23_containers/unordered_multimap/pmr_typedefs.cc:
	Likewise.
	* testsuite/23_containers/unordered_multiset/pmr_typedefs.cc:
	Likewise.
	* testsuite/23_containers/unordered_set/pmr_typedefs.cc:
	Likewise.
	* testsuite/23_containers/vector/pmr_typedefs.cc: Likewise.
	* testsuite/28_regex/match_results/pmr_typedefs.cc: Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/variadic-tuple.C: Qualify function to avoid ADL
	finding std::make_tuple.
2022-05-19 23:38:23 +01:00
Jonathan Wakely e112e37f29 libstdc++: Do not include <cxxabi.h> in <stacktrace>
This avoids polluting the global namespace with the "abi" namespace
alias.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace: Do not include <cxxabi.h>.
	(__cxa_demangle): Declare.
2022-05-06 14:43:39 +01:00
Jonathan Wakely b2c007b87d libstdc++: shrink-to-fit in std::basic_stacktrace::current(skip, max)
If a large stacktrace is reduced to a max depth that is less than half
the capacity it will now be reallocated to remove the unused capacity.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::current): Reallocate
	a smaller container if the unused capacity is larger than the
	used size.
2022-04-12 22:38:31 +01:00
Jonathan Wakely 7cf8875995 libstdc++: Use allocator to construct std::stacktrace_entry objects
Because std::basic_stacktrace<A> is an allocator-aware container its
elements should be initialized using allocator_traits<A>::construct and
destroyed using allocator_traits<A>::destroy.

This adds new _M_clone and _M_assign helper functions to construct
elements correctly and uses those functions instead of calling
std::uninitialized_copy_n.

The _Impl::_M_destroy function needs to be passed an allocator to
destroy the elements correctly, so is replaced by _M_resize which can
also be used to trim the container to a smaller size.

Because destroying and creating std::stacktrace_entry objects is cheap,
the copy/move assignment operators can just destroy all existing
elements and use _Impl._M_clone or _Impl._M_assign to create new ones.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace): Use _Impl::_M_clone
	or _Impl::_M_assign to initialize elements in allocated storage.
	(basic_stacktrace::_M_clear()): Use _Impl::_M_resize instead of
	_Impl::_M_destroy.
	(basic_stacktrace::_Impl::_M_destroy()): Replace with ...
	(basic_stacktrace::_Impl::_M_resize(size_type, allocator&)): New
	function.
	(basic_stacktrace::_Impl::_M_push_back): Use _M_xclone. Construct
	new element using allocator.
	(basic_stacktrace::_Impl::_M_clone): New function.
	(basic_stacktrace::_Impl::_M_xclone): New function.
	(basic_stacktrace::_Impl::_M_assign): New function.
2022-04-12 22:38:31 +01:00
Jonathan Wakely e48933f00d libstdc++: Use nothrow new in std::stacktrace
We can avoid the overhead of handling a bad_alloc exception from
std::allocator<std::stacktrace_entry>::allocate by just calling the
nothrow operator new instead.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate):
	Use nothrow new instead of try block for std::allocator.
	(basic_stacktrace::_Impl::_M_deallocate): Use delete for
	std::allocator.
2022-04-12 22:38:31 +01:00
Jonathan Wakely 2ce0f5185b libstdc++: Reduce memory usage in std::stacktrace::current
This adds an alternative callback for use in the overload of
basic_stacktrace::current that takes a max_depth parameter. The new
callback will not allow the container to grow past the initial capacity,
which is set to the specified maximum depth.  This avoids allocating
memory for hundreds of frames only to discard them again because of a
small maximum depth limit.

For larger maximum depths the normal callback is used, with a smaller
initial capacity that can grow as needed. The container will be resized
to the given max depth after the entire backtrace has been produced
(relying on the fact that std::stacktrace_entry objects are trivially
destructible to elide their destruction).

Currently the value for "larger" limits is 128, so a max depth <= 128
will allocate capacity for exactly that many frames. A larger max depth
(or an unspecified max depth) will use an initial capacity of 64 frames
and grow as needed. Since each frame is only a uintptr_t value it might
be reasonable to increase the first value so that memory usage can be
capped for larger maximum depths.

This change also delays the creation of the libbacktrace state until we
actually need it, so that the state is not created if allocation fails.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::current): Replace
	calls to _M_reserve and _S_curr_cb with call to _M_prepare.
	Check return value of backtrace_simple when max depth given.
	(basic_stacktrace::_M_reserve): Remove.
	(basic_stacktrace::_S_curr_cb): Remove.
	(basic_stacktrace::_M_prepare(size_type)): New function to
	reserve initial capacity and return callback.
	(basic_stacktrace::_Impl::_M_allocate): Remove check for 0 < n
	and remove redundant zeroing of _M_frames and _M_capacity.
	(basic_stacktrace::_Impl::_M_push_back): Add [[unlikely]]
	attribute. Assign _Impl instead of swapping.
	* testsuite/19_diagnostics/stacktrace/current.cc: New test.
2022-04-12 22:38:31 +01:00
Jonathan Wakely b1124648ff libstdc++: Fix incorrect branch prediction hint in std::stacktrace
libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate):
	Change [[unlikely]] attribute to [[likely]].
2022-04-11 22:10:00 +01:00
Jonathan Wakely 73da9ec556 libstdc++: Fix std::basic_stacktrace special members [PR105031]
The PR points out that there is a non-constant condition used for an
if-constexpr statement, but there are several other problems with the
copy, move and swap members of std::basic_stacktrace.

libstdc++-v3/ChangeLog:

	PR libstdc++/105031
	* include/std/stacktrace (basic_stacktrace::basic_stacktrace):
	Fix allocator usage in constructors.
	(basic_stacktrace::operator=(const basic_stacktrace&)): Do not
	try to reallocate using const allocator.
	(basic_stacktrace::operator=(basic_stacktrace&&)): Fix
	if-constexpr with non-constant condition. Do not allocate new
	storage if allocator propagates. Do not set _M_size if
	allocation fails.
	(basic_stacktrace::swap(basic_stacktrace&)): Fix typo. Add
	assertion that non-propagating allocators are equal.
	* testsuite/19_diagnostics/stacktrace/stacktrace.cc: New test.
2022-04-11 17:59:50 +01:00
Jonathan Wakely bdb9639ee9 libstdc++: Improve behaviour of std::stacktrace::current
This prevents inlining the current() function to guarantee that it is
present in the stacktrace, then tells libbacktrace to skip that frame.

To avoid overflow in the int argument to __glibcxx_backtrace_simple, we
need to check if the skip parameter exceeds INT_MAX (which is possible
for 16-bit targets where short and int have the same width). We also
need to limit the size of the returned value to the max_depth parameter,
which was missing previously.

This also fixes basic_stacktrace::max_size() to not exceed the maximum
size supported by the allocator, which might be smaller than the maximum
value of size_type.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::current): Duplicate
	implementation into each overload. Add noinline attribute and
	skip current frame.
	(basic_stacktrace::max_size()): Call _Impl::_S_max_size.
	(basic_stacktrace::_S_curr_cb()): New function defining lambda.
	(basic_stacktrace::_Impl::_S_max_size): New function defining
	maximum size in terms of allocator and size_type.
	(basic_stacktrace::_Impl::_M_allocate): Check against
	max_size().
	* testsuite/19_diagnostics/stacktrace/entry.cc: Call function
	for non-constexpr checks. Check line number is correct.
2022-04-11 17:59:08 +01:00
Jonathan Wakely 3acb929cc0 libstdc++: Define <stacktrace> header for C++23
Add the <stacktrace> header and a new libstdc++_libbacktrace.a library
that provides the implementation. For now, the new library is only built
if --enable-libstdcxx-backtrace=yes is used. As with the Filesystem TS,
the new library is only provided as a static archive.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): New macro.
	* configure.ac: Use GLIBCXX_ENABLE_BACKTRACE.
	* include/Makefile.am: Add new header.
	* include/Makefile.in: Regenerate.
	* include/std/stacktrace: New header.
	* include/std/version (__cpp_lib_stacktrace): Define.
	* Makefile.in: Regenerate.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* doc/Makefile.in: Regenerate.
	* libsupc++/Makefile.in: Regenerate.
	* po/Makefile.in: Regenerate.
	* python/Makefile.in: Regenerate.
	* src/Makefile.am: Regenerate.
	* src/Makefile.in: Regenerate.
	* src/c++11/Makefile.in: Regenerate.
	* src/c++17/Makefile.in: Regenerate.
	* src/c++20/Makefile.in: Regenerate.
	* src/c++98/Makefile.in: Regenerate.
	* src/filesystem/Makefile.in: Regenerate.
	* testsuite/Makefile.in: Regenerate.
	* src/libbacktrace/Makefile.am: New file.
	* src/libbacktrace/Makefile.in: New file.
	* src/libbacktrace/backtrace-rename.h: New file.
	* src/libbacktrace/backtrace-supported.h.in: New file.
	* src/libbacktrace/config.h.in: New file.
	* testsuite/lib/libstdc++.exp (check_effective_target_stacktrace):
	New proc.
	* testsuite/20_util/stacktrace/entry.cc: New test.
	* testsuite/20_util/stacktrace/synopsis.cc: New test.
	* testsuite/20_util/stacktrace/version.cc: New test.
2022-01-17 12:13:02 +00:00