* common/common-utils.h (REPLACE_TO_STRING) [__MINGW32__]: Define
to 1 if std::to_string is not available.
(gdb::to_string) [REPLACE_TO_STRING]: Provide a replacement
implementation for std::string.
Yao Qi [Wed, 17 May 2017 13:22:04 +0000 (14:22 +0100)]
Add alias command to cmd_list_element
When we add alias command, we call add_alias_cmd and pass the alias name
and command name. This implicitly requires the command and its prefix
commands are already added to cmdlist. This may not be true, for example,
"inferior-tty" command is added to setlist, but setlist may not be added
to cmdlist (It depends on the order of related _initialize_XXX functions
called) so that we can't find "set inferior-tty" from cmdlist.
This patch fixes this problem by passing cmd_list_element of "inferior-tty"
to add_alias_cmd, so that cmd_list_element of "inferior-tty" doesn't have
to be reachable from cmdlist at that moment.
Tom Tromey [Fri, 12 May 2017 04:22:36 +0000 (22:22 -0600)]
Avoid exponential behavior in rust_evaluate_subexp
The STRUCTOP_STRUCT case in rust_evaluate_subexp would evaluate its
LHS, and then, if it did not need Rust-specific treatment, it would
back up and re-evaluate the entire STRUCTOP_STRUCT part of the
expression using evaluate_subexp_standard. This yields exponential
behavior and causes some expressions to evaluate extremely slowly.
Tom Tromey [Fri, 12 May 2017 01:50:47 +0000 (19:50 -0600)]
Fix rust_dump_subexp_body
rust_dump_subexp_body was not correct in a couple of cases. While
debugging the bug I was really interested in, this caused a crash.
This patch fixes the problems. No test case because, IIRC there
generally aren't tests for expression dumping.
Tim Wiederhake [Thu, 4 May 2017 07:05:00 +0000 (09:05 +0200)]
Python: Introduce gdb.RecordGap class
As discussed here: https://sourceware.org/ml/gdb-patches/2017-04/msg00157.html
A gap is not an instruction and it should not pretend to be one.
gdb.Record.instruction_history is now a list of gdb.RecordInstruction and
gdb.RecordGap objects. This allows the user to deal with Gaps in the record
in a more sane way.
Tim Wiederhake [Thu, 4 May 2017 07:05:00 +0000 (09:05 +0200)]
Python: Use correct ptid in btrace recording
The user would always get the instruction_history and function_call_history
objects of the current thread, not the thread for which the gdb.Record object
was created.
The attached testcase fails without this patch and passes with the patch.
Keith Seitz [Wed, 3 May 2017 19:40:01 +0000 (12:40 -0700)]
Make sure malloc is linked into gdb.cp/oranking.cc.
On some platforms, e.g., arm-eabi-none, we need to make certain that
malloc is linked into the program because the test suite uses function
calls requiring malloc:
(gdb) p foo101("abc")
evaluation of this expression requires the program to have a function "malloc".
gdb/testsuite/ChangeLog
* gdb.cp/oranking.cc (dummy): New function to grab malloc.
(main): Call it.
Keith Seitz [Thu, 27 Apr 2017 23:04:33 +0000 (16:04 -0700)]
Fix overload resolution involving rvalue references and cv qualifiers.
The following patch fixes several outstanding overload resolution problems
with rvalue references and cv qualifiers in the test suite. The tests for
these problems typically passed with one compiler version and failed with
another. This behavior occurs because of the ordering of the overloaded
functions in the debug info. So the first best match "won out" over the
a subsequent better match.
One of the bugs addressed by this patch is the failure of rank_one_type to
account for type equality of two overloads based on CV qualifiers. This was
leading directly to problems evaluating rvalue reference overload quality,
but it is also highlighted in gdb.cp/oranking.exp, where two test KFAIL as
a result of this shortcoming.
I found the overload resolution code committed with the rvalue reference
patch (f9aeb8d49) needlessly over-complicated, and I have greatly simplified
it. This fixes some KFAILing tests in gdb.exp/rvalue-ref-overload.exp.
* gdb.cp/oranking.cc (test15): New function.
(main): Call test15 and declare additional variables for testing.
* gdb.cp/oranking.exp: Remove kfail status for "p foo4(&a)" and
"p foo101('abc')" tests.
* gdb.cp/rvalue-ref-overloads.exp: Remove kfail status for
"lvalue reference overload" test.
* gdb.cp/rvalue-ref-params.exp: Remove kfail status for
"print value of f1 on Child&& in f2" test.
Simon Marchi [Thu, 27 Apr 2017 21:03:20 +0000 (17:03 -0400)]
Add missing incref when creating Inferior Python object
The test py-inferior.exp fails when using a debug build of Python 3.6. I don't
see it failing with my system's default Python, but it might be related to the
different memory allocation scheme used when doing a build with pydebug.
The issue is that we are missing a Py_INCREF in
inferior_to_inferior_object. The PyObject_New function initializes the
object with a refcount of 1. If we assume that this refcount
corresponds to the reference we are returning, then we are missing an
incref for the reference in the inferior data.
The counterpart for the incref that corresponds to the reference in the
inferior data is in py_free_inferior, in the form the gdbpy_ref instance.
Here's how I can get it to crash (with some debug output):
Current thread 0x00007f9cf1b68780 (most recent call first):
File "<string>", line 1 in <module>
[1] 408 abort (core dumped) ./gdb -nx -ex "set debug python 1"
After having created the inferiors object, their refcount is 1 (which
comes from PyObject_New), but it should be two. The gdb inferior object
has a reference and the "infs" list has a reference.
When invoking remove-inferiors, py_free_inferior gets called. It does
the decref that corresponds to the reference that the gdb inferior
object kept. At this moment, the refcount drops to 0 and the object
gets deallocated, even though the "infs" list still has a reference.
When we set "infs" to None, Python tries to decref the already zero
refcount and the assert triggers.
Jan Kratochvil [Fri, 21 Apr 2017 14:14:37 +0000 (16:14 +0200)]
release branch: Fix: --enable-werror
gdb-8.0-branch
./configure --enable-werror --enable-targets=all
aarch64-tdep.c:3045:13: error: ‘void selftests::aarch64_process_record_test()’ declared ‘static’ but never defined [-Werror=unused-function]
arm-tdep.c:9601:13: error: ‘void selftests::arm_record_test()’ declared ‘static’ but never defined [-Werror=unused-function]
gdb/ChangeLog
2017-04-21 Jan Kratochvil <jan.kratochvil@redhat.com>
* aarch64-tdep.c (selftests::aarch64_process_record_test): Make it #if
GDB_SELF_TEST.
* arm-tdep.c (selftests::arm_record_test): Likewise.
On gdb/windows-nat.c:windows_create_inferior, ALLARGS needs to be
declared independently of the host that we're building for. This
fixes a build breakage on Cygwin.
Pedro Alves [Thu, 13 Apr 2017 15:15:35 +0000 (16:15 +0100)]
Make inferior a class with cdtors, and use new/delete
struct inferior became a non-POD when enum_flags was made a non-POD,
so we should be allocating/destroying inferiors with new/delete, etc.
That's what this commit does.
Note: this commit makes all boolean fields of inferior be "bool",
except the "detaching" field. That'll require more work, so I split
it to a separate patch.
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
* inferior.c (free_inferior): Convert to ...
(inferior::~inferior): ... this dtor.
(inferior::inferior): New ctor, factored out from ...
(add_inferior_silent): ... here. Allocate the inferior with a new
expression.
(delete_inferior): Call delete instead of free_inferior.
* inferior.h (gdb_environ, continuation): Forward declare.
(inferior): Now a class. Add in-class initialization to all
members. Make boolean fields bool, except 'detaching'.
(inferior::inferior): New explicit ctor.
(inferior::~inferior): New.
Pedro Alves [Thu, 13 Apr 2017 15:15:34 +0000 (16:15 +0100)]
GC inferior.c:init_inferior_list
Not used anywhere. This was actually never used. It came in because
I originally created inferior.c by copying thread.c, and doing
s/thread/inferior/g, and missed that nothing needs this. :-)
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
Pedro Alves [Thu, 13 Apr 2017 15:15:34 +0000 (16:15 +0100)]
C++fy thread_apply_all_command
This eliminates a couple cleanups.
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
* thread.c: Include <algorithm>.
(thread_array_cleanup): Delete.
(scoped_inc_dec_ref): New class.
(live_threads_count): New function.
(set_thread_refcount): Delete.
(tp_array_compar_ascending): Now a bool.
(tp_array_compar): Convert to a std::sort comparison function.
(thread_apply_all_command): Use std::vector and scoped_inc_dec_ref
and live_threads_count.
Pedro Alves [Thu, 13 Apr 2017 15:15:34 +0000 (16:15 +0100)]
Fix follow-fork latent bug
A later patch in the series adds an assertion to switch_to_thread that
the resulting inferior_ptid always matches the "current_inferior()"
inferior. This exposed a latent bug in the follow-fork code, where
we're building the fork child inferior. We're switching
inferior_ptid, but not the current inferior object...
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
* infrun.c (follow_fork_inferior): Also switch the current
inferior.
Pedro Alves [Thu, 13 Apr 2017 15:15:34 +0000 (16:15 +0100)]
watch_command_1: Fix dangling frame access
While working on some changes to switch_to_thread, I inadvertently
make switch_to_thread call reinit_frame_cache more frequently, even
when the thread didn't change. This exposed a latent bug in
watch_command_1, where we're referencing a frame after
creating/inserting breakpoints, which potentially calls
reinit_frame_cache if it needs to install breakpoints with a different
thread selected.
Handle this similarly to how it's already handled in other similar
cases. I.e., save any frame-related information we might need before
creating a breakpoint.
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
* breakpoint.c (watch_command_1): Save watchpoint-frame info
before calling create_internal_breakpoint.
Nick Clifton [Thu, 13 Apr 2017 13:50:56 +0000 (14:50 +0100)]
Add note merging to strip and add code to merge stack size notes.
* objcopy.c: Add --no-merge-notes option to disable note merging.
Add --[no-]merge-notes option to strip, and enable it by default.
(num_bytes): New function.
(merge_gnu_build_notes): Add code to merge stack size notes.
* binutils.texi: Update strip and objcopy documentation.
* readelf.c (print_gnu_build_attribute_name): Use defined
constants for note types.
The previous change to fork-child.c converted the argv building from
an alloca-allocated array of non-owning arg pointers, to a std::vector
of owning pointers, which results in N string dups, with N being the
number of arguments in the vector, and then requires manually
releasing the pointers owned by the vector.
This patch makes the vector hold non-owning pointers, and avoids the
string dups, by doing one single string copy of the arguments upfront,
and replacing separators with NULL terminators in place, like we used
to. All the logic to do that is encapsulated in a new class.
With this, there's no need to remember to manually release the argv
elements with free_vector_argv either.
gdb/ChangeLog:
2017-04-13 Pedro Alves <palves@redhat.com>
* fork-child.c (execv_argv): New class.
(breakup_args): Refactored as ...
(execv_argv::init_for_no_shell): .. this method of execv_argv.
Copy arguments to storage and replace separators with NULL
terminators in place.
(escape_bang_in_quoted_argument): Adjust to return bool.
(execv_argv::execv_argv): New ctor.
(execv_argv::init_for_shell): New method, factored out from
fork_inferior. Don't strdup strings into the vector.
(fork_inferior): Eliminate "shell" local and use execv_argv. Use
Remove free_vector_argv call.