binutils-gdb/gdbsupport
Simon Marchi 4bce7cdaf4 gdbsupport: add array_view copy function
An assertion was recently added to array_view::operator[] to ensure we
don't do out of bounds accesses.  However, when the array_view is copied
to or from using memcpy, it bypasses that safety.

To address this, add a `copy` free function that copies data from an
array view to another, ensuring that the destination and source array
views have the same size.  When copying to or from parts of an
array_view, we are expected to use gdb::array_view::slice, which does
its own bounds check.  With all that, any copy operation that goes out
of bounds should be caught by an assertion at runtime.

copy is implemented using std::copy and std::copy_backward, which, at
least on libstdc++, appears to pick memmove when copying trivial data.
So in the end there shouldn't be much difference vs using a bare memcpy,
as we do right now.  When copying non-trivial data, std::copy and
std::copy_backward assigns each element in a loop.

To properly support overlapping ranges, we must use std::copy or
std::copy_backward, depending on whether the destination is before the
source or vice-versa.  std::copy and std::copy_backward don't support
copying exactly overlapping ranges (where the source range is equal to
the destination range).  But in this case, no copy is needed anyway, so
we do nothing.

The order of parameters of the new copy function is based on std::copy
and std::copy_backward, where the source comes before the destination.

Change a few randomly selected spots to use the new function, to show
how it can be used.

Add a test for the new function, testing both with arrays of a trivial
type (int) and of a non-trivial type (foo).  Test non-overlapping
ranges as well as three kinds of overlapping ranges: source before dest,
dest before source, and dest == source.

Change-Id: Ibeaca04e0028410fd44ce82f72e60058d6230a03
2021-12-03 16:37:36 -05:00
..
.dir-locals.el
.gitattributes
acinclude.m4
aclocal.m4
agent.cc Remove defaulted 'tid' parameter to ptid_t constructor 2021-09-23 09:30:54 -06:00
agent.h
alt-stack.h
array-view.h gdbsupport: add array_view copy function 2021-12-03 16:37:36 -05:00
ax.def
block-signals.h
break-common.h
btrace-common.cc
btrace-common.h
buffer.cc
buffer.h
byte-vector.h
ChangeLog-2020-2021 gdb: move remaining ChangeLogs to legacy files 2021-07-26 12:20:33 +01:00
check-defines.el
cleanups.cc
cleanups.h
common-debug.cc
common-debug.h
common-defs.h [gdb/build] Disable attribute nonnull 2021-07-30 14:07:40 +02:00
common-exceptions.cc
common-exceptions.h Replace exception_print_same with operator!= 2021-07-30 08:42:39 -06:00
common-gdbthread.h
common-inferior.cc
common-inferior.h gdb: make inferior::m_cwd an std::string 2021-07-23 15:38:54 -04:00
common-regcache.cc
common-regcache.h
common-types.h
common-utils.cc gdb: introduce target_waitkind_str, use it in target_waitstatus::to_string 2021-11-22 13:57:49 -05:00
common-utils.h gdb: introduce target_waitkind_str, use it in target_waitstatus::to_string 2021-11-22 13:57:49 -05:00
common.m4 Fix build on rhES5 2021-11-09 08:21:18 -07:00
config.in Fix build on rhES5 2021-11-09 08:21:18 -07:00
configure Fix build on rhES5 2021-11-09 08:21:18 -07:00
configure.ac gdbsupport: remove attempt to define TARGET_WORD_SIZE 2021-10-04 10:52:35 +01:00
create-version.sh
def-vector.h
default-init-alloc.h
eintr.h
enum-flags.h
environ.cc
environ.h
errors.cc
errors.h
event-loop.cc
event-loop.h
fileio.cc
fileio.h
filestuff.cc gdbsupport: make gdb_assert_not_reached accept a format string 2021-11-18 11:29:19 -05:00
filestuff.h gdbsupport: make gdb_mkostemp_cloexec return a scoped_fd 2021-09-30 15:21:48 -04:00
filtered-iterator.h
format.cc
format.h
forward-scope-exit.h
function-view.h
gdb_assert.h gdbsupport: make gdb_assert_not_reached accept a format string 2021-11-18 11:29:19 -05:00
gdb_binary_search.h
gdb_file.h gdbsupport: move gdb_file_up to its own file 2021-09-30 15:21:48 -04:00
gdb_locale.h
gdb_optional.h gdbsupport: add debug assertions in gdb::optional::get 2021-08-03 08:50:56 -04:00
gdb_proc_service.h gdbsupport/gdb_proc_service.h: use decltype instead of typeof 2021-09-20 07:59:53 -04:00
gdb_ref_ptr.h
gdb_select.h
gdb_setjmp.h
gdb_signals.h
gdb_splay_tree.h
gdb_string_view.h
gdb_string_view.tcc
gdb_sys_time.h
gdb_tilde_expand.cc
gdb_tilde_expand.h
gdb_unique_ptr.h gdbsupport: move xfree into its own file 2021-11-16 17:45:44 +00:00
gdb_unlinker.h
gdb_vecs.cc
gdb_vecs.h
gdb_wait.cc
gdb_wait.h
gdb-dlfcn.cc
gdb-dlfcn.h
gdb-safe-ctype.h
gdb-sigmask.h
gdb-xfree.h gdbsupport: move xfree into its own file 2021-11-16 17:45:44 +00:00
hash_enum.h
host-defs.h
intrusive_list.h gdb: use intrusive list for step-over chain 2021-07-12 20:46:52 -04:00
iterator-range.h gdb: introduce iterator_range, remove next_adapter 2021-07-06 15:02:05 -04:00
job-control.cc
job-control.h
Makefile.am
Makefile.in
netstuff.cc
netstuff.h
new-op.cc [gdb/build] Fix Wimplicit-exception-spec-mismatch in clang build 2021-11-11 11:22:39 +01:00
next-iterator.h gdb: introduce iterator_range, remove next_adapter 2021-07-06 15:02:05 -04:00
observable.h
offset-type.h
parallel-for.h
pathstuff.cc
pathstuff.h
poison.h
preprocessor.h
print-utils.cc
print-utils.h
ptid.cc Change ptid_t::tid to ULONGEST 2021-09-23 09:30:54 -06:00
ptid.h Change ptid_t::tid to ULONGEST 2021-09-23 09:30:54 -06:00
ptrace.m4
README
refcounted-object.h
reference-to-pointer-iterator.h gdb: use intrusive list for step-over chain 2021-07-12 20:46:52 -04:00
rsp-low.cc
rsp-low.h
run-time-clock.cc
run-time-clock.h
safe-iterator.h gdb: make all_inferiors_safe actually work 2021-07-17 08:54:40 -04:00
safe-strerror.cc
scope-exit.h
scoped_fd.h gdbsupport: move gdb_file_up to its own file 2021-09-30 15:21:48 -04:00
scoped_ignore_signal.h gdb: fall back on sigpending + sigwait if sigtimedwait is not available 2021-07-05 09:54:58 -04:00
scoped_ignore_sigttou.h Don't call sigtimedwait for scoped_ignore_sigttou 2021-06-17 19:39:08 +01:00
scoped_mmap.cc gdbsupport: make gdb_open_cloexec return scoped_fd 2021-09-30 15:21:48 -04:00
scoped_mmap.h
scoped_restore.h
search.cc
search.h
selftest.cc Always use std::function for self-tests 2021-10-19 12:58:50 -06:00
selftest.h gdb: add selftest name completion 2021-10-28 11:17:45 -04:00
selftest.m4
signals-state-save-restore.cc
signals-state-save-restore.h
signals.cc
symbol.h
tdesc.cc
tdesc.h
thread-pool.cc
thread-pool.h
traits.h
underlying.h
valid-expr.h
version.h
warning.m4
x86-xstate.h
xml-utils.cc
xml-utils.h

This is a helper library that is used by gdb and gdbserver.

To send patches, follow the gdb patch submission instructions in
../gdb/CONTRIBUTE.  For maintainers, see ../gdb/MAINTAINERS.