... so we don't have to manually free it in ~tdesc_feature.
gdb/ChangeLog:
* target-descriptions.c (tdesc_feature) <name>: Change type to
std::string.
<~tdesc_feature>: Don't manually free name.
<operator==>: Adjust.
(tdesc_find_feature): Adjust.
(tdesc_feature_name): Adjust.
(class print_c_tdesc) <visit_pre>: Adjust.
(class print_c_feature) <visit_pre>: Adjust.
This patch makes target_desc to be a vector of unique_ptr to
tdesc_feature objects. This way, we don't have to manually free the
features and the vector in the target_desc destructor.
gdb/ChangeLog:
* target-descriptions.c (tdesc_feature_p): Remove typedef.
(DEF_VEC_P (tdesc_feature_p)): Remove.
(struct target_desc) <features>: Change type to std::vector.
<~target_desc>: Replace with default implementation.
<accept>: Adjust.
<operator==>: Adjust.
(tdesc_has_registers): Adjust.
(tdesc_find_feature): Adjust.
(tdesc_use_registers): Adjust.
(tdesc_create_feature): Adjust.
This patch changes target_desc::compatible to be a vector of
bfd_arch_info *. This way, we don't need to manually free the vector in
the target_desc destructor.
gdb/ChangeLog:
* target-descriptions.c (arch_p): Remove typedef.
(DEF_VEC_P (arch_p)): Remove.
(struct target_desc) <compatible>: Change type to std::vector.
<~target_desc>: Don't manually free compatible.
(tdesc_compatible_p): Adjust.
(tdesc_add_compatible): Adjust.
(class print_c_tdesc) <visit_pre>: Adjust.
This patch changes target_desc::properties to be a vector of property
objects. This way, we don't need to manually free the property members
as well as the property objects themselves.
gdb/ChangeLog:
* target-descriptions.c (property_s): Remove typedef.
(DEF_VEC_O (property_s)): Remove.
(struct target_desc) <properties>: Make an std::vector.
<~target_desc>: Don't manually free properties.
(tdesc_property): Adjust.
(set_tdesc_property): Adjust.
(class print_c_tdesc) <visit_pre>: Adjust.
Since we use C++11, we can use static_assert instead doing the trick
that makes a negative-sized array if the expression is false.
static_assert is built in the language and gives clearer error messages.
To avoid modifying the usages of gdb_static_assert, redefine
gdb_static_assert in terms of static_assert, passing an empty message.
If we want to add an assert with a message, it's always possible to use
static_assert directly.
gdb/ChangeLog:
* common/gdb_assert.h (gdb_static_assert): Redefine using
static_assert.
gdb/testsuite/ChangeLog:
2017-11-30 Sergio Lopez <slp@redhat.com>
* gdb.core/coredump-filter.exp: Extend test to verify
the functionality of the dump-excluded-mappings command.
With the new "-a" command line option, the user may request gcore to
actually dump all present memory mappings. The actual effect of this
argument is OS dependent.
On GNU/Linux, it will disable use-coredump-filter and enable
dump-excluded-mappings.
gdb/ChangeLog:
2017-11-29 Sergio Lopez <slp@redhat.com>
* gcore.in: Add "-a" command line option for instructing gdb to
dump all memory mappings (OS dependent).
Commit df8411da08 implemented support for
checking /proc/PID/coredump_filter, and also changed gcore behavior to
unconditionally honor the VM_DONTDUMP flag, preventing sections marked
as such for being dumped into the core file.
This patch implements the 'set dump-excluded-mappings' command for
instructing gdb to ignore the VM_DONTDUMP flag. Combined with 'set
use-coredump-filter', this allows the user to restore the old behavior,
dumping all sections (except the ones marked as IO) unconditionally.
gdb/Changelog:
2017-11-29 Sergio Lopez <slp@redhat.com>
* linux-tdep.c (dump_excluded_mappings): New variable.
(dump_mapping_p): Use dump_excluded_mappings variable.
(_initialize_linux_tdep): New command 'set dump_excluded_mappings'.
I realized today that a recent change to the Rust support required an
update to the manual; and so I updated NEWS as well.
2017-12-04 Tom Tromey <tom@tromey.com>
* NEWS: Mention Rust trait object inspection.
2017-12-04 Tom Tromey <tom@tromey.com>
* gdb.texinfo (Rust): Update trait object status
PR gdb/22499 is about a latent bug exposed by the switch to "maint set
target-non-stop on" by default on x86-64 GNU/Linux, a while ago. With
that on, GDB is also preferring to use displaced-stepping by default.
The testcase in the bug is failing because GDB ends up incorrectly
displaced-stepping over a RIP-relative VEX-encoded instruction, like
this:
0x00000000004007f5 <+15>: c5 fb 10 05 8b 01 00 00 vmovsd 0x18b(%rip),%xmm0 # 0x400988
While RIP-relative instructions need adjustment when relocated to the
scratch pad, GDB ends up just copying VEX-encoded instructions to the
scratch pad unmodified, with the end result that the inferior ends up
executing an instruction that fetches/writes memory from the wrong
address...
This patch teaches GDB about the VEX-encoding prefixes, fixing the
problem, and adds a testcase that fails without the GDB fix.
I think we may need a similar treatment for EVEX-encoded instructions,
but I didn't address that simply because I couldn't find any
EVEX-encoded RIP-relative instruction in the gas testsuite. In any
case, this commit is forward progress as-is already.
gdb/ChangeLog:
2017-12-04 Pedro Alves <palves@redhat.com>
PR gdb/22499
* amd64-tdep.c (amd64_insn::rex_offset): Rename to...
(amd64_insn::enc_prefix_offset): ... this, and tweak comment.
(vex2_prefix_p, vex3_prefix_p): New functions.
(amd64_get_insn_details): Adjust to rename. Also skip VEX2 and
VEX3 prefixes.
(fixup_riprel): Set VEX3.!B.
gdb/testsuite/ChangeLog:
2017-12-04 Pedro Alves <palves@redhat.com>
PR gdb/22499
* gdb.arch/amd64-disp-step-avx.S: New file.
* gdb.arch/amd64-disp-step-avx.exp: New file.
Now that make-target-delegates understands namespaces and templates,
this typedef is no longer useful.
gdb/ChangeLog:
* target.h (mem_region_vector): Remove.
(struct target_ops) <to_memory_map>: Change return type to
std::vector<mem_region>.
* target-debug.h (target_debug_print_mem_region_vector): Rename
to ...
(target_debug_print_std_vector_mem_region): ... this.
* target-delegates.c: Re-generate.
The next patch will want to use gdb::array_view<int> as parameter type
of a target_ops method. However, that runs into a
make-target-delegates limitation: target_debug_foo calls in
target-delegates.c for parameters/return types with namespace scope
operators ("::") or template parameters, end up looking like:
@@ -1313,9 +1313,7 @@ debug_set_syscall_catchpoint (struct target_ops *self, int arg1, int arg2, int a
fputs_unfiltered (", ", gdb_stdlog);
target_debug_print_int (arg3);
fputs_unfiltered (", ", gdb_stdlog);
- target_debug_print_int (arg4);
- fputs_unfiltered (", ", gdb_stdlog);
- target_debug_print_int_p (arg5);
+ target_debug_print_gdb::array_view<const_int> (arg4);
which obviously isn't something that compiles. The problem is that
make-target-delegates wasn't ever taught that '::', '<', and '>' can
appear in parameter/return types. You could work around it by hidding
the unsupported characters behind a typedef in the target method
declaration, or by using an explicit TARGET_DEBUG_PRINTER, but it's
better to just remove the limitation.
While at it, also fix an "abuse" of reserved identifiers.
gdb/ChangeLog:
* make-target-delegates (munge_type): Also munge '<', '>', and
':'. Avoid double underscores in identifiers, and trailing
underscores.
* target-debug.h
(target_debug_print_VEC_static_tracepoint_marker_p__p): Rename to
...
(target_debug_print_VEC_static_tracepoint_marker_p_p): ... this.
* target-delegates.c: Regenerate.
I noticed [1] a test bug in gdb.threads/process-dies-while-detaching.exp.
Simplified, the test code in question looks somewhat like this:
~~~
# Detach from a process, and ensure that it exits after detaching.
# This relies on inferior I/O.
proc detach_and_expect_exit {test} {
gdb_test_multiple "detach" $test ....
set saw_prompt 0
set saw_inf_exit 0
while { !$saw_prompt && !$saw_inf_exit } {
gdb_test_multiple "" $test {
-re "exited, status=0" {
set saw_inf_exit 1
}
-re "$gdb_prompt " {
set saw_prompt 1
}
}
}
pass $test
}
~~~
The bug is in the while loop's condition. We want to make sure we see
both the inferior output and the prompt, so the loop's test should be:
- while { !$saw_prompt && !$saw_inf_exit } {
+ while { !$saw_prompt || !$saw_inf_exit } {
If we just fix that, the test starts failing though, because it
exposes a couple latent problems:
- When called from test_detach_killed_outside, the parent doesn't
print "exited, status=0", because in that case the child dies with a
signal, and so detach_and_expect_exit times out.
Fix it by making the parent print "signaled, sig=9" in that case,
and have the .exp expect it.
- When testing against --target_board=native-gdbserver, sometimes we'd
get this:
ERROR: Process no longer exists
ERROR: : spawn id exp9 not open
while executing
"expect {
-i exp8 -timeout 220
-i $server_spawn_id
eof {
pass $test
wait -i $server_spawn_id
unset server_spawn_id
}
timeout {
..."
("uplevel" body line 1)
invoked from within
"uplevel $body" NONE : spawn id exp9 not open
The problem is that:
- inferior_spawn_id and server_spawn_id are the same when testing
with gdbserver.
- gdbserver exits after "detach", so we get an eof for
$inferior_spawn_id in the loop in detach_and_expect_exit.
That's the first "ERROR: Process no longer exists".
- and then when we reach test_server_exit, server_spawn_id
is already closed (because server_spawn_id==inferior_spawn_id).
To handle this, make the loop in detach_and_expect_exit use an
indirect spawn id list and remove $inferior_spawn_id from the list
as soon as we got the inferior output we're expecting, so that the
"eof" is left unprocessed until we reach test_server_exit.
[1] I changed GDB in a way that should have made the test fail, but it
didn't.
gdb/testsuite/ChangeLog:
2017-12-03 Pedro Alves <palves@redhat.com>
* gdb.threads/process-dies-while-detaching.c: Include <errno.h>
and <string.h>.
(parent_function): Print distinct messages when waitpid fails, or
the child exits with a signal, or the child exits for an unhandled
reason.
* gdb.threads/process-dies-while-detaching.exp
(detach_and_expect_exit): New 'inf_output_re' parameter and use
it. Wait for both inferior output and GDB's prompt. Use an
indirect spawn id list.
(do_detach): New parameter 'child_exit'. Use it to compute
expected inferior output.
(test_detach, test_detach_watch, test_detach_killed_outside):
Adjust to pass down the expected child exit kind.
All the usages of find_inferior were removed, so the function itself can
be removed.
gdb/gdbserver/ChangeLog:
* inferiors.h (find_inferior): Remove.
* inferiors.c (find_inferior): Remove.
These functions were modified in the previous patch series, but I forgot
to update some comments.
gdb/gdbserver/ChangeLog:
* linux-low.c (resume_status_pending_p): Update comment.
(need_step_over_p): Update comment.
Replace with for_each_thread.
gdb/gdbserver/ChangeLog:
* linux-low.c (linux_resume_one_thread): Return void, take
parameter directly.
(linux_resume): Use for_each_thread.
Replace with find_thread/for_each_thread. I inlined the callbacks,
because they are relatively simple.
gdb/gdbserver/ChangeLog:
* linux-low.c (select_singlestep_lwp_callback): Remove.
(count_events_callback): Remove.
(select_event_lwp_callback): Remove.
(select_event_lwp): Use find_thread/for_each_thread.
Replace with find_thread. Writing a lambda inline in directly in the if
conditions would be a bit messy, so I chose to assign them to variables
instead.
gdb/gdbserver/ChangeLog:
* linux-low.c (not_stopped_callback): Return bool, take filter
argument directly.
(linux_wait_for_event_filtered): Use find_thread.
(linux_wait_1): Likewise.
Replace with find_thread. We could almost use find_thread_ptid, except
that find_lwp_pid uses the pid of the input ptid of the lwp is 0, so the
behavior is not quite the same.
gdb/gdbserver/ChangeLog:
* linux-low.c (same_lwp): Remove.
(find_lwp_pid): Use find_thread.
Replace with for_each_thread with pid filtering. The callback becomes
trivial enough that it's better to inline it.
gdb/gdbserver/ChangeLog:
* linux-low.c (delete_lwp_callback): Remove.
(linux_mourn): Use for_each_thread.
Replace it with find_thread. I also modified the code a bit to use a
lambda and a boolean.
gdb/gdbserver/ChangeLog:
* linux-low.c (struct counter): Remove.
(second_thread_of_pid_p): Remove.
(last_thread_of_process_p): Use find_thread.
Replace with for_each_thread with pid filtering. This allows
simplifying the callback a little bit.
gdb/gdbserver/ChangeLog:
* linux-mips-low.c (update_watch_registers_callback): Return
void, remove pid_p parameter, don't check for pid.
(mips_insert_point, mips_remove_point): Use for_each_thread.
Replace it with for_each_thread with pid filtering. We can remove
lynx_delete_thread_callback and pass remove_thread directly.
I can't build/test this change, but it should be obvious enough.
gdb/gdbserver/ChangeLog:
* lynx.low (lynx_delete_thread_callback): Remove.
(lynx_mourn): Use for_each_thread.
Replace with for_each_thread with pid filtering.
regcache_invalidate_one is not longer needed, as it was only used to
filter the pid. We can call regcache_invalidate_thread directly.
gdb/gdbserver/ChangeLog:
* regcache.c (regcache_invalidate_one): Remove.
(regcache_invalidate_pid): use for_each_thread.
This is a partial fix for the gold testsuite failures documented in
PR 21090. The use of -fpie triggers some mov-to-lea optimizations that
are not compatible with incremental linking, so those optimizations need
to be disabled. We also diagnose the attempt to use -pie with incremental
linking, and force -no-pie for the incremental tests in case the build has
been configured to have GCC pass -pie all the time.
We still have a problem where compiling with -fpie results in some GOT
entries even when linking with -no-pie. This combination still causes test
failures because we are not updating the GOT entries in an incremental update
link.
gold/
PR gold/21090
* incremental.cc (Sized_relobj_incr::do_relocate): Fix comment.
* options.cc (General_options::finalize): Disallow -pie with
incremental linking.
* x86_64.cc (Target_x86_64::Scan::local): Don't do mov-to-lea
or callq-to-direct optimizations for incremental links.
(Target_x86_64::Scan::global): Likewise.
(Target_x86_64::Relocate::relocate): Likewise.
* testsuite/Makefile.am (incremental_test): Force -no-pie.
(incremental_test_2): Likewise.
(incremental_test_3): Likewise.
(incremental_test_4): Likewise.
(incremental_test_5): Likewise.
(incremental_test_6): Likewise.
(incremental_copy_test): Likewise.
(incremental_common_test_1): Likewise.
(incremental_comdat_test_1): Likewise.
* testsuite/Makefile.in: Regenerate.
With the new compiler, we're running out of patch space for the .eh_frame
section. To workaround that issue, we compile the before and after versions
both with no unwind tables.
gold/
PR gold/22309
* testsuite/Makefile.am (two_file_test_1_v1_ndebug.o): Compile with
no EH information.
(two_file_test_1_ndebug.o): Likewise.
* testsuite/Makefile.in: Regenerate.
* testsuite/two_file_test_1.cc: Touch to force recompilation with new
flags.
* testsuite/two_file_test_1_v1.cc: Likewise.