Before commit 70ee000084 ("[gdb] Allow function arguments in bp
print match in selftest_setup"), this pattern in selftest_setup:
-re "Starting program.*Breakpoint \[0-9\]+,.* at .*main.c:.*$function.*$gdb_prompt $" {
# $function may be inlined, so the program stops at the line
# calling $function.
pass "$description"
}
happened to match if captured_main_1 was inlined and captured_main was
not, because captured_main calls captured_main_1 first thing, which
coincidentally matches "$function.*":
Breakpoint 1, captured_main (data=<optimized out>) at src/gdb/main.c:1147
1147 captured_main_1 (context);
That would probably be better "$function .*", with a space, but I
think that even better is to remove the "may be inlined" case too now,
because since ddfe970e6b ("Don't elide all inlined frames") GDB
presents the stop at the inline function instead of at the caller.
gdb/testsuite/ChangeLog:
2018-06-14 Pedro Alves <palves@redhat.com>
* lib/selftest-support.exp (selftest_setup): Remove inlined
function handling.
Cross-compiling for sparc64 bumped into a few issues, fixed by this
patch.
1. Include target.h in sparc-nat.h fixes:
/home/emaisin/src/binutils-gdb/gdb/sparc-nat.h:45:8: error: ‘target_xfer_status’ does not name a type
extern target_xfer_status sparc_xfer_wcookie (enum target_object object,
2. Remove extra semi-colon at sparc64-linux-nat.c:40 fixes:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c:41:3: error: expected unqualified-id before ‘{’ token
{ sparc_store_inferior_registers (this, regcache, regnum); }
3. Remove "this" argument fixes:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c: In member function ‘virtual void sparc64_linux_nat_target::fetch_registers(regcache*, int)’:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c:38:59: error: cannot convert ‘sparc64_linux_nat_target*’ to ‘regcache*’ for argument ‘1’ to ‘void sparc_fetch_inferior_registers(regcache*, int)’
{ sparc_fetch_inferior_registers (this, regcache, regnum); }
^
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c: In member function ‘virtual void sparc64_linux_nat_target::store_registers(regcache*, int)’:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c:41:59: error: cannot convert ‘sparc64_linux_nat_target*’ to ‘regcache*’ for argument ‘1’ to ‘void sparc_store_inferior_registers(regcache*, int)’
{ sparc_store_inferior_registers (this, regcache, regnum); }
^
4. Use sparc64_forget_process instead of sparc_forget_process fixes:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c: In member function ‘virtual void sparc64_linux_nat_target::low_forget_process(pid_t)’:
/home/emaisin/src/binutils-gdb/gdb/sparc64-linux-nat.c:47:30: error: ‘sparc_forget_process’ was not declared in this scope
{ sparc_forget_process (pid); }
^
gdb/ChangeLog:
* sparc-nat.h: Include target.h.
* sparc64-linux-nat.c (class sparc64_linux_nat_target)
<fetch_registers>: Remove this argument in function call.
<store_registers>: Remove this argument in function call, remove
extra semicolon.
<low_forget_process>: Call sparc64_forget_process instead of
sparc_forget_process.
When I run make check:
...
$ cd build/gdb
$ make check 2>&1 | tee ../CHECKLOG.gdb
...
I see after ~30m the summary of the test run printed, but make still hangs.
This seems to be due to some sleeping processes:
...
$ ps fx | grep fork-run
6475 ? S 0:00 gdb.base/fork-running-state/fork-running-state
6451 ? S 0:00 gdb.base/fork-running-state/fork-running-state
6427 ? S 0:00 gdb.base/fork-running-state/fork-running-state
...
Killing the sleeping processes like this:
...
kill -9 $(ps -A | grep fork-running-st | awk '{print $1}')
...
allows make to finish.
If I isolate one debug session from fork-running-state.exp that causes one of
these sleeping processes, we get:
...
(gdb) set non-stop on
(gdb) break main
Breakpoint 1 at 0x400665: file src/gdb/testsuite/gdb.base/fork-running-state.c,
line 52.
(gdb) run
Starting program: build/gdb/testsuite/outputs/gdb.base/fork-running-state/
fork-running-state
Breakpoint 1, main () at src/gdb/testsuite/gdb.base/fork-running-state.c:52
52 save_parent = getpid ();
(gdb) set detach-on-fork on
(gdb) set follow-fork parent
(gdb) continue &
Continuing.
[Detaching after fork from child process 18797]
(gdb) info threads
Id Target Id Frame
* 1 process 18793 "fork-running-st" (running)
(gdb) set print inferior-events off
(gdb) kill inferior 1
...
So, AFAIU, the hanging process is the child process that gdb detaches from.
There's an alarm set in main before the fork, but alarms are not preserved in
the fork child:
...
$ man alarm
...
NOTES
Alarms created by alarm() are preserved across execve(2) and are not
inherited by children created via fork(2).
...
So, AFAIU, once the parent is killed, there's no alarm to terminate the child.
The patch fixes this by moving the setting of the alarm into the
fork_main/fork_child functions, making sure that an alarm will trigger for
the child.
Tested with make check on x86_64.
2018-06-13 Tom de Vries <tdevries@suse.de>
PR testsuite/23269
* gdb.base/fork-running-state.c (main): Move setting of alarm ...
(fork_child): ... here, and ...
(fork_parent): ... here.
Atm selftest.exp fails for me.
One of the reasons is that in c61b06a19a (Remove
some text from --version output) an eol was added after "There is NO
WARRANTY, to the extent permitted by law".
This patch updates the matching of the gdb startup message in selftest.exp
accordingly.
Tested selftest.exp (with two other selftest.exp related fixes applied).
2018-06-12 Tom de Vries <tdevries@suse.de>
* gdb.gdb/selftest.exp (test_with_self): Update gdb startup text.
procfs.c currently doesn't compile on Solaris:
/vol/src/gnu/gdb/gdb/local/gdb/procfs.c: In function `void _initialize_procfs()':
/vol/src/gnu/gdb/gdb/local/gdb/procfs.c:3734:15: error: invalid initialization of reference of type `const target_info&' from expression of type `procfs_target*'
add_target (&the_procfs_target);
^~~~~~~~~~~~~~~~~~
In file included from /vol/src/gnu/gdb/gdb/local/gdb/inferior.h:40,
from /vol/src/gnu/gdb/gdb/local/gdb/procfs.c:24:
/vol/src/gnu/gdb/gdb/local/gdb/target.h:2305:13: note: in passing argument 1 of `void add_target(const target_info&, void (*)(const char*, int), void (*)(cmd_list_element*, completion_tracker&, const char*, const char*))'
extern void add_target (const target_info &info,
^~~~~~~~~~
/vol/src/gnu/gdb/gdb/local/gdb/procfs.c: In member function `virtual char* procfs_target::make_corefile_notes(bfd*, int*)':
/vol/src/gnu/gdb/gdb/local/gdb/procfs.c:3898:16: error: too many arguments to function `gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > > target_read_alloc(target_ops*, target_object, const char*)'
NULL, &auxv);
^
In file included from /vol/src/gnu/gdb/gdb/local/gdb/inferior.h:40,
from /vol/src/gnu/gdb/gdb/local/gdb/procfs.c:24:
/vol/src/gnu/gdb/gdb/local/gdb/target.h:341:40: note: declared here
extern gdb::optional<gdb::byte_vector> target_read_alloc
^~~~~~~~~~~~~~~~~
/vol/src/gnu/gdb/gdb/local/gdb/procfs.c:3898:16: error: cannot convert `gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > >' to `int' in assignment
NULL, &auxv);
^
Fixed as follows. Built and ran make check on 64-bit Solaris 11.5/x86
(amd64-pc-solaris2.11) only.
* procfs.c (_initialize_procfs): Use add_inf_child_target.
(procfs_target::make_corefile_notes): Adjust to new
target_read_alloc return type.
When making an inferior call, and non-stop mode is off, then, once the
inferior call is complete all threads will be stopped, and we should
run the INF_EXEC_COMPLETE handler. This will result in a call to
'target_async(0)' to remove the event handlers for the target.
This was discussed by Yao Qi in this mailing list thread:
https://sourceware.org/ml/gdb/2017-10/msg00032.html
Without this then the target event handlers are left in place even
when the target is stopped, which is different to what happens during
a standard stop proceedure (for example when one thread hits a
breakpoint).
gdb/ChangeLog:
PR gdb/22882
* infrun.c (fetch_inferior_event): If GDB is not proceeding then
run INF_EXEC_COMPLETE handler, even when not calling normal_stop.
Move should_notify_stop local into more inner scope.
In PR22882 inferior functions are called on different threads while
scheduler-locking is turned on. This results in a hang. This was
discussed in this mailing list thread:
https://sourceware.org/ml/gdb/2017-10/msg00032.html
The problem is that when the thread is set running in order to execute
the inferior call, a call to target_async is made. If the target is
not already registered as 'target_async' then this will install the
async event handler, AND unconditionally mark the handler as having an
event pending.
However, if the target is already registered as target_async then the
event handler is not installed (its already installed) and the
handler is NOT marked as having an event pending.
If we try to set running a thread that already has a pending event,
then we do want to set target_async, however, there will not be an
external event incoming (the thread is already stopped) so we rely on
manually marking the event handler as having a pending event in order
to see the threads pending stop event. This is fine, if, at the point
where we call target_async, the target is not already marked as async.
But, if it is, then the event handler will not be marked as ready, and
the threads pending stop event will never be processed.
A similar pattern of code can be seen in linux_nat_target::resume,
where, when a thread has a pending event, the call to target_async is
followed by a call to async_file_mark to ensure that the pending
thread event will be processed, even if target_async was already set.
gdb/ChangeLog:
PR gdb/22882
* infrun.c (resume_1): Add call to mark_async_event_handler.
gdb/testsuite/ChangeLog:
* gdb.threads/multiple-successive-infcall.exp: Remove kfail case,
rewrite test to describe action performed, rather than possible
failure.
Run the test gdb.threads/multiple-successive-infcall.exp by hand, if
you turn on 'debug infrun 1', you'll see that the debug line fixed in
this commit is printed and contains the wrong $pc value. Fixed in
this commit.
gdb/ChangeLog:
* infrun.c (do_target_wait): Change old version of $pc printed.
Since we now have two index formats, DWARF5/debug_names and gdb_index, I
wanted to rename some functions to make it clear that they deal with the
gdb_index format specifically.
gdb/ChangeLog:
* dwarf2read.c (read_index_from_section): Rename to...
(read_gdb_index_from_section): ... this, update all callers.
(dwarf2_read_index): Rename to...
(dwarf2_read_gdb_index): ... this, update all callers.
Fixes:
CXX hppa-linux-nat.o
../../src/gdb/hppa-linux-nat.c:277:17: error: no 'void hppa_linux_nat_target::fetch_inferior_registers(regcache*, int)' member function declared in class 'hppa_linux_nat_target'
int regno)
^
../../src/gdb/hppa-linux-nat.c:224:1: error: 'void fetch_register(regcache*, int)' defined but not used [-Werror=unused-function]
fetch_register (struct regcache *regcache, int regno)
^~~~~~~~~~~~~~
gdb/ChangeLog:
* gdb/hppa-linux-nat.c
(hppa_linux_nat_target::fetch_inferior_registers): Rename to
hppa_linux_nat_target::fetch_registers.
This is as per the spec:
https://developer.arm.com/products/architecture/a-profile/docs/100985/0000
gdb/
* aarch64-tdep.c (aarch64_dwarf_reg_to_regnum): Add mappings.
* aarch64-tdep.h (AARCH64_DWARF_SVE_VG): Add define.
(AARCH64_DWARF_SVE_FFR): Likewise.
(AARCH64_DWARF_SVE_P0): Likewise.
(AARCH64_DWARF_SVE_Z0): Likewise.
A purely virtual class containing functions from gdb/regcache.h
Both the gdb regcache structures and gdbserver regcache inherit
directly from reg_buffer_common. This will allow for common
functions which require the use of a regcache.
gdb/
* common/common-regcache.h (reg_buffer_common): New structure.
* regcache.c (reg_buffer::invalidate): Move from detached_regcache.
(reg_buffer::raw_supply): Likewise.
(reg_buffer::raw_supply_integer): Likewise.
(reg_buffer::raw_supply_zeroed): Likewise.
(reg_buffer::raw_collect): Likewise.
(reg_buffer::raw_collect_integer): Likewise.
* regcache.h (reg_buffer::invalidate): Move from detached_regcache.
(reg_buffer::raw_supply): Likewise.
(reg_buffer::raw_supply_integer): Likewise.
(reg_buffer::raw_supply_zeroed): Likewise.
(reg_buffer::raw_collect): Likewise.
(reg_buffer::raw_collect_integer): Likewise.
gdbserver/
* regcache.c (new_register_cache): Use new.
(free_register_cache): Use delete.
(register_data): Use const.
(supply_register): Move body inside regcache.
(regcache::raw_supply): New override function.
(collect_register): Move body inside regcache.
(regcache::raw_collect): New override function.
(regcache::get_register_status): New override function.
* regcache.h (struct regcache): Inherit from reg_buffer_common.
This removes a use of the queue data structure (common/queue.h) from
remote.c.
The queue is replaced with a std::vector. A queue was not needed, as
the code never de-queued items.
This removes quite a bit of boilerplate code, mostly involved with
marshalling arguments to be passed through the queue iterator.
Tested by the buildbot.
gdb/ChangeLog
2018-06-10 Tom Tromey <tom@tromey.com>
* remote.c (stop_reply_p): Remove typedef. Don't declare queue.
(class remote_state) <stop_reply_queue>: Now std::vector.
(remote_state::~remote_state)
(remote_target::stop_reply_queue_length): Update.
(struct queue_iter_param, remove_child_of_pending_fork)
(struct check_pending_event_prevents_wildcard_vcont_callback_data)
(check_pending_event_prevents_wildcard_vcont_callback)
(remove_stop_reply_for_inferior)
(remove_stop_reply_of_remote_state)
(remote_notif_remove_once_on_match)
(stop_reply_match_ptid_and_ws)
(remote_kill_child_of_pending_fork): Remove.
(remote_target::remove_new_fork_children)
(remote_target::check_pending_events_prevent_wildcard_vcont)
(remote_target::discard_pending_stop_replies)
(remote_target::discard_pending_stop_replies_in_queue)
(remote_target::remote_notif_remove_queued_reply)
(remote_target::queued_stop_reply)
(remote_target::push_stop_reply, remote_target::peek_stop_reply)
(remote_target::wait, remote_target::kill_new_fork_children)
(remote_target::async): Update.
This removes cleanups from record-full.c. In this case, the cleanups
were only ever run when an exception was thrown. So, I replaced these
with try/catch, rather than introduce a new specialized RAII type.
Tested by the buildbot.
gdb/ChangeLog
2018-06-10 Tom Tromey <tom@tromey.com>
* record-full.c (record_full_arch_list_cleanups): Remove.
(record_full_message): Use try/catch.
(record_full_wait_cleanups): Remove.
(record_full_wait_1): Use try/catch.
(record_full_restore): Likewise.
This replaces a VEC in record-full.c with a std::vector. This version
of the patch also catches a memory leak in the original code noticed
by Simon.
Tested by the buildbot.
gdb/ChangeLog
2018-06-10 Tom Tromey <tom@tromey.com>
* record-full.c (record_full_breakpoint_p): Remove typedef. Don't
declare VEC. Add constructor.
<in_target_beneath>: Now bool.
(record_full_breakpoints): Now a std::vector, static.
(record_full_sync_record_breakpoints)
(record_full_init_record_breakpoints)
(record_full_target::insert_breakpoint)
(record_full_target::remove_breakpoint): Update. Don't use XNEW.
GCC 6.3.0 produces this kind of errors:
CXX dwarf2read.o
/home/simark/src/binutils-gdb/gdb/dwarf2read.c: In function 'void process_cu_includes(dwarf2_per_objfile*)':
/home/simark/src/binutils-gdb/gdb/dwarf2read.c:10220:8: error: types may not be defined in a for-range-declaration [-Werror]
for (struct dwarf2_per_cu_data *iter : dwarf2_per_objfile->just_read_cus)
^~~~~~
Removing the struct keyword makes it happy.
gdb/ChangeLog:
* dwarf2read.c (process_cu_includes): Remove struct keyword.
* serial.c (serial_interface_lookup): Remove struct keyword.
The buildbot pointed out that arm-linux-nat.c was not properly using
"beneath" as a method. A search showed a few more places with this
issue.
Tested by the buildbot, though of course this only checked
arm-linux-nat.c. Nevertheless I'm checking this in under the obvious
rule.
gdb/ChangeLog
2018-06-10 Tom Tromey <tom@tromey.com>
* procfs.c (procfs_target::xfer_partial): Use "beneath" as a
method.
* nto-procfs.c (nto_procfs_target::xfer_partial): Use "beneath" as
a method.
* go32-nat.c (go32_nat_target::xfer_partial): Use "beneath" as a
method.
* arm-linux-nat.c (arm_linux_nat_target::read_description): Use
"beneath" as a method.
* arm-fbsd-nat.c (arm_fbsd_nat_target::read_description):
Use "beneath" as a method.
This removes cleanups from tracefile.c, by introducing a unique_ptr
specialization.
This code could be made even simpler via a deeper C++-ification, but I
have not attempted that.
Tested by the buildbot.
gdb/ChangeLog
2018-06-10 Tom Tromey <tom@tromey.com>
* tracefile.c (struct trace_file_writer_deleter): New.
<operator()>: Rename from trace_file_writer_xfree.
(trace_file_writer_up): New typedef.
(tsave_command, trace_save_tfile, trace_save_ctf): Update.
Using std::unique_ptr allows to remove the manual xfree in the
destructor.
If I understand correctly, using the () after the new operator will make
sure the allocated objects will be value initialized, which for scalars
means they are zero-initialized. So it should have the same behavior as
XCNEWVEC.
gdb/ChangeLog:
* regcache.h (reg_buffer) <~reg_buffer>: Use default destructor.
<m_registers, m_register_status>: Change type to
std::unique_ptr.
* regcache.c (reg_buffer::reg_buffer): Use new instead of
XCNEWVEC.
The type of reg_buffer::m_register_status is an array of signed char,
probably to ensure that each element takes up only one byte. Instead,
since we use C++11, we can force the underlying type of register_status
to be signed char and use the enum type.
gdb/ChangeLog:
* common/common-regcache.h (enum register_status): Add
underlying type "signed char".
* regcache.h (reg_buffer) <m_register_status>: Change type to
register_status *.
* regcache.c (reg_buffer::reg_buffer): Alocate arrays of
register_status instead of signed char.
(reg_buffer::save): Use REG_UNKNOWN instead of 0.
(reg_buffer::get_register_status): Remove cast.
(readable_regcache::raw_read): Remove cast.
(readable_regcache::cooked_read): Remove cast.
This removes a use of queue.h from gdbserver/event-loop.c, replacing
it with std::queue.
I was not completely sure whether std::queue is even that useful.
Perhaps plain std::list could be used just as easily.
Tested by the buildbot.
gdb/gdbserver/ChangeLog
2018-06-09 Tom Tromey <tom@tromey.com>
* event-loop.c (gdb_event, gdb_event_p): Remove typedefs. Don't
declare queue.
(event_queue): Use std::queue.
(gdb_event_xfree): Remove.
(initialize_event_loop, process_event, wait_for_event): Update.
This removes two more uses of make_cleanup_close, replacing them with
relatively straightforward uses of scoped_fd.
Tested by the buildbot.
gdb/ChangeLog
2018-06-09 Tom Tromey <tom@tromey.com>
* source.c (reverse_search_command, forward_search_command): Use
scoped_fd.
This replaces a VEC in serial.c with a std::vector.
Tested by the buildbot.
gdb/ChangeLog
2018-06-09 Tom Tromey <tom@tromey.com>
* serial.c (serial_ops_p): Remove typedef. Don't declare VEC.
(serial_ops_list): Now static, std::vector.
(serial_interface_lookup, serial_add_interface): Update.
This removes a VEC from dwarf2read.c, replacing it with a std::vector.
Tested by the buildbot.
gdb/ChangeLog
2018-06-09 Tom Tromey <tom@tromey.com>
* dwarf2read.c (process_cu_includes): Update.
(process_full_comp_unit): Update.
* dwarf2read.h (struct dwarf2_per_objfile) <just_read_cus>: Now a
std::vector.
This makes gdbreplay share a bit more code with gdbserver, and paves
the way to share more in future. Including common-defs.h pulls in
defines and headers that gdb and gdbserver assume are always
defined/available too, such as for example _(), ansidecl.h or a set of
system headers. Including that revealed (static vs extern conflict)
gdbreplay had a local copy of perror_with_name (which exited directly
instead of throwing an error). So I removed gdbreplay's local copy,
and then added enough .o files until gdbreplay linked successfully.
Also, use xstrdup instead of strdup.
gdb/gdbserver/ChangeLog:
2018-06-08 Pedro Alves <palves@redhat.com>
* Makefile.in (GDBREPLAY_OBS): Add common/cleanups.o,
common/common-exceptions.o, common/common-utils.o,
common/errors.o, common/print-utils.o and utils.o.
* gdbreplay.c: Include "common-defs.h" instead of the two
'config.h's here. Don't include stdio.h, errno.h, stdlib.h,
string.h or alloca.h.
(perror_with_name): Delete.
(remote_open): Use xstrdup instead of strdup.
(main): Rename to ...
(captured_main): ... this.
(main): New.
Originally reported in
https://bugzilla.redhat.com/show_bug.cgi?id=1577396 -- gdb build fails
with Python 3.7 due to references to a Python internal function whose
declaration changed in 3.7.
gdb/ChangeLog
2018-06-08 Paul Koning <paul_koning@dell.com>
PR gdb/23252
* python/python.c (do_start_initialization):
Avoid call to internal Python API.
(init__gdb_module): New function.
This commit adds two new commands which may be used to test thread
debugging libraries used by GDB:
* "maint check libthread-db" tests the thread debugging library GDB
is using for the current inferior.
* "maint set/show check-libthread-db" selects whether libthread_db
tests should be run automatically as libthread_db is auto-loaded.
The default is to not run tests automatically.
The test itself is a basic integrity check exercising all libthread_db
functions used by GDB on GNU/Linux systems. By extension this also
exercises the proc_service functions provided by GDB that libthread_db
uses.
This functionality is useful for NPTL developers and libthread_db
developers. It could also prove useful investigating bugs reported
against GDB where the thread debugging library or GDB's proc_service
layer is suspect.
gdb/ChangeLog:
* linux-thread-db.c (valprint.h): New include.
(struct check_thread_db_info): New structure.
(check_thread_db_on_load, tdb_testinfo): New static globals.
(check_thread_db, check_thread_db_callback): New functions.
(try_thread_db_load_1): Run integrity checks if requested.
(maintenance_check_libthread_db): New function.
(_initialize_thread_db): Register "maint check libthread-db"
and "maint set/show check-libthread-db".
* NEWS: Mention the above new commands.
gdb/doc/ChangeLog:
* gdb.texinfo (Maintenance Commands): Document "maint check
libthread-db" and "maint set/show check-libthread-db".
gdb/testsuite/ChangeLog:
* gdb.threads/check-libthread-db.exp: New file.
* gdb.threads/check-libthread-db.c: Likewise.
I noticed that the mingw build was failing in the buildbot. This
patch fixes the problem. I'm checking it in as obvious.
gdb/ChangeLog
2018-06-08 Tom Tromey <tom@tromey.com>
* windows-nat.c (windows_nat_target::xfer_partial): "beneath" is
now a method.
This removes the last cleanup from btrace.c, replacing it with a use
of unique_xmalloc_ptr.
gdb/ChangeLog
2018-06-08 Tom Tromey <tom@tromey.com>
* btrace.c (parse_xml_raw): Use gdb::unique_xmalloc_ptr.
I forgot to add a ChangeLog entry for my previous commit:
commit e5a77256e8
Author: Sergio Durigan Junior <sergiodj@redhat.com>
Date: Tue Jun 5 17:55:39 2018 -0400
Guard declarations of 'sve_{vq,vl}_from_{vl,vq}' macros on Aarch64 (and unbreak build)
This commit fixes that.
Currently, the target stack is represented by a singly linked list,
with target_ops having a pointer to the target beneath. This poses a
problem for multi-process / multi-target debugging. In that case, we
will naturally want multiple instances of target stacks. E.g., one
stack for inferior 1 which is debugging a core file, and another
target stack for inferior 2 which is debugging a remote process. The
problem then is in finding a target's "beneath" target, if we consider
that for some target_ops types, we'll be sharing a single target_ops
instance between several inferiors. For example, so far, I found no
need to have multiple instances of the spu_multiarch_target /
exec_target / dummy_target targets.
Thus this patch, which changes the target stack representation to an
array of pointers. For now, there's still a single global instance of
this new target_stack class, though further down in the multi-target
work, each inferior will have its own instance.
gdb/ChangeLog:
2018-06-07 Pedro Alves <palves@redhat.com>
* target.h (target_ops) <beneath>: Now a method. All references
updated.
(class target_stack): New.
* target.c (g_target_stack): New.
(g_current_top_target): Delete.
(current_top_target): Get the top target out of g_target_stack.
(target_stack::push, target_stack::unpush): New.
(push_target, unpush_target): Reimplement.
(target_is_pushed): Reimplement in terms of g_target_stack.
(target_ops::beneath, target_stack::find_beneath): New.
This changes target_ops::beneath from a pointer to a method, and
adjusts all references throughout. The idea here is to make it easier
to change the target stack representation from an intrusive singly
linked list to something else without leaking implementation details
throughout.
The commit does not change the representation yet, that will be done
in a following patch. That is why a new target_ops::m_beneath field
appears here. That new field isn't really documented properly or made
private, simply because it will be removed shortly.
Note that target_ops::beneath() is essentially the same as the current
find_target_beneath routine. The following patch will eliminate the
latter.
gdb/ChangeLog:
2018-06-07 Pedro Alves <palves@redhat.com>
* target.h (target_ops) <beneath>: Now a method. All references
updated.
(target_ops) <m_beneath>: New.
* target.c (target_ops::beneath): New.
* corelow.c: Adjust all references to target_ops::beneath.
* linux-thread-db.c: Likewise.
* make-target-delegates: Likewise.
* record-btrace.c: Likewise.
* record-full.c: Likewise.
* remote.c: Likewise.
* target.c: Likewise.
* target-delegates.c: Regenerate.
The recent C++ification of target_ops replaced references to the old
"current_target" squashed target throughout with references to a
"target_stack" pointer. I had picked the "target_stack" name very
early in the multi-target work, and managed to stick with it, even
though it's a bit of a misnomer, since it isn't really a "target
stack" object, but a pointer into the current top target in the stack.
As I'm splitting more pieces off of the multi-target branch, I've come
to think that it's better to rename it now. A following patch will
introduce a new class to represent a target stack, and "target_stack"
would be _its_ ideal name. (In the branch, the class is called
a_target_stack to work around the clash.)
Thus this commit renames target_stack to current_top_target and
replaces all references throughout. Also, while at it,
current_top_target is made a function instead of a pointer, to make it
possible to change its internal implementation without leaking
implementation details out. In a couple patches, the implementation
of the function will change to refer to a target stack object, and
then further down the multi-target work, it'll change again to find
the right target stack for the current inferior.
gdb/ChangeLog:
2018-06-07 Pedro Alves <palves@redhat.com>
* target.h (target_stack): Delete.
(current_top_target): Declare function.
* target.c (target_stack): Delete.
(g_current_top_target): New.
(current_top_target): New function.
* auxv.c: Use current_top_target instead of target_stack
throughout.
* avr-tdep.c: Likewise.
* breakpoint.c: Likewise.
* corefile.c: Likewise.
* elfread.c: Likewise.
* eval.c: Likewise.
* exceptions.c: Likewise.
* frame.c: Likewise.
* gdbarch-selftests.c: Likewise.
* gnu-v3-abi.c: Likewise.
* ia64-tdep.c: Likewise.
* ia64-vms-tdep.c: Likewise.
* infcall.c: Likewise.
* infcmd.c: Likewise.
* infrun.c: Likewise.
* linespec.c: Likewise.
* linux-tdep.c: Likewise.
* minsyms.c: Likewise.
* ppc-linux-nat.c: Likewise.
* ppc-linux-tdep.c: Likewise.
* procfs.c: Likewise.
* regcache.c: Likewise.
* remote.c: Likewise.
* rs6000-tdep.c: Likewise.
* s390-linux-nat.c: Likewise.
* s390-tdep.c: Likewise.
* solib-aix.c: Likewise.
* solib-darwin.c: Likewise.
* solib-dsbt.c: Likewise.
* solib-spu.c: Likewise.
* solib-svr4.c: Likewise.
* solib-target.c: Likewise.
* sparc-tdep.c: Likewise.
* sparc64-tdep.c: Likewise.
* spu-tdep.c: Likewise.
* symfile.c: Likewise.
* symtab.c: Likewise.
* target-descriptions.c: Likewise.
* target-memory.c: Likewise.
* target.c: Likewise.
* target.h: Likewise.
* tracefile-tfile.c: Likewise.
* tracepoint.c: Likewise.
* valops.c: Likewise.
* valprint.c: Likewise.
* value.c: Likewise.
* windows-tdep.c: Likewise.
* mi/mi-main.c: Likewise.
This changes two out parameters of build_address_symbolic to be
std::string, and updates the callers. This allows removing some
cleanups.
This patch also moves the declaration of build_address_symbolic out of
defs.h. I think that many things in defs.h should be elsewhere
instead. In this case, I moved the declaration to valprint.h, becuase
there is no "printcmd.h" -- but perhaps it would be better to
introduce that instead.
Tested by the buildbot.
gdb/ChangeLog
2018-06-07 Tom Tromey <tom@tromey.com>
* valprint.h (build_address_symbolic): Declare.
* printcmd.c (print_address_symbolic): Update.
(build_address_symbolic): Change "name" and "filename" to
std::string.
* disasm.c (gdb_pretty_print_disassembler::pretty_print_insn):
Update.
* defs.h (build_address_symbolic): Remove declaration.
Add the functionality for reading/writing pseudo registers.
On SVE the V registers are pseudo registers. This is supported
by adding AARCH64_SVE_V0_REGNUM.
* aarch64-tdep.c (AARCH64_SVE_V0_REGNUM): Add define.
(aarch64_vnv_type): Add function.
(aarch64_pseudo_register_name): Add V regs for SVE.
(aarch64_pseudo_register_type): Likewise.
(aarch64_pseudo_register_reggroup_p): Likewise.
(aarch64_pseudo_read_value_2): Use V0 offset for SVE
(aarch64_pseudo_read_value): Add V regs for SVE.
(aarch64_pseudo_write_2): Use V0 offset for SVE
(aarch64_pseudo_write): Add V regs for SVE.
* aarch64-tdep.h (struct gdbarch_tdep): Add vnv_type.
Commit 122394f147 ("Function for reading
the Aarch64 SVE vector length") has added macros to manipulate SVE
vector sizes based on Linux kernel sources, but did not guard them
with #ifndef's, which breaks the build when the system headers already
have these macros:
CXX aarch64-linux-nat.o
In file included from ../../gdb/aarch64-tdep.h:25,
from ../../gdb/aarch64-linux-nat.c:30:
../../gdb/arch/aarch64.h:79: error: "sve_vq_from_vl" redefined [-Werror]
#define sve_vq_from_vl(vl) ((vl) / 0x10)
In file included from /usr/include/bits/sigcontext.h:30,
from /usr/include/signal.h:291,
from build-gnulib/import/signal.h:52,
from ../../gdb/linux-nat.h:23,
from ../../gdb/aarch64-linux-nat.c:26:
/usr/include/asm/sigcontext.h:154: note: this is the location of the previous definition
#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
In file included from ../../gdb/aarch64-tdep.h:25,
from ../../gdb/aarch64-linux-nat.c:30:
../../gdb/arch/aarch64.h:80: error: "sve_vl_from_vq" redefined [-Werror]
#define sve_vl_from_vq(vq) ((vq) * 0x10)
In file included from /usr/include/bits/sigcontext.h:30,
from /usr/include/signal.h:291,
from build-gnulib/import/signal.h:52,
from ../../gdb/linux-nat.h:23,
from ../../gdb/aarch64-linux-nat.c:26:
/usr/include/asm/sigcontext.h:155: note: this is the location of the previous definition
#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
In order to fix this breakage, this commit guards the declaration of
the macros using #ifndef's.
gdb/ChangeLog:
2018-06-06 Sergio Durigan Junior <sergiodj@redhat.com>
* arch/aarch64.h (sve_vg_from_vl): Guard with #ifndef.
(sve_vl_from_vg): Likewise.
(sve_vq_from_vl): Likewise.
(sve_vl_from_vq): Likewise.
(sve_vq_from_vg): Likewise.
(sve_vg_from_vq): Likewise.
I happened to notice recently that "gdb --version" says:
GNU gdb (GDB) 8.0.50.20170911-git
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
This is a bit on the wordy side, but also references interactive
commands, which I think doesn't really make sense for --version.
This patch removes some text from --version, while leaving it in the
"show version" output. It also adds a newline between the URLs and
the "For help, ..." text, because I thought that was easier to read.
Finally, it indents one of the URLs, since that was simpler to read,
but not the other URL, because the current format is specified by the
GNU coding standards section on "--version".
Now the --version output looks like:
GNU gdb (GDB) 8.1.50.20180511-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Tested by the buildbot.
gdb/ChangeLog
2018-06-05 Tom Tromey <tom@tromey.com>
* cli/cli-cmds.c (show_version): Update.
* top.c (print_gdb_version): Add "interactive" parameter.
Update.
* main.c (captured_main_1): Update.
* top.h (print_gdb_version): Add "interactive" parameter and a
comment.
gdb/testsuite/ChangeLog
2018-06-05 Tom Tromey <tom@tromey.com>
* gdb.base/default.exp: Update expected "show version" output.
The DEF_ENUM_FLAGS_TYPE macro should be used with a trailing
semicolon, but the example in the comment lacks one.
gdb/ChangeLog:
2018-06-05 David Malcolm <dmalcolm@redhat.com>
* common/enum-flags.h: Add trailing semicolon to example in
comment.
This adds a "continue" response to the pager. If the user types "c"
in response to the pager prompt, pagination will be disabled for the
duration of one command -- but re-enabled afterward. This is handy if
you type a command that produces a lot of output, and you don't want
to baby-sit it by typing "return" each time the prompt comes up.
Tested by the buildbot.
gdb/ChangeLog
2018-06-05 Tom Tromey <tom@tromey.com>
PR cli/12326:
* NEWS: Add entry about pager.
* utils.c (pagination_disabled_for_command): New global.
(prompt_for_continue): Allow "c" response to prompt.
(reinitialize_more_filter): Clear
pagination_disabled_for_command.
(fputs_maybe_filtered): Check pagination_disabled_for_command.
gdb/doc/ChangeLog
2018-06-05 Tom Tromey <tom@tromey.com>
PR cli/12326:
* gdb.texinfo (Screen Size): Document "c" response to pagination
prompt.
gdb/testsuite/ChangeLog
2018-06-05 Tom Tromey <tom@tromey.com>
PR cli/12326:
* gdb.cp/static-print-quit.exp: Update.
* lib/gdb.exp (pagination_prompt): Update.
* gdb.base/page.exp: Use pagination_prompt. Add new tests.
* gdb.python/python.exp: Update.
This removes the last cleanups from the Ada code by changing
ada_lookup_symbol_list's out parameter to be a std::vector, and then
fixing up the fallout.
This is a relatively shallow change. Deeper changes are possible, for
example (1) changing various other functions to accept a vector rather
than a pointer, or (2) changing ada_lookup_symbol_list to return the
vector and omitting the length entirely.
Tested by the buildbot, but I'll wait for Joel to test these as well.
gdb/ChangeLog
2018-06-04 Tom Tromey <tom@tromey.com>
* ada-lang.h (ada_lookup_symbol_list): Update.
* ada-lang.c (resolve_subexp): Update.
(symbols_are_identical_enums): Change type of syms. Remove nsyms
parameter.
(remove_extra_symbols, remove_irrelevant_renamings): Likewise.
(ada_lookup_symbol_list_worker, ada_lookup_symbol_list): Change
results parameter to std::vector.
(ada_iterate_over_symbols, ada_lookup_symbol, get_var_value):
Update.
* ada-exp.y (block_lookup): Update.
(select_possible_type_sym): Change type of syms. Remove nsyms
parameter.
(write_var_or_type, write_name_assoc): Update.
On Windows, using the "-list-thread-groups --available" GDB/MI command
before an inferior is being debugged:
% gdb -q -i=mi
=thread-group-added,id="i1"
=cmd-param-changed,param="auto-load safe-path",value="/"
(gdb)
-list-thread-groups --available
Segmentation fault
Ooops!
The SEGV happens because the -list-thread-groups --available command
triggers a windows_nat_target::xfer_partial call for a TARGET_OBJECT_OSDATA
object. Until a program is being debugged, the target_ops layer that
gets the call is the Windows "native" layer. Except for a couple of
specific objects (TARGET_OBJECT_MEMORY and TARGET_OBJECT_LIBRARIES),
this layer's xfer_partial method delegates the xfer of other objects
to the target beneath:
default:
return beneath->xfer_partial (object, annex,
readbuf, writebuf, offset, len,
xfered_len);
Unfortunately, there is no "beneath layer" in this case, so
beneath is NULL and dereferencing it leads to the SEGV.
This patch fixes the issue by checking beneath before trying
to delegate the request.
gdb/ChangeLog:
* windows-nat.c (windows_nat_target::xfer_partial): Return
TARGET_XFER_E_IO if we need to delegate to the target beneath
but BENEATH is NULL.
gdb/testsuite/ChangeLog:
* gdb.mi/list-thread-groups-no-inferior.exp: New testcase.
The macro ELF_SECTION_IN_SEGMENT should be used when calculating if
a section maps to a segment.
gdb/
* elfread.c (elf_symfile_segments): Use ELF_SECTION_IN_SEGMENT.
After pulling Alan's change that added aarch64-sve-linux-ptrace.o to
configure.nat, I got an undefined reference to aarch64_sve_get_vq when
doing a "make clean && make". It turns out that re-running configure
(./config.status --recheck) was needed to re-generate the Makefile with
aarch64-sve-linux-ptrace.o included in the object list. Putting
configure.nat in the dependencies of config.status would make sure that
when we modify configure.nat, the configure script is re-ran. I think
it also makes sense because configure.tgt and configure.host are also
there.
gdb/ChangeLog:
* Makefile.in (config.status): Add configure.nat as a
dependency.
Collect per client specific global data items into struct client_state,
which is similar in purpose to remote.c::remote_state.
gdbserver/ChangeLog
* server.h (struct client_state): New.
* server.c (cont_thread, general_thread, multi_process)
(report_fork_events, report_vfork_events, report_exec_events)
(report_thread_events, swbreak_feature, hwbreak_feature)
(vCont_supported, disable_randomization, pass_signals)
(program_signals, program_signals_p, last_status, last_ptid, own_buf):
Moved to client_state.
* remote-utils.c (remote_debug, noack_mode)
(transport_is_reliable): Moved to client_state.
* tracepoint.c (current_traceframe): Moved to client_state.
Update all callers.
* server.c, remote-utils.c, tracepoint.c, fork-child.c,
linux-low.c, remote-utils.h, target.c: Use client_state.
Pedro pointed out in an earlier patch that it would be possible to
make some helper functions in cp-name-parser.y into methods on
cpname_state, cleaning up the code a bit. This patch implements this
idea.
Doing this required moving the %union earlier in the .y file, so the
patch is somewhat bigger than you might expect.
Tested by building with both bison and byacc, and then running the
gdb.cp tests.
gdb/ChangeLog
2018-06-04 Tom Tromey <tom@tromey.com>
* cp-name-parser.y (cpname_state): Add method declarations.
(HANDLE_QUAL): Update.
(cpname_state::d_grab, cpname_state::fill_comp)
(cpname_state::make_operator, cpname_state::make_dtor)
(cpname_state::make_builtin_type, cpname_state::make_name)
(cpname_state::d_qualify, cpname_state::d_int_type)
(cpname_state::d_unary, cpname_state::d_binary): Now methods.
(%union): Move earlier.
Reduce code copy/paste by adding two helper functions for
aarch64_pseudo_read_value and aarch64_pseudo_write
Does not change any functionality.
gdb/
* aarch64-tdep.c (aarch64_pseudo_read_value_1): New helper func.
(aarch64_pseudo_write_1): Likewise.
(aarch64_pseudo_read_value): Use helper.
(aarch64_pseudo_write): Likewise.
<https://sourceware.org/bugzilla/show_bug.cgi?id=22960#c4> reports
that macOS gdb crashes with a null pointer dereference in
push_target(struct target_ops *). This commit fixes that.
The problem is that commit f6ac5f3d63 ("Convert struct target_ops to
C++") left the darwin_ops global uninitialized.
We don't need that global anymore, we can use the (new)
get_native_target function instead for the same effect.
gdb/ChangeLog:
2018-06-04 Pedro Alves <palves@redhat.com>
* darwin-nat.c (darwin_ops): Delete.
(darwin_attach_pid): Use get_native_target.
Enable SVE support for GDB by reading the VQ when creating a
target description.
Also ensurse that SVE is taken into account when creating
the tdep structure, and store the current VQ value directly in tdep.
gdb/
* aarch64-linux-nat.c (aarch64_linux_read_description): Support SVE.
* aarch64-tdep.c (aarch64_get_tdesc_vq): New function.
(aarch64_gdbarch_init): Check for SVE.
* aarch64-tdep.h (gdbarch_tdep::has_sve): New function.
Previously VQ was of type long. Using uint64_t ensures it always matches the
same type as the VG register.
Note that in the Linux kernel, VQ is 16bits. We cast it up to 64bits
immediately after reading to ensure we always use the same type throughout
the code.
gdb/
* aarch64-tdep.c (aarch64_read_description): Use uint64_t for VQ.
* aarch64-tdep.h (aarch64_read_description): Likewise.
* arch/aarch64.c (aarch64_create_target_description): Likewise.
* arch/aarch64.h (aarch64_create_target_description): Likewise.
* features/aarch64-sve.c (create_feature_aarch64_sve): Likewise.
* nat/aarch64-sve-linux-ptrace.c(aarch64_sve_get_vq): Likewise.
* nat/aarch64-sve-linux-ptrace.h (aarch64_sve_get_vq): Likewise.
While reading value_fetch_lazy, I thought it would be good to split it
in small functions (especially the part that handles lval_register).
gdb/ChangeLog:
* value.c (value_fetch_lazy_bitfield): New.
(value_fetch_lazy_memory): New.
(value_fetch_lazy_register): New.
(value_fetch_lazy): Factor out to smaller functions.
This changes "backslashable" and "represented" in cp-name-parser.y to
be const. This lets the compiler make them read-only (though in my
build it seems that GCC inlines them, which seems even better).
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* cp-name-parser.y (backslashable, represented): Now const.
This changes cp-name-parser.y to include parser-defs.h, removing the
copy-pasted declaration of parser_fprintf. This can be done now that
cp-name-parser.y does not define any global variables.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* cp-name-parser.y: Include parser-defs.h.
(parser_fprintf): Remove declaration.
This changes cp-name-parser.y to be a pure parser.
Originally I had thought that doing this would mean that gdb would
always require Bison. However, I've learned that Byacc supports some
of the Bison extensions in this area. So, the new code ought to work
reasonably well with both.
Note that the Byacc documentations says:
%pure-parser
Most variables (other than yydebug and yynerrs) are allocated
on the stack within yyparse, making the parser reasonably
reentrant.
In our case this is ok, first because gdb does not yet actualy require
reentrancy, and second because gdb does not use yynerrs.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* cp-name-parser.y: Use %pure-parser, %lex-param, and
%parse-param.
(lexptr, prev_lexptr, error_lexptr, global_errmsg, demangle_info)
(global_result): Remove globals.
(struct cpname_state): New.
(yyparse): Don't declare.
(yylex, yyerror): Move declarations after %union.
(d_grab, fill_comp, make_operator, make_dtor, make_builtin_type)
(make_name): Add state parameter.
Update all callers.
(d_qualify, d_int_type, d_unary, d_binary, parse_number) Add state
parameter.
(HANDLE_QUAL, HANDLE_SPECIAL, HANDLE_TOKEN2, HANDLE_TOKEN3):
Update.
(yylex): Add lvalp, state parameters.
(yyerror): Add state parameter.
(cp_demangled_name_to_comp): Update.
This changes cp-name-parser.y to use yy-remap.h, rather than its old
manual approach.
This required declaring parser_fprintf in cp-name-parser.y.
parser-defs.h can't be included here because parser-defs.h declares a
global "lexptr", which conflicts with the local one in
cp-name-parser.y. This is only temporary, and will be cleaned up
later in the series.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* cp-name-parser.y (parser_fprintf): Declare.
(GDB_YY_REMAP_PREFIX): Define.
Include yy-remap.h. Don't redefine yy* identifiers.
This removes a static buffer from cp-name-parser.y by replacing the
fixed-sized buffer with a std::string out parameter.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* python/py-type.c (typy_legacy_template_argument): Update.
* cp-support.h (cp_demangled_name_to_comp): Update.
* cp-name-parser.y (cp_demangled_name_to_comp): Change errmsg
parameter to be a "std::string *".
(main): Update.
Move gdb/common/diagnostics.h to include/diagnostics.h so that it can
be used in binutils.
gdb/
* ada-lex.l: Include "diagnostics.h" instead of
"common/diagnostics.h".
* unittests/environ-selftests.c: Likewise.
* common/diagnostics.h: Moved to ../include.
include/
* diagnostics.h: Moved from ../gdb/common/diagnostics.h.
Trying to insert a breakpoint using *FUNC'address with an Ada program
and then running the program until reaching that breakpoint currently
yields the following behavior:
(gdb) break *a'address
Breakpoint 1 at 0x40240c: file a.adb, line 1.
(gdb) run
[1] + 27222 suspended (tty output) /[...]/gdb -q simple_main
Unsuspending GDB then shows it was suspended trying to report
the following error:
Starting program: /home/takamaka.a/brobecke/ex/simple/a
Error in re-setting breakpoint 1: Unmatched single quote.
Error in re-setting breakpoint 1: Unmatched single quote.
Error in re-setting breakpoint 1: Unmatched single quote.
[Inferior 1 (process 32470) exited normally]
The "a'address" is Ada speak for function A's address ("A" by
itself means the result of calling A with no arguments). The
transcript above shows that we're having problems trying to
parse the breakpoint location while re-setting it. As a result,
we also fail to stop at the breakpoint.
Normally, breakpoint locations are evaluated with the current_language
being set to the language of the breakpoint. But, unfortunately for us,
what happened in this case is that parse_exp_in_context_1 calls
get_selected_block which eventually leads to a call to select_frame
because the current_frame hadn't been set yet. select_frame then
finds that our language_mode is auto, and therefore changes the
current_language to match the language of the frame we just selected.
In our case, the language chosen was 'c', which of course is not
able to parse an Ada expression, hence the error.
This patch prevents this by forcing the language_mode to manual
before we call breakpoint_re_set_one.
gdb/ChangeLog:
* breakpoint.c (breakpoint_re_set): Temporarily force language_mode
to language_mode_manual while calling breakpoint_re_set_one.
gdb/testsuite/ChangeLog:
* gdb.ada/bp_fun_addr: New testcase.
Tested on x86_64-linux.
TYPE_TAG_NAME has been an occasional source of confusion and bugs. It
seems to me that it is only useful for C and C++ -- but even there,
not so much, because at least with DWARF there doesn't seem to be any
way to wind up with a type where the name and the tag name are both
non-NULL and different.
So, this patch removes TYPE_TAG_NAME entirely. This should save a
little memory, but more importantly, it simplifies this part of gdb.
A few minor test suite adjustments were needed. In some situations
the new code does not yield identical output to the old code.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* valops.c (enum_constant_from_type, value_namespace_elt)
(value_maybe_namespace_elt): Update.
* valarith.c (find_size_for_pointer_math): Update.
* target-descriptions.c (make_gdb_type): Update.
* symmisc.c (print_symbol): Update.
* stabsread.c (define_symbol, read_type)
(complain_about_struct_wipeout, add_undefined_type)
(cleanup_undefined_types_1): Update.
* rust-lang.c (rust_tuple_type_p, rust_slice_type_p)
(rust_range_type_p, val_print_struct, rust_print_struct_def)
(rust_internal_print_type, rust_composite_type)
(rust_evaluate_funcall, rust_evaluate_subexp)
(rust_inclusive_range_type_p): Update.
* python/py-type.c (typy_get_tag): Update.
* p-typeprint.c (pascal_type_print_base): Update.
* mdebugread.c (parse_symbol, parse_type): Update.
* m2-typeprint.c (m2_long_set, m2_record_fields, m2_enum):
Update.
* guile/scm-type.c (gdbscm_type_tag): Update.
* go-lang.c (sixg_string_p): Update.
* gnu-v3-abi.c (build_gdb_vtable_type, build_std_type_info_type):
Update.
* gdbtypes.h (struct main_type) <tag_name>: Remove.
(TYPE_TAG_NAME): Remove.
* gdbtypes.c (type_name_no_tag): Simplify.
(check_typedef, check_types_equal, recursive_dump_type)
(copy_type_recursive, arch_composite_type): Update.
* f-typeprint.c (f_type_print_base): Update. Print "Type" prefix
in summary mode when needed.
* eval.c (evaluate_funcall): Update.
* dwarf2read.c (fixup_go_packaging, read_structure_type)
(process_structure_scope, read_enumeration_type)
(read_namespace_type, read_module_type, determine_prefix): Update.
* cp-support.c (inspect_type): Update.
* coffread.c (process_coff_symbol, decode_base_type): Update.
* c-varobj.c (c_is_path_expr_parent): Update.
* c-typeprint.c (c_type_print_base_struct_union): Update.
(c_type_print_base_1): Update. Print struct/class/union/enum in
summary when using C language.
* ax-gdb.c (gen_struct_ref, gen_namespace_elt)
(gen_maybe_namespace_elt): Update.
* ada-lang.c (ada_type_name): Simplify.
(empty_record, ada_template_to_fixed_record_type_1)
(template_to_static_fixed_type)
(to_record_with_fixed_variant_part, ada_check_typedef): Update.
gdb/testsuite/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* gdb.xml/tdesc-regs.exp (load_description): Update expected
results.
* gdb.dwarf2/method-ptr.exp: Set language to C++.
* gdb.dwarf2/member-ptr-forwardref.exp: Set language to C++.
* gdb.cp/typeid.exp (do_typeid_tests): Update type_re.
* gdb.base/maint.exp (maint_pass_if): Update.
Currently dwarf2read.c will pass the CU's language to
c_type_print_args -- but this doesn't affect all aspects of type
printing, because some code in c-typeprint.c refers to
current_language.
This patch threads the language through more of the type printing
code, adding an overload to c_type_print. Some uses of
current_language remain, but now they are only in top-level functions.
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* dwarf2read.c (dwarf2_compute_name): Pass CU's language to
c_print_type.
* c-typeprint.c (c_print_type_1): Add "language" parameter.
(c_print_type): Update.
(c_print_type): New overload.
(c_type_print_varspec_prefix, c_type_print_args)
(c_type_print_varspec_suffix, c_print_type_no_offsets)
(c_type_print_base_struct_union, c_type_print_base_1)
(cp_type_print_method_args): Add "language" parameter.
(c_type_print_base): Update.
* c-lang.h (c_print_type): Add new overload.
I noticed that c_type_print_varspec_suffix is only called from
c-typeprint.c, so this patch makes it "static".
gdb/ChangeLog
2018-06-01 Tom Tromey <tom@tromey.com>
* typeprint.h (c_type_print_varspec_suffix): Don't declare.
* c-typeprint.c (c_type_print_varspec_suffix): Now static.
In order to prevent gaps in the register numbering, the Z registers
reuse the V register numbers (which become pseudos on SVE).
2018-06-01 Alan Hayward <alan.hayward@arm.com>
* aarch64-tdep.c (aarch64_sve_register_names): New const
var.
* arch/aarch64.h (enum aarch64_regnum): Add SVE entries.
(AARCH64_SVE_Z_REGS_NUM): New define.
(AARCH64_SVE_P_REGS_NUM): Likewise.
(AARCH64_SVE_NUM_REGS): Likewise.
It's long bothered me that setting a Python parameter from the CLI
will print the "set" help text by default. I think usually "set"
commands should be silent. And, while you can modify this behavior a
bit by providing a "get_set_string" method, if this method returns an
empty string, a blank line will be printed.
This patch removes the "help" behavior and changes the get_set_string
behavior to avoid printing a blank line. The code has a comment about
preserving API behavior, but I don't think this is truly important;
and in any case the workaround -- implementing get_set_string -- is
trivial.
Regression tested on x86-64 Fedora 26.
2018-04-26 Tom Tromey <tom@tromey.com>
* NEWS: Mention new "set" behavior.
* python/py-param.c (get_set_value): Don't print an empty string.
Don't call get_doc_string.
gdb/doc/ChangeLog
2018-04-26 Tom Tromey <tom@tromey.com>
* python.texi (Parameters In Python): Update get_set_string
documentation.
This adds a basic Python API for accessing convenience variables.
With this, convenience variables can be read and set from Python.
Although gdb supports convenience variables whose value changes at
each call, this is not exposed to Python; it could be, but I think
it's just as good to write a convenience function in this situation.
This is PR python/23080.
Tested on x86-64 Fedora 26.
2018-04-22 Tom Tromey <tom@tromey.com>
PR python/23080:
* NEWS: Update for new functions.
* python/py-value.c (gdbpy_set_convenience_variable)
(gdbpy_convenience_variable): New functions.
* python/python-internal.h (gdbpy_convenience_variable)
(gdbpy_set_convenience_variable): Declare.
* python/python.c (python_GdbMethods): Add convenience_variable,
set_convenience_variable.
doc/ChangeLog
2018-04-22 Tom Tromey <tom@tromey.com>
PR python/23080:
* python.texi (Basic Python): Document gdb.convenience_variable,
gdb.set_convenience_variable.
testsuite/ChangeLog
2018-04-22 Tom Tromey <tom@tromey.com>
PR python/23080:
* gdb.python/python.exp: Add convenience variable tests.
[Commit log by Simon Marchi]
I get this error:
CXX linux-nat.o
/home/simark/src/binutils-gdb/gdb/linux-nat.c: In function 'void save_stop_reason(lwp_info*)':
/home/simark/src/binutils-gdb/gdb/linux-nat.c:2718:9: error: duplicated 'if' condition [-Werror=duplicated-cond]
else if (GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code))
^~
In file included from /home/simark/src/binutils-gdb/gdb/linux-nat.c:31:0:
/home/simark/src/binutils-gdb/gdb/nat/linux-ptrace.h:173:41: note: previously used here
# define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == TRAP_BRKPT)
~~~~~^~~~~~~~~~~~~~
/home/simark/src/binutils-gdb/gdb/linux-nat.c:2709:13: note: in expansion of macro 'GDB_ARCH_IS_TRAP_BRKPT'
else if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code))
^~~~~~~~~~~~~~~~~~~~~~
For Alpha, we currently define GDB_ARCH_IS_TRAP_BRKPT and
GDB_ARCH_IS_TRAP_HWBKPT both to ((X) == TRAP_BRKPT), which causes the
two if branches to be duplicated.
Alpha doesn't have hardware breakpoints, so the Linux kernel for Alpha
never sets si_code to TRAP_HWBKPT. We can just remove the special
definitions of these macros for __alpha__ and rely on the default ones.
Since the kernel will never report TRAP_HWBKPT, we will just never enter
the "hardware breakpoint" branch on Alpha (which is fine since it
doesn't have them).
gdb/ChangeLog:
* nat/linux-ptrace.h [__alpha__]
(GDB_ARCH_IS_TRAP_BRKPT, GDB_ARCH_IS_TRAP_HWBKPT): Remove
definitions.
Use the last endianness explicitly selected, either by choosing a binary
file or with the `set endian' command, for future automatic selection.
As observed with the `gdb.base/step-over-no-symbols.exp' test case when
discarding the binary file even while connected to a live target the
endianness automatically selected is reset to the GDB target's default,
even if it does not match the endianness of the target being talked to.
For example with a little-endian MIPS target and the default endianness
being big we get this:
(gdb) file .../gdb/testsuite/outputs/gdb.base/step-over-no-symbols/step-over-no-symbols
Reading symbols from .../gdb/testsuite/outputs/gdb.base/step-over-no-symbols/step-over-no-symbols...done.
(gdb) delete breakpoints
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) break main
Breakpoint 1 at 0x400840: file .../gdb/testsuite/gdb.base/start.c, line 34.
[...]
(gdb) continue
Continuing.
Breakpoint 1, main () at .../gdb/testsuite/gdb.base/start.c:34
34 foo();
(gdb) delete breakpoints
Delete all breakpoints? (y or n) y
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) file
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
No executable file now.
Discard symbol table from `.../gdb/testsuite/outputs/gdb.base/step-over-no-symbols/step-over-no-symbols'? (y or n) y
No symbol file now.
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: purging symbols
p /x $pc
$1 = 0x40084000
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: get before PC
break *$pc
Breakpoint 2 at 0x40084000
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: break *$pc
set displaced-stepping off
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: set displaced-stepping off
stepi
Warning:
Cannot insert breakpoint 2.
Cannot access memory at address 0x40084000
Command aborted.
(gdb) FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: stepi
p /x $pc
$2 = 0x40084000
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: get after PC
FAIL: gdb.base/step-over-no-symbols.exp: displaced=off: advanced
Remote debugging from host ...
monitor exit
(gdb) Killing process(es): ...
testcase .../gdb/testsuite/gdb.base/step-over-no-symbols.exp completed in 2 seconds
which shows that with the removal of the executable debugged the
endianness of $pc still at `main' gets swapped and the value in that
register is now incorrectly interpreted as 0x40084000 rather than
0x400840 as shown earlier on with the `break' command. Consequently the
debug session no longer works as expected, until the endianness is
overridden with an explicit `set endian little' command.
This will happen while working with any target hardware whose endianness
does not match the default GDB target's endianness guessed and recorded
for a later use in `initialize_current_architecture'.
Given that within a single run of GDB it is more likely that consecutive
target connections will use the same endianness than that the endianness
will be swapped between connections, it makes sense to preserve the last
endianness explicitly selected as the automatic default. It will make a
session like above, where an executable is removed, work correctly and
will retain the endianness for a further reconnection to the target.
And the new automatic default will still be overridden by subsequently
choosing a binary to debug, or with an explicit `set endian' command.
With the change in place the test case above completes successfully:
(gdb) continue
Continuing.
Breakpoint 1, main () at .../gdb/testsuite/gdb.base/start.c:34
34 foo();
(gdb) delete breakpoints
Delete all breakpoints? (y or n) y
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) file
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
No executable file now.
Discard symbol table from `.../gdb/testsuite/outputs/gdb.base/step-over-no-symbols/step-over-no-symbols'? (y or n) y
No symbol file now.
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: purging symbols
p /x $pc
warning: GDB can't find the start of the function at 0x400840.
GDB is unable to find the start of the function at 0x400840
and thus can't determine the size of that function's stack frame.
This means that GDB may be unable to access that stack frame, or
the frames below it.
This problem is most likely caused by an invalid program counter or
stack pointer.
However, if you think GDB should simply search farther back
from 0x400840 for code which looks like the beginning of a
function, you can increase the range of the search using the `set
heuristic-fence-post' command.
$1 = 0x400840
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: get before PC
break *$pc
Breakpoint 2 at 0x400840
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: break *$pc
set displaced-stepping off
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: set displaced-stepping off
stepi
warning: GDB can't find the start of the function at 0x4007f8.
0x004007f8 in ?? ()
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: stepi
p /x $pc
$2 = 0x4007f8
(gdb) PASS: gdb.base/step-over-no-symbols.exp: displaced=off: get after PC
PASS: gdb.base/step-over-no-symbols.exp: displaced=off: advanced
Remote debugging from host ...
monitor exit
(gdb) Killing process(es): ...
testcase .../gdb/testsuite/gdb.base/step-over-no-symbols.exp completed in 2 seconds
gdb/
* arch-utils.c (gdbarch_info_fill): Set `default_byte_order' to
the endianness selected.
* NEWS: Document `set endian auto' mode operation update.
gdb/doc/
* gdb.texinfo (Choosing Target Byte Order): Document endianness
selection details with the `set endian auto' mode.
gdb/testsuite
* gdb.base/endian.exp: New test.
* gdb.base/endian.c: New test source.
Returns 0 for systems without SVE support.
Note the defines taken from Linux kernel headers
in aarch64-sve-linux-ptrace.h.
gdb/
* Makefile.in: Add new header.
* gdb/arch/aarch64.h (sve_vg_from_vl): New macro.
(sve_vl_from_vg): Likewise.
(sve_vq_from_vl): Likewise.
(sve_vl_from_vq): Likewise.
(sve_vq_from_vg): Likewise.
(sve_vg_from_vq): Likewise.
* configure.nat: Add new c file.
* nat/aarch64-sve-linux-ptrace.c: New file.
* nat/aarch64-sve-linux-ptrace.h: New file.
gdbserver/
* configure.srv: Add new c/h file.
This patch fixes a bug introduced by fix to AArch64 pointer tagging.
In our fix for tagged pointer support our agreed approach was to sign
extend user-space address after clearing tag bits. This is not same
for all architectures and this patch allows sign extension for
addresses on targets which specifically set significant_addr_bit.
More information about patch that caused the issues and discussion
around tagged pointer support can be found in links below:
https://sourceware.org/ml/gdb-patches/2018-05/msg00000.htmlhttps://sourceware.org/ml/gdb-patches/2017-12/msg00159.html
gdb/ChangeLog:
2018-05-31 Omair Javaid <omair.javaid@linaro.org>
PR gdb/23210
* gdbarch.sh (significant_addr_bit): Default to zero when
not set by target architecture.
* gdbarch.c: Re-generated.
* utils.c (address_significant): Update.
Remove regcache_raw_write, update all callers to use regcache::raw_write
instead.
gdb/ChangeLog:
* regcache.h (regcache_raw_write): Remove, update callers to use
regcache::raw_write instead.
* regcache.c (regcache_raw_write): Remove.
Remove regcache_raw_read, update all callers to use
readable_regcache::raw_read instead.
gdb/ChangeLog:
* regcache.h (regcache_raw_read): Remove, update callers to use
readable_regcache::raw_read instead.
* regcache.c (regcache_raw_read): Remove.
The or1k-tdep.o object is missing from the ALL_TARGET_OBS, which means
it's not currently included in an --enable-targets=all build.
gdb/ChangeLog:
* Makefile.in (ALL_TARGET_OBS): Add or1k-tdep.o.
This commit fixes a set of -Wmaybe-uninitialized warnings in GDB and
GDBserver, seen with GCC 7.3.1 on F27 at -O2. Specifically, all of
these:
src/gdb/breakpoint.c:5040:4: warning: ‘e’ may be used uninitialized in this function [-Wmaybe-uninitialized]
src/gdb/cli/cli-cmds.c:277:71: warning: ‘tracker’ may be used uninitialized in this function [-Wmaybe-uninitialized]
src/gdb/cli/cli-cmds.c:302:22: warning: ‘word’ may be used uninitialized in this function [-Wmaybe-uninitialized]
src/gdb/gdbserver/server.c:1895:7: warning: ‘result’ may be used uninitialized in this function [-Wmaybe-uninitialized]
src/gdb/gdbserver/server.c:1966:7: warning: ‘result’ may be used uninitialized in this function [-Wmaybe-uninitialized]
For example, looking at one of the gdbserver ones in more detail:
../../../src/gdb/gdbserver/server.c: In function ‘int handle_qxfer_btrace_conf(const char*, gdb_byte*, const gdb_byte*, ULONGEST, LONGEST)’:
../../../src/gdb/gdbserver/server.c:1966:7: warning: ‘result’ may be used uninitialized in this function [-Wmaybe-uninitialized]
if (result != 0)
^~
In this case (like the others), the 'result' variable is assigned in
both TRY and CATCH blocks:
TRY
{
result = target_read_btrace_conf (thread->btrace, &cache);
if (result != 0)
memcpy (own_buf, cache.buffer, cache.used_size);
}
CATCH (exception, RETURN_MASK_ERROR)
{
sprintf (own_buf, "E.%s", exception.message);
result = -1;
}
END_CATCH
if (result != 0)
return -3;
so it would seem like the warning is bogus.
However, END_CATCH is really a catch block in disguise, and that path
indeed does not initialize the variable:
#define END_CATCH \
catch (...) \
{ \
exception_rethrow (); \
} \
}
exception_rethrow does not return normally (it rethrows the current
exception after running cleanups), but the compiler can not see that.
If it could return normally, then indeed 'result' could be used
uninitialized if the TRY block threw some non-gdb exception, which
would be caught by END_CATCH.
The fix it to let the compiler know that the exception_rethrow does
not return normally, using ATTRIBUTE_NORETURN.
gdb/ChangeLog:
2018-05-30 Pedro Alves <palves@redhat.com>
* common/common-exceptions.h (exception_rethrow): Use
ATTRIBUTE_NORETURN.
I get this kind of errors with GCC 6.3.0:
/home/simark/src/binutils-gdb/gdb/breakpoint.c: In function 'void print_solib_event(int)':
/home/simark/src/binutils-gdb/gdb/breakpoint.c:4618:12: error: types may not be defined in a for-range-declaration [-Werror]
for (struct so_list *iter : current_program_space->added_solibs)
^~~~~~
Removing the struct keyword makes it happy.
gdb/ChangeLog:
* breakpoint.c (print_solib_event, check_status_catch_solib):
Remove struct keyword in range-based for loops.
* dbxread.c (find_corresponding_bincl_psymtab): Likewise.
* dwarf2read.c (compute_delayed_physnames, rust_union_quirks);
Likewise.
* linespec.c (find_superclass_methods, search_minsyms_for_name):
Likewise.
* symfile.c (addr_info_make_relative): Likewise.
* thread.c (value_in_thread_stack_temporaries): Likewise.
Function lookup_minimal_symbol_and_objfile iterates on all objfiles and
calls lookup_minimal_symbol for each of them, effectively searching in all
objfiles. lookup_bound_minimal_symbol calls lookup_minimal_symbol with NULL,
which also effectively searches all objfiles. AFAIK, they do exactly the same
thing, so we can get rid of one (and lookup_minimal_symbol_and_objfile happens
to be the most inefficient because it ends up n^2 on the number of objfiles).
Tested in both aarch64-linux-gnu and amd64-linux-gnu. No regressions.
Now that the mingw builder in the buildbot is working again, it
pointed out a build failure due to a missing fall-through comment in
windows-nat.c. This patch fixes the problem.
Tested by first triggering the failure with a local mingw build, then
by rebuilding successfully with the patch.
I'm checking this in as obvious.
gdb/ChangeLog
2018-05-29 Tom Tromey <tom@tromey.com>
* windows-nat.c (handle_exception): Update fall-through comment.
This removes a VEC from type.c, by using std::vector.
While doing this I also took the opportunity to change
types_deeply_equal to return bool. This caught some weird code in
typy_richcompare, now fixed.
And, since I was changing types_deeply_equal, it seemed like a good
idea to also change types_equal, so this patch includes that as well.
Tested by the buildbot.
ChangeLog
2018-05-29 Tom Tromey <tom@tromey.com>
* python/py-type.c (typy_richcompare): Update.
* guile/scm-type.c (tyscm_equal_p_type_smob): Update.
* gdbtypes.h (types_deeply_equal): Return bool.
(types_equal): Likewise.
* gdbtypes.c (type_equality_entry_d): Remove typedef. Don't
declare VEC.
(check_types_equal): Change worklist to std::vector. Return
bool.
(struct type_equality_entry): Add constructor.
(compare_maybe_null_strings): Return bool.
(check_types_worklist): Return bool. Change worklist to
std::vector.
(types_deeply_equal): Use std::vector.
(types_equal): Return bool.
(compare_maybe_null_strings): Simplify.
The tp_t typedef is no longer used and can be removed.
ChangeLog
2018-05-29 Tom Tromey <tom@tromey.com>
* record-btrace.c (tp_t): Remove typedef. Don't declare VEC.
The const_char_ptr is no longer used, so it can be removed.
ChangeLog
2018-05-29 Tom Tromey <tom@tromey.com>
* objc-lang.h: Don't include cp-support.h.
* common/gdb_vecs.h (const_char_ptr): Remove typedef. Don't
declare VEC.
REMOTE_OBS was removed from Makefile.in in
18ca73470a, but one reference remains.
This patch removes the lingerer.
ChangeLog
2018-05-27 Tom Tromey <tom@tromey.com>
* Makefile.in (DEPFILES): Don't reference REMOTE_OBS.
My recent change to allocate values with "new" may have introduced a
small bug. In particular, the previous code allocated with XCNEW, but
the new code only clears a part of the "location" field in the
constructor. I didn't try very hard to actually trigger a bug here,
the problem remains theoretical.
This patch just arranges to initialize the entire location.
Regression tested by the buildbot.
2018-05-25 Tom Tromey <tom@tromey.com>
* value.c (value::location): Initialize.
This removes the remaining cleanups from dbxread.c, via std::vector,
scoped_restore, and unique_xmalloc_ptr.
Tested by the buildbot.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* dbxread.c (init_bincl_list): Remove.
(bincl_list): Now a std::vector.
(bincls_allocated, next_bincl): Remove.
(free_bincl_list, do_free_bincl_list_cleanup)
(make_cleanup_free_bincl_list): Remove.
(dbx_read_symtab, elfstab_build_psymtabs): Use scoped_restore,
unique_xmalloc_ptr.
(find_corresponding_bincl_psymtab, read_dbx_symtab): Update.
(struct header_file_location): Add constructor.
(add_bincl_to_list): Remove.
In a review Pedro pointed out that interp::name is intended to be
read-only, and so an accessor would be a better fit. This patch
renames the field and adds a "name" method that is used instead.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* tui/tui.c (tui_enable): Update.
* mi/mi-interp.c (mi_interp::init): Update.
* interps.h (class interp) <name>: New method.
<m_name>: Rename from name.
(~scoped_restore_interp): Update.
* interps.c (interp::interp): Update.
(interp_add, interp_set, interp_lookup_existing)
(current_interp_named_p): Update.
This removes the interp_name function. It is only used a few spots --
one of which was only calling it on "this". It's simpler to remove
it; and should class interp become opaque in the future, it will be
just as easy to update the two remaining spots to use an accessor.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* interps.c (interp_name): Remove.
* mi/mi-interp.c (mi_interp::init): Update.
* interps.h (interp_name): Remove.
(~scoped_restore_interp): Update.
* tui/tui.c (tui_enable): Update.
The function interp_ui_out simply calls the interp_ui_out method.
However, if it is passed a NULL interpreter, it first finds the
current interpreter. I believe, though, that NULL is never passed
here, and I think it's simpler to just remove this function and
require callers to be more explicit.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* utils.c (fputs_maybe_filtered): Update.
* linespec.c (decode_line_full): Update.
* mi/mi-interp.c (mi_on_normal_stop_1, mi_tsv_modified)
(mi_print_breakpoint_for_event, mi_solib_loaded)
(mi_solib_unloaded, mi_command_param_changed, mi_memory_changed)
(mi_user_selected_context_changed): Update.
* mi/mi-main.c (mi_execute_command): Update.
* cli/cli-script.c (execute_control_command): Update.
* python/python.c (execute_gdb_command): Update.
* solib.c (info_sharedlibrary_command): Update.
* interps.c (interp_ui_out): Remove.
* interps.h (interp_ui_out): Remove.
This changes the various as_*_interp functions to be implemented using
dynamic_cast. I believe this is a small improvement, because it is
more typesafe -- the C++ runtime does the type-checking for us.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* tui/tui-interp.c (as_tui_interp): Use dynamic_cast.
* mi/mi-interp.c (as_mi_interp): Use dynamic_cast.
* cli/cli-interp.c (as_cli_interp): Use dynamic_cast.
While looking through the "interp" code I found a couple of spots that
could use scoped_restore.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* cli/cli-interp.c (safe_execute_command): Use scoped_restore.
* interps.c (interp_exec): Use scoped_restore.
This changes a couple of spots in remote.c to use gdb::byte_vector,
allowing for some cleanup removal.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* remote.c (remote_target::remote_file_get): Use
gdb::byte_vector.
(remote_target::remote_file_put): Likewise.
This removes cleanups from coff-pe-read.c, using std::string,
std::vector, and gdb::def_vector.
Tested by the buildbot, though I'm not sure these code paths are
exercised there.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* coff-pe-read.c (struct read_pe_section_data) <section_name>: Now
a std::string.
(get_pe_section_index, add_pe_exported_sym): Update.
(read_pe_exported_syms): Use gdb::def_vector.
This changes remove_prev_frame to use TRY/CATCH instead of a cleanup.
TRY/CATCH seemed appropriate here because the cleanup is only needed
in the case where an exception is thrown.
Tested by the buildbot.
ChangeLog
2018-05-25 Tom Tromey <tom@tromey.com>
* frame.c (remove_prev_frame): Remove.
(get_prev_frame_if_no_cycle): Use TRY/CATCH.
Our interpretation of the layout of floating-point general registers
(FGRs) in o32 MIPS/Linux core files is different from how the kernel
makes them, affecting the CP0 Status.FR=0 aka FP32 mode (we don't
currently support the CP0 Status.FR=1 aka FP64 mode with the o32 ABI).
In the FP32 mode pairs of consecutive even/odd-numbered 32-bit registers
are placed together as 64-bit values in even-indexed 64-bit slots
corresponding to the even index, leaving the odd-indexed 64-bit slots
unused. These 64-bit values are stored according to the endianness in
effect, which is how the MIPS II SDC1 instruction would store them.
It has always been like that with the Linux kernel for MIPS II and
higher ISA processors, which are the vast majority ever supported, as it
is indeed SDC1 that the kernel uses to store FGRs in a floating-point
context.
With MIPS I processors, which lack the SDC1 instruction, a layout that
we expect used to be used long ago, but it was corrected for consistency
with newer processors back in 2002, with `linux-mips.org' (LMO) commit
42533948caac ("Major pile of FP emulator changes."), the fix corrected
with LMO commit 849fa7a50dff ("R3k FPU ptrace() handling fixes."), and
then broken and fixed over and over again, until last time fixed with
commit 80cbfad79096 ("MIPS: Correct MIPS I FP context layout").
Consequently the values we see in FP32 core files or produce with the
`gcore' command are different from those obtained from the same FP
context of a live process, e.g. with a big-endian configuration these
live values:
(gdb) info registers float
f0: 0x4b5c6d7e flt: 14445950 dbl: 1.7446153562345001e-274
f1: 0x0718293a flt: 1.14473244e-34
f2: 0xc3d4e5f6 flt: -425.79657 dbl: -1.046160437414959e-233
f3: 0x8f90a1b2 flt: -1.42617791e-29
f4: 0x4c5d6e7f flt: 58046972 dbl: 1.1908587841220294e-269
f5: 0x08192a3b flt: 4.60914044e-34
f6: 0xc4d5e6f7 flt: -1711.21765 dbl: -6.2784661835068965e-306
f7: 0x8091a2b3 flt: -1.33745124e-38
f8: 0x45566778 flt: 3430.4668 dbl: 1.6530355595710607e-303
f9: 0x01122334 flt: 2.68412219e-38
f10: 0xcddeeff0 flt: -467533312 dbl: -2.1174864564135575e-262
f11: 0x899aabbc flt: -3.72356497e-33
f12: 0x46576879 flt: 13786.1182 dbl: 1.143296486773654e-298
f13: 0x02132435 flt: 1.08102453e-37
f14: 0xcedfe0f1 flt: -1.87803046e+09 dbl: -1.4399511533369862e-257
f15: 0x8a9bacbd flt: -1.4990934e-32
f16: 0x4758697a flt: 55401.4766 dbl: 7.8856820439568725e-294
f17: 0x03142536 flt: 4.3536007e-37
f18: 0xcfd0e1f2 flt: -7.00893696e+09 dbl: -9.7791926757340559e-253
f19: 0x8b9cadbe flt: -6.03504325e-32
f20: 0x48596a7b flt: 222633.922 dbl: 5.4255001483306113e-289
f21: 0x04152637 flt: 1.75324132e-36
f22: 0xc0d1e2f3 flt: -6.55895376 dbl: -6.6332401002310683e-248
f23: 0x8c9daebf flt: -2.42948516e-31
f24: 0x495a6b7c flt: 894647.75 dbl: 3.7244369058749787e-284
f25: 0x05162738 flt: 7.06016945e-36
f26: 0xc1d2e3f4 flt: -26.3613052 dbl: -4.4941535759306202e-243
f27: 0x8d9eafb0 flt: -9.77979703e-31
f28: 0x4a5b6c7d flt: 3595039.25 dbl: 2.5514593711161396e-279
f29: 0x06172839 flt: 2.84294945e-35
f30: 0xc2d3e4f5 flt: -105.947182 dbl: -3.035646690850097e-238
f31: 0x8e9fa0b1 flt: -3.93512664e-30
fcsr: 0x0
fir: 0xf30000
(gdb)
show up in a core file as these:
(gdb) info registers float
f0: 0x0718293a flt: 1.14473244e-34 dbl: nan
f1: 0x7ff80000 flt: nan
f2: 0x8f90a1b2 flt: -1.42617791e-29 dbl: nan
f3: 0x7ff80000 flt: nan
f4: 0x08192a3b flt: 4.60914044e-34 dbl: nan
f5: 0x7ff80000 flt: nan
f6: 0x8091a2b3 flt: -1.33745124e-38 dbl: nan
f7: 0x7ff80000 flt: nan
f8: 0x01122334 flt: 2.68412219e-38 dbl: nan
f9: 0x7ff80000 flt: nan
f10: 0x899aabbc flt: -3.72356497e-33 dbl: nan
f11: 0x7ff80000 flt: nan
f12: 0x02132435 flt: 1.08102453e-37 dbl: nan
f13: 0x7ff80000 flt: nan
f14: 0x8a9bacbd flt: -1.4990934e-32 dbl: nan
f15: 0x7ff80000 flt: nan
f16: 0x03142536 flt: 4.3536007e-37 dbl: nan
f17: 0x7ff80000 flt: nan
f18: 0x8b9cadbe flt: -6.03504325e-32 dbl: nan
f19: 0x7ff80000 flt: nan
f20: 0x04152637 flt: 1.75324132e-36 dbl: nan
f21: 0x7ff80000 flt: nan
f22: 0x8c9daebf flt: -2.42948516e-31 dbl: nan
f23: 0x7ff80000 flt: nan
f24: 0x05162738 flt: 7.06016945e-36 dbl: nan
f25: 0x7ff80000 flt: nan
f26: 0x8d9eafb0 flt: -9.77979703e-31 dbl: nan
f27: 0x7ff80000 flt: nan
f28: 0x06172839 flt: 2.84294945e-35 dbl: nan
f29: 0x7ff80000 flt: nan
f30: 0x8e9fa0b1 flt: -3.93512664e-30 dbl: nan
f31: 0x7ff80000 flt: nan
(gdb)
Notice how values from odd-numbered registers are shown in corresponding
even-numbered registers and how dummy 0x7ff80000 NaN values, which the
kernel places in unused slots, are reported in odd-numbered registers.
Correct our intepretation then, to match the kernel's. As it happens
the o32 FGR core file representation matches that used by the `ptrace'
PTRACE_GETFPREGS request, which means our 64-bit handlers can be readily
used, as they already correctly handle the differences between o32 FP32
mode vs n32/n64 representations.
Adjust comments accordingly throughout, in particular remove a reference
to the r3000/tx39 MIPS I processor peculiarity, long irrelevant.
Add a test case to verify correctness. Avoid GCC bugs and limitations
in the test case where possible; the test case still fails to build with
GCC 8 and the o32 FP64 mode (i.e. with `-mips32r2 -mfp64' options)
giving:
mips-fpregset-core.c: In function 'main':
mips-fpregset-core.c:66:3: error: inconsistent operand constraints in an 'asm'
asm (
^~~
(GCC PR target/85909), but that is not a concern for us as yet, because
as noted above we do not currently support the o32 FP64 mode anyway.
gdb/
* mips-linux-tdep.h (mips_supply_fpregset, mips_fill_fpregset):
Remove prototypes.
* mips-linux-nat.c (supply_fpregset): Always call
`mips64_supply_fpregset' rather than `mips_supply_fpregset'.
(fill_fpregset): Always call `mips64_fill_fpregset' rather than
`mips_fill_fpregset'.
* mips-linux-tdep.c (mips_supply_fpregset)
(mips_supply_fpregset_wrapper, mips_fill_fpregset)
(mips_fill_fpregset_wrapper): Remove functions.
(mips64_supply_fpregset, mips64_fill_fpregset): Update comments.
(mips_linux_fpregset): Remove variable.
(mips_linux_iterate_over_regset_sections): Use
`mips64_linux_fpregset' in place of `mips_linux_fpregset'.
(mips_linux_o32_sigframe_init): Remove comment.
gdb/testsuite/
* gdb.arch/mips-fpregset-core.exp: New test.
* gdb.arch/mips-fpregset-core.c: New test source.
The only reason remote_target::m_remote_state is a pointer is that
struct remote_state is incomplete when struct remote_target is
defined.
This commit thus moves struct remote_state (and its dependencies)
higher up and makes remote_target::m_remote_state an object instead of
a pointer.
gdb/ChangeLog:
2018-05-25 Pedro Alves <palves@redhat.com>
* remote.c (struct vCont_action_support, MAXTHREADLISTRESULTS)
(struct readahead_cache, struct packet_reg, struct
remote_arch_state, class remote_state): Move higher up in the
file.
(remote_target::m_remote_state): Now an object instead of a pointer.
(remote_target::get_remote_state): Adjust.
The func_command function is used to emulate the dbx 'func' command.
However, finding a stack frame based on function name might be a useful
feature, and so the core of func_command is now split out into a
separate function.
gdb/ChangeLog:
* stack.c (select_and_print_frame): Delete.
(struct function_bounds): Move struct within function.
(func_command): Most content moved into new function
find_frame_for_function, use new function, print result, add
function comment.
(find_frame_for_function): New function, now returns a result.
iterate_over_block_arg_vars is a void function, so does
not return 1 or 0.
print_frame_arg_vars tells it prints on STREAM,
so pass STREAM in the cb_data, not gdb_stdout.
gdb/ChangeLog
2018-05-24 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* stack.c (iterate_over_block_arg_vars): Fix comment.
(print_frame_arg_vars): Pass stream in cb_data, not gdb_stdout.
This updates some help text in record.c to conform to GNU standards.
I also added a "Usage" line to "record save".
2018-04-29 Tom Tromey <tom@tromey.com>
* record.c (_initialize_record): Update help text.
This updates some help text in linux-fork.c to conform to GNU
standards.
2018-04-29 Tom Tromey <tom@tromey.com>
* linux-fork.c (_initialize_linux_fork): Update help text.
This updates the help text in record-btrace.c to conform to GNU
standards.
2018-04-29 Tom Tromey <tom@tromey.com>
* record-btrace.c (_initialize_record_btrace): Update help text.
This changes the help text of a couple of commands in tracepoint.c to
follow the GNU style.
ChangeLog
2018-04-29 Tom Tromey <tom@tromey.com>
* tracepoint.c (_initialize_tracepoint): Update help text.
testsuite/ChangeLog
2018-04-30 Tom Tromey <tom@tromey.com>
* gdb.trace/tfind.exp: Update help tests.
This changes some help text in disasm.c to follow the GNU style.
2018-04-29 Tom Tromey <tom@tromey.com>
* disasm.c (_initialize_disasm): Update help text.
This updates the usage text for the "jump" command to conform to the
GNU style.
2018-04-29 Tom Tromey <tom@tromey.com>
* infcmd.c (_initialize_infcmd): Update help text.
This updates some text in dcache.c to follow GNU standards.
Here, I found a couple of spots needing an update.
2018-04-29 Tom Tromey <tom@tromey.com>
* dcache.c (dcache_info_1): Update usage text.
(_initialize_dcache): Update help text.
This updates some help strings in the TUI to more closely follow GNU
standards. In this case I chose to reuse some existing "usage" macros
in the help text. Also, I found that XDBWIN_HEIGHT_USAGE is unused,
so I removed it.
ChangeLog
2018-04-29 Tom Tromey <tom@tromey.com>
* tui/tui-layout.c (_initialize_tui_layout): Update help text.
* tui/tui-win.c (WIN_HEIGHT_USAGE, FOCUS_USAGE): Update
(XDBWIN_HEIGHT_USAGE): Remove.
(_initialize_tui_win): Use macros. Update help text.
This changes memattr.c to use the GNU style for help strings.
2018-04-29 Tom Tromey <tom@tromey.com>
* memattr.c (_initialize_mem): Update help string.
This updates some help strings in corefile.c and gcore.c.
2018-04-27 Tom Tromey <tom@tromey.com>
* corefile.c (_initialize_core): Update help string.
* gcore.c (_initialize_gcore): Update help string.
This changes help strings in skip.c to follow the GNU style.
2018-04-27 Tom Tromey <tom@tromey.com>
* skip.c (_initialize_step_skip): Update help strings.
This changes inferior.c to add Usage lines for all commands, and to
change how "metasyntactic variables" are written to conform to GNU
style.
While doing this I noticed that the manual doesn't document the
argument to "info inferiors", so I've added that as well.
ChangeLog
2018-04-27 Tom Tromey <tom@tromey.com>
* inferior.c (initialize_inferiors): Update help strings.
doc/ChangeLog
2018-04-27 Tom Tromey <tom@tromey.com>
* gdb.texinfo (Inferiors and Programs): Document argument to "info
inferiors".
PR gdb/23203 reports 'bt full' causing the currently selected frame to
change, this issue is fixed in this commit.
Add a new class scoped_restore_selected_frame that saves and restores
the selected frame. Make use of this in print_frame_local_vars to
restore the selected frame on exit.
gdb/ChangeLog:
PR gdb/23203
* frame.c
(scoped_restore_selected_frame::scoped_restore_selected_frame):
Define.
(scoped_restore_selected_frame::~scoped_restore_selected_frame):
Define.
* frame.h (class scoped_restore_selected_frame): New class.
* stack.c (print_frame_local_vars): Remove catching and rethrowing
of any exception, use scoped_restore_selected_frame to restore the
frame instead.
gdb/testsuite/ChangeLog:
PR gdb/23203
* gdb.base/bt-selected-frame.c: New file.
* gdb.base/bt-selected-frame.exp: New file.
* lib/gdb.exp (get_current_frame_number): New function.
Complementing commit 280ca31f4d ("Add test for fetching TLS from
core file") extend gdb.threads/tls-core.exp with an OS-generated dump
where supported.
This verifies not only that our core dump interpreter is consistent
with our producer, but that it matches the OS verified as well,
avoiding a possible case where our interpreter would be bug-compatible
with our producer but not the OS and it would go unnoticed in testing.
This results in:
PASS: gdb.threads/tls-core.exp: native: load core file
PASS: gdb.threads/tls-core.exp: native: print thread-local storage variable
PASS: gdb.threads/tls-core.exp: gcore: load core file
PASS: gdb.threads/tls-core.exp: gcore: print thread-local storage variable
with local testing and:
UNSUPPORTED: gdb.threads/tls-core.exp: native: load core file
UNSUPPORTED: gdb.threads/tls-core.exp: native: print thread-local storage variable
PASS: gdb.threads/tls-core.exp: gcore: load core file
PASS: gdb.threads/tls-core.exp: gcore: print thread-local storage variable
with remote testing, or for testing on ports that don't supports
cores.
gdb/testsuite/ChangeLog:
2018-05-24 Maciej W. Rozycki <macro@mips.com>
Pedro Alves <palves@redhat.com>
* gdb.threads/tls-core.c: Include <stdlib.h>
(thread_proc): Call `abort'.
* gdb.threads/tls-core.exp: Generate a core with core_find too.
(tls_core_test): New procedure, bits factored out from ...
(top level): ... here. Test both native cores and gcore cores.
Fixes:
In file included from ../../src/gdb/darwin-nat.c:63:0:
../../src/gdb/darwin-nat.h:28:8: error: 'virtual void darwin_nat_target::create_inferior(const char*, const string&, char**, int)' can be marked override [-Werror=suggest-override]
void create_inferior (const char *exec_file,
^
gdb/ChangeLog:
2018-05-24 Pedro Alves <palves@redhat.com>
* darwin-nat.h (darwin_nat_target::create_inferior): Mark with
override.
struct complaints now just holds a single enum value, so remove it and
symfile_complaint_book and replace it with a global variable.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (struct complaints): Remove.
(symfile_complaint_book): Remove.
(series): New global.
(complaint_internal): Update.
(clear_complaints): Update.
At this point, struct complain is just holds a key, a value, and a
"next" pointer to form a linked list. It's simpler to replace this
with an unordered map.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (counters): New global.
(struct complain): Remove.
(struct complaints) <root>: Remove.
(complaint_sentinel): Remove.
(symfile_complaint_book): Update.
(find_complaint) Remove.
(complaint_internal, clear_complaints): Update.
gdb/testsuite/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* gdb.gdb/complaints.exp (test_initial_complaints): Simplify.
The file and line handling in complaints.c wasn't used once
internal_complaint was removed. This patch removes all the related
code.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (struct complain) <file, line>: Remove.
(find_complaint): Remove file, line parameters.
(complaint_internal): Update.
vcomplaint now has a single caller, so merge it with that caller.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (vcomplaint): Remove.
(complaint_internal) Merge in contents of vcomplaint.
Now that there's only a single reason for a complaint to be emitted,
this removes "struct explanation" and changes vcomplaint to emit the
desired messages directly.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (struct complaints) <explanation>: Remove.
(symfile_explanations): Remove.
(symfile_complaint_book): Update.
(vcomplaint): Update.
(struct explanation): Remove.
After the previous patch, the "noisy" parameter to clear_complaints is
no longer used, so this patch removes it.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (clear_complaints): Remove "noisy" parameter.
* complaints.h (clear_complaints): Update.
* symfile.c (syms_from_objfile_1, finish_new_objfile)
(reread_symbols): Update.
gdb/testsuite/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* gdb.gdb/complaints.exp (test_empty_complaints): Update.
I couldn't find a way to get complaints to use a couple of cases, and
the difference between the actual printed output for these cases was
minimal anyway. So, this patch removes a couple of constants from
complaint_series, plus the associated code.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (enum complaint_series): Remove FIRST_MESSAGE,
SUBSEQUENT_MESSAGE.
(vcomplaint, clear_complaints): Update.
(symfile_explanations): Remove some messages.
gdb/testsuite/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* gdb.gdb/complaints.exp (test_serial_complaints): Remove.
(test_short_complaints): Update.
I happened to notice that gdb has both complaint_internal and
internal_complaint. The latter is unused, so this patch removes it.
gdb/ChangeLog
2018-05-23 Tom Tromey <tom@tromey.com>
* complaints.c (internal_complaint): Remove.
* complaints.h (internal_complaint): Remove.
Currently, the function used by gdbserver to parse integers from
received File I/O commands will detect overflow and fail for any value
over 0xfffffff. Among other things, this has the effect of limiting
the file offsets for reading or writing to about 268MB which can be
insufficient for particularly large libraries.
This change allows the parsing of integers up to the true maximum
positive value of 0x7fffffff, increasing the file size limit to about
2GB.
gdb/gdbserver/ChangeLog:
2018-05-23 Erik Kurzinger <ekurzinger@nvidia.com>
PR server/23198
* hostio.c (require_int): Do not report overflow for integers
between 0xfffffff and 0x7fffffff.
This fixes gdb.base/remote.exp regressions caused by the previous
commit to the testcase, when tested with
--target_board=native-extended-gdbserver. For example:
...
show remote memory-write-packet-size
The memory-write-packet-size is 0 (default). Packets are limited to 16383 bytes.
(gdb) FAIL: gdb.base/remote.exp: write-packet default
...
With that board, GDB connects to GDBserver at gdb_start time, so GDB
is showing the actual remote/gdbserver packet size limits.
Fix it using the usual "disconnect" pattern. While at it, there's no
need to start GDB before compiling the testcase.
gdb/testsuite/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* gdb.base/remote.exp: Only gdb_start after compiling the
testcase. Issue "disconnect" before testing "set remote" command
defaults. Issue clean_restart before running to main.
Make `i' defined within `i387_collect_xsave' unsigned, removing a
`-Werror=strict-overflow' compilation error:
.../gdb/i387-tdep.c: In function 'void i387_collect_xsave(const regcache*, int, void*, int)':
.../gdb/i387-tdep.c:1348:1: error: assuming signed overflow does not occur when assuming that (X + c) < X is always false [-Werror=strict-overflow]
i387_collect_xsave (const struct regcache *regcache, int regnum,
^
cc1plus: all warnings being treated as errors
Makefile:1610: recipe for target 'i387-tdep.o' failed
make: *** [i387-tdep.o] Error 1
seen with GCC 5.4.0, a commit 8ee22052f6 ("gdb/x86: Handle kernels
using compact xsave format") regression. While `regnum' can be -1 on
entry to the function, to mean all registers, `i' is only used with
non-negative register numbers.
gdb/
* i387-tdep.c (i387_collect_xsave): Make `i' unsigned.
Fix an issue with `gdbserver' on big-endian n64 MIPS targets, where
$dspctl is 32-bit while the `ptrace' transfer data type is 64-bit.
Such register data is held in the low order 32 bits of the 64-bit data
quantity exchanged with the buffer used by `fetch_register' and
`store_register', however `supply_register' and `collect_register'
access the same data as a 32-bit quantity. Consequently the register is
presented and written as all-zeros held in the most-significant part of
the big-endian 64-bit data quantity represented in the buffer:
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 0000000000000001 0000000000000000
a0 a1 a2 a3
R4 00000001200212b0 0000000000000000 0000000000000021 000000012001a260
a4 a5 a6 a7
R8 000000012001a260 0000000000000004 800000010c60c000 fffffffffffffff8
t0 t1 t2 t3
R12 0000000000000000 000000fff7edab68 0000000000000001 0000000000000000
s0 s1 s2 s3
R16 000000fff7ee2068 0000000120008b80 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 000000000052e5c8 000000000052f008 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 00000001200027c0 0000000000000000 0000000000000000
gp sp s8 ra
R28 00000001200212b0 000000ffffffc850 000000ffffffc850 0000000120005ee8
status lo hi badvaddr
0000000000109cf3 0000000000943efe 000000000000000e 000000012001a008
cause pc
0000000000800024 0000000120005ee8
fcsr fir hi1 lo1
0e800000 00f30000 0000000000000000 0101010101010101
hi2 lo2 hi3 lo3
0202020202020202 0303030303030303 0404040404040404 0505050505050505
dspctl restart
00000000 0000000000000000
(gdb)
Correct this problem then by using the `mips_supply_register'
`mips_collect_register' accessors for 32-bit registers where the
`ptrace' data type is 64-bit. These accessors already operate on 32-bit
data quantities held in 64-bit containers:
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 0000000000000001 0000000000000000
a0 a1 a2 a3
R4 00000001200212b0 0000000000000000 0000000000000021 000000012001a260
a4 a5 a6 a7
R8 000000012001a260 0000000000000004 800000010d82e900 fffffffffffffff8
t0 t1 t2 t3
R12 0000000000000000 000000fff7edab68 0000000000000001 0000000000000000
s0 s1 s2 s3
R16 000000fff7ee2068 0000000120008b80 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 000000000052e5c8 000000000052f008 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 00000001200027c0 0000000000000000 0000000000000000
gp sp s8 ra
R28 00000001200212b0 000000ffffffc850 000000ffffffc850 0000000120005ee8
status lo hi badvaddr
0000000000109cf3 0000000000943efe 000000000000000e 000000012001a008
cause pc
0000000000800024 0000000120005ee8
fcsr fir hi1 lo1
0e800000 00f30000 0000000000000000 0101010101010101
hi2 lo2 hi3 lo3
0202020202020202 0303030303030303 0404040404040404 0505050505050505
dspctl restart
55aa33cc 0000000000000000
(gdb)
gdb/gdbserver/
* linux-mips-low.c [HAVE_PTRACE_GETREGS] (mips_collect_register)
(mips_supply_register): Move outside HAVE_PTRACE_GETREGS.
(mips_collect_ptrace_register, mips_supply_ptrace_register): New
functions.
(the_low_target): Wire them.
'struct remote_state' today contains per-connection state, however
there's only a single global instance of that type. In order to
support multiple connections, we must have one such object per
connection.
Thus this patch eliminates the 'remote_state' global in favor of
having a remote_state instance per remote_target instance.
The get_remote_state free function is eliminated as well, by making it
a remote_target method instead.
The patch then fixes the fallout by making all free functions that
refer to get_remote_state() directly or indirectly be methods of
remote_target too.
Likewise, remote-fileio.c and remote-notif.c routines are
parameterized with a remote_target pointer too, so they can call into
the right remote_target instance.
References to the global 'get_remote_state ()->remote_desc' to tell
whether the remote target is open (!= nullptr) must be replaced with
something else:
- Command implementations use a new get_current_remote_target free
function.
- remote_target::open_1 checks the exception type instead.
Finally, remote_target and extended_remote_target are made
heap-allocated targets. As with the earlier core target patches, it
still won't be possible to have more than one remote_target instance
in practice, but this puts us closer.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote-fileio.c (remote_fileio_reply, remote_fileio_ioerror)
(remote_fileio_badfd, remote_fileio_return_errno)
(remote_fileio_return_success, remote_fileio_func_open)
(remote_fileio_func_open, remote_fileio_func_close)
(remote_fileio_func_read, remote_fileio_func_write)
(remote_fileio_func_lseek, remote_fileio_func_rename)
(remote_fileio_func_unlink, remote_fileio_func_stat)
(remote_fileio_func_fstat, remote_fileio_func_gettimeofday)
(remote_fileio_func_isatty, remote_fileio_func_system): Add
remote_target parameter.
(remote_fio_func_map) <func>: Add remote_target parameter.
(do_remote_fileio_request, remote_fileio_request):
* remote-fileio.h (remote_fileio_request):
* remote-notif.c (remote_notif_ack, remote_notif_parse, ): Add
remote_target parameter.
(remote_notif_process, handle_notification): Adjust to pass down
the remote.
(remote_notif_state_allocate): Add remote_target parameter. Save
it.
* remote-notif.h (struct remote_target): Forward declare.
(struct notif_client) <parse, ack, can_get_pending_events>: Add
remote_target parameter.
(struct remote_notif_state) <remote>: New field.
(remote_notif_ack, remote_notif_parse): Add remote_target
parameter.
(remote_notif_state_allocate, remote_notif_state_allocate): Add
remote_target parameter.
* remote.c (OPAQUETHREADBYTES, threadref, gdb_ext_thread_info)
(threads_listing_context, rmt_thread_action, protocol_feature)
(packet_reg, stop_reply, stop_reply_p, enum packet_support)
(packet_result, struct threads_listing_context, remote_state):
Move definitions and declarations higher up.
(remote_target) <~remote_target>: Declare.
(remote_download_command_source, remote_file_put, remote_file_get)
(remote_file_delete, remote_hostio_pread, remote_hostio_pwrite)
(remote_hostio_pread_vFile, remote_hostio_send_command)
(remote_hostio_set_filesystem, remote_hostio_open)
(remote_hostio_close, remote_hostio_unlink, remote_state)
(get_remote_state, get_remote_packet_size, get_memory_packet_size)
(get_memory_write_packet_size, get_memory_read_packet_size)
(append_pending_thread_resumptions, remote_detach_1)
(append_resumption, remote_resume_with_vcont)
(add_current_inferior_and_thread, wait_ns, wait_as)
(process_stop_reply, remote_notice_new_inferior)
(process_initial_stop_replies, remote_add_thread)
(btrace_sync_conf, remote_btrace_maybe_reopen)
(remove_new_fork_children, kill_new_fork_children)
(discard_pending_stop_replies, stop_reply_queue_length)
(check_pending_events_prevent_wildcard_vcont)
(discard_pending_stop_replies_in_queue, stop_reply)
(remote_notif_remove_queued_reply, stop_reply *queued_stop_reply)
(peek_stop_reply, remote_parse_stop_reply, remote_stop_ns)
(remote_interrupt_as, remote_interrupt_ns)
(remote_get_noisy_reply, remote_query_attached)
(remote_add_inferior, remote_current_thread, get_current_thread)
(set_thread, set_general_thread, set_continue_thread)
(set_general_process, write_ptid)
(remote_unpack_thread_info_response, remote_get_threadinfo)
(parse_threadlist_response, remote_get_threadlist)
(remote_threadlist_iterator, remote_get_threads_with_ql)
(remote_get_threads_with_qxfer)
(remote_get_threads_with_qthreadinfo, extended_remote_restart)
(get_offsets, remote_check_symbols, remote_supported_packet)
(remote_query_supported, remote_packet_size)
(remote_serial_quit_handler, remote_detach_pid)
(remote_vcont_probe, remote_resume_with_hc)
(send_interrupt_sequence, interrupt_query)
(remote_notif_get_pending_events, fetch_register_using_p)
(send_g_packet, process_g_packet, fetch_registers_using_g)
(store_register_using_P, store_registers_using_G)
(set_remote_traceframe, check_binary_download)
(remote_write_bytes_aux, remote_write_bytes, remote_read_bytes_1)
(remote_xfer_live_readonly_partial, remote_read_bytes)
(remote_send_printf, remote_flash_write, readchar)
(remote_serial_write, putpkt, putpkt_binary, skip_frame)
(read_frame, getpkt, getpkt_or_notif_sane_1, getpkt_sane)
(getpkt_or_notif_sane, remote_vkill, remote_kill_k)
(extended_remote_disable_randomization, extended_remote_run)
(send_environment_packet, extended_remote_environment_support)
(extended_remote_set_inferior_cwd, remote_write_qxfer)
(remote_read_qxfer, push_stop_reply, vcont_r_supported)
(packet_command): Now methods of ...
(remote_target): ... this class.
(m_remote_state) <remote_target>: New field.
(struct remote_state) <stop_reply_queue,
remote_async_inferior_event_token, wait_forever_enabled_p>: New
fields.
(remote_state::remote_state): Allocate stop_reply_queue.
(remote_state): Delete global.
(get_remote_state_raw): Delete.
(remote_target::get_remote_state): Allocate m_remote_state on
demand.
(get_current_remote_target): New.
(remote_ops, extended_remote_ops): Delete.
(wait_forever_enabled_p, remote_async_inferior_event_token):
Delete, moved to struct remote_state.
(remote_target::close): Delete self. Destruction bits split to
...
(remote_target::~remote_target): ... this.
(show_memory_packet_size): Adjust to use
get_current_remote_target.
(struct protocol_feature) <func>: Add remote_target parameter.
All callers adjusted.
(curr_quit_handler_target): New.
(remote_serial_quit_handler): Reimplement.
(remote_target::open_1): Adjust to use get_current_remote_target.
Heap-allocate remote_target/extended_remote_target instances.
(vcont_builder::vcont_builder): Add remote_target parameter, and
save it in m_remote. All callers adjusted.
(vcont_builder::m_remote): New field.
(vcont_builder::restart, vcont_builder::flush)
(vcont_builder::push_action): Use it.
(remote_target::commit_resume): Use it.
(struct queue_iter_param) <remote>: New field.
(remote_target::remove_new_fork_children): Fill in 'remote' field.
(check_pending_event_prevents_wildcard_vcont_callback_data): New.
(check_pending_event_prevents_wildcard_vcont_callback)
(remote_target::check_pending_events_prevent_wildcard_vcont)
(remote_target::discard_pending_stop_replies)
(remote_target::discard_pending_stop_replies_in_queue)
(remote_target::remote_notif_remove_queued_reply): Fill in
'remote' field.
(remote_notif_get_pending_events): New.
(remote_target::readchar, remote_target::remote_serial_write):
Save/restore curr_quit_handler_target.
(putpkt): New.
(kill_new_fork_children): Fill in 'remote' field.
(packet_command): Use get_current_remote_target, defer to
remote_target method of same name.
(scoped_remote_fd::scoped_remote_fd): Add 'remote_target'
parameter, and save it in m_remote. All callers adjusted.
(scoped_remote_fd::release): Use m_remote.
(scoped_remote_fd::m_remote): New field.
(remote_file_put, remote_file_get, remote_file_delete): Use
get_current_remote_target, defer to remote_target method of same
name.
(remote_btrace_reset): Add remote_state paremeter. Update all
callers.
(remote_async_inferior_event_handler). Pass down 'data'.
(remote_new_objfile): Use get_current_remote_target.
(remote_target::vcont_r_supported): New.
(set_range_stepping): Use get_current_remote_target and
remote_target::vcont_r_supported.
(_initialize_remote): Don't allocate 'remote_state' and
'stop_reply_queue' globals.
* remote.h (struct remote_target): Forward declare.
(getpkt, putpkt, remote_notif_get_pending_events): Add
'remote_target' parameter.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (vcont_builder): Now a class. Make all data members
private.
(vcont_builder) <vcont_builder, restart, flush, push_action>:
Declare methods.
(vcont_builder_restart): Rename to ...
(vcont_builder::restart): ... this.
(vcont_builder_flush): Rename to ...
(vcont_builder::flush): ... this.
(vcont_builder_push_action): Rename to ...
(vcont_builder::push_action): ... this.
(remote_target::commit_resume): Adjust.
Currently "show remote memory-write-packet-size" says that the packet
size is limited to whatever is stored in the remote_state global, even
if not connected to a target.
When we get to support multiple instances of remote targets, there
won't be a remote_state global anymore, so that must be replaced by
something else.
Since it doesn't make sense to print the limit of the packet size of a
non-existing connection, this patch makes us say that the limit will
be further reduced when we connect.
The text is taken from the command's online help, which says:
"The actual limit is further reduced dependent on the target."
Note that a value of "0" is special, as per "help set remote
memory-write-packet-size":
~~~
Specify the number of bytes in a packet or 0 (zero) for the
default packet size.
~~~
I've tweaked "show remote memory-write-packet-size" to include
"(default)" in the output in that case, like this:
(gdb) show remote memory-write-packet-size
The memory-write-packet-size is 0 (default). The actual limit will be further reduced dependent on the target.
While working on this, I noticed that an explicit "set remote
write-packet-size 0" does not makes GDB go back to the exact same
state as the default state when GDB starts up:
(gdb) show remote memory-write-packet-size
The memory-write-packet-size is 0. [...]
^^
(gdb) set remote memory-write-packet-size 0
(gdb) show remote memory-write-packet-size
The memory-write-packet-size is 16384. [...]
^^^^^
The "16384" number comes from DEFAULT_MAX_MEMORY_PACKET_SIZE.
This happens because git commit a5c0808e22 ("gdb: remove packet size
limit") at
<https://sourceware.org/ml/gdb-patches/2015-08/msg00743.html>, added
this:
/* So that the query shows the correct value. */
if (size <= 0)
size = DEFAULT_MAX_MEMORY_PACKET_SIZE;
to set_memory_packet_size, but despite what the comment suggests, that
also has the side-effect of recording DEFAULT_MAX_MEMORY_PACKET_SIZE
in config->size.
Finally, DEFAULT_MAX_MEMORY_PACKET_SIZE only makes sense for "set
remote memory-write-packet-size fixed", so I've renamed it
accordingly, to make it a little bit clearer.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (DEFAULT_MAX_MEMORY_PACKET_SIZE): Rename to ...
(DEFAULT_MAX_MEMORY_PACKET_SIZE_FIXED): ... this.
(get_fixed_memory_packet_size): New.
(get_memory_packet_size): Use it.
(set_memory_packet_size): Don't override the config size with
DEFAULT_MAX_MEMORY_PACKET_SIZE.
(show_memory_packet_size): Use get_fixed_memory_packet_size.
Don't refer to get_memory_packet_size if not connected to a remote
target. Show "(default)" if configured size is 0.
gdb/testsuite/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* gdb.base/remote.exp: Adjust expected output of "show remote
memory-write-packet-size". Add tests for "set remote
memory-write-packet-size 0" and "set remote
memory-write-packet-size fixed/limit".
This helps because discard_pending_stop_replies will later become a
method of remote_target. Otherwise, when we have multiple instances
of remote_target, we'd have to make discard_pending_stop_replies find
the inferior's target_ops, and upcast it to remote_target (if indeed a
remote) to find the pending stop replies queue to clear.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (remote_target::mourn_inferior): Move
discard_pending_stop_replies call here from ...
(_initialize_remote): ... here.
The set_general_process call in compare_sections_command isn't
actually needed. remote_target::verify_memory and
remote_target::xfer_partial already handle making sure the remote is
pointing at the right process or thread.
Getting this out of the way helps a bit with further elimination of
the remote_state global, because we have to handle the case of a user
invoking the command even if not connect to a remote target.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (compare_section_command): Remove set_general_process
call.
The previous patch made the map store pointers to remote_arch_state
instead of objects directly, simply because struct remote_arch_state
is still incomplete where struct remote_state is declared. This patch
thus moves the remote_arch_state declaration higher up in the file,
and makes the map store remote_arch_state objects directly instead of
pointers to objects.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (struct packet_reg, struct remote_arch_state):
Move higher up in the file.
(remote_state) <m_arch_states>: Store remote_arch_state values
instead of remote_arch_state pointers.
(remote_state::get_remote_arch_state): Adjust.
Currently, we associate gdbarch-related remote protocol state on a
per-gdbarch data object. Things like the size of the g/G packet, and
the max remote packet size. If we'll support being connected to
different remote servers at the same time, then we need to cope with
each having their own packet sizes, even if they are each debugging
programs of the same architecture. I.e., a single instance of
remote_arch_state per arch is not sufficient.
This patch moves the remote_arch_state object to a map of
gdbarch-to-remote_arch_state saved in the remote_state structure.
Usually there will only be one entry in the map, though we may see
more with stubs that support multi-process and/or archs with multiple
ABIs (e.g, one remote_arch_state for 64-bit inferiors and another for
32-bit inferiors).
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c: Include <unordered_map>.
(remote_state): Now a class.
(remote_state) <get_remote_arch_state>: Declare method.
<get_remote_arch_state>: New field.
(remote_arch_state) <remote_arch_state>: Declare ctor.
<regs>: Now a unique_ptr.
(remote_gdbarch_data_handle): Delete.
(get_remote_arch_state): Delete.
(remote_state::get_remote_arch_state): New.
(get_remote_state): Adjust to call remote_state's
get_remote_arch_state method.
(init_remote_state): Delete, bits factored out to ...
(remote_arch_state::remote_arch_state): ... this new method.
(get_remote_packet_size, get_memory_packet_size)
(process_g_packet, remote_target::fetch_registers)
(remote_target::prepare_to_store, store_registers_using_G)
(remote_target::store_registers, remote_target::get_trace_status):
Adjust to call remote_state's method.
(_initialize_remote): Remove reference to
remote_gdbarch_data_handle.
The idea here is eliminate the get_remote_state calls from within
readahead_cache_invalidate, readahead_cache_invalidate_fd,
remote_hostio_pread_from_cache by making those functions be class
methods instead. Later on we'll have one readahead_cache instance per
remote connection, and this change makes that easier.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (struct readahead_cache) <invalidate, invalidate_fd,
pread>: New method declarations.
(remote_target::open_1): Adjust.
(readahead_cache_invalidate): Rename to ...
(readahead_cache::invalidate): ... this, and adjust to be a class
method.
(readahead_cache_invalidate_fd): Rename to ...
(readahead_cache::invalidate_fd): ... this, and adjust to be a
class method.
(remote_hostio_pwrite): Adjust.
(remote_hostio_pread_from_cache): Rename to ...
(readahead_cache::pread): ... this, and adjust to be a class
method.
(remote_hostio_close): Adjust.
A bit of C++ification. Also plugs a few leaks, since currently
nothing is freeing a few fields of remote_state. They're now freed in
the added destructor.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
(struct vCont_action_support): Use bool and initialize all fields.
(struct readahead_cache): Initialize all fields.
(remote_state): Use bool and initialize all fields.
(remote_state::remote_state, remote_state::~remote_state): New.
(new_remote_state): Delete.
(_initialize_remote): Use new to allocate remote_state.
Factor out cp_ident_is_alpha/cp_ident_is_alnum out of
gdb/cp-name-parser.y and use it in the C/C++ expression parser too.
New test included.
gdb/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
張俊芝 <zjz@zjz.name>
PR gdb/22973
* c-exp.y: Include "c-support.h".
(parse_number, c_parse_escape, lex_one_token): Use TOLOWER instead
of tolower. Use c_ident_is_alpha to scan names.
* c-lang.c: Include "c-support.h".
(convert_ucn, convert_octal, convert_hex, convert_escape): Use
ISXDIGIT instead of isxdigit and ISDIGIT instead of isdigit.
* c-support.h: New file, with bits factored out from ...
* cp-name-parser.y: ... this file.
Include "c-support.h".
(cp_ident_is_alpha, cp_ident_is_alnum): Deleted, moved to
c-support.h and renamed.
(symbol_end, yylex): Adjust.
gdb/testsuite/ChangeLog:
2018-05-22 Pedro Alves <palves@redhat.com>
PR gdb/22973
* gdb.base/utf8-identifiers.c: New file.
* gdb.base/utf8-identifiers.exp: New file.
Currently the ppc linux core file target doesn't return target
descriptions with the lager FPSCR introduced in isa205.
This patch changes the core file target so that the auxv is read from
the core file to determine the size of FPSCR, so that the appropriate
target description is selected.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* arch/ppc-linux-common.c (ppc_linux_has_isa205): Change the
parameter type to CORE_ADDR.
* arch/ppc-linux-common.h (ppc_linux_has_isa205): Change the
parameter type in declaration to CORE_ADDR.
* ppc-linux-tdep.c (ppc_linux_core_read_description): Call
target_auxv_search to get AT_HWCAP and use the result to get the
target description.
* ppc-linux-nat.c (ppc_linux_get_hwcap): Change the return type
to CORE_ADDR. Remove the cast of the return value to unsigned
long. Fix error predicate of target_auxv_search.
(ppc_linux_nat_target::read_description): Change the type of the
hwcap variable to CORE_ADDR.
gdb/testsuite/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* gdb.arch/powerpc-fpscr-gcore.exp: New file.
Previously, decimal floating point pseudoregisters were always included
in the target if it had a floating point unit.
This patch changes this to only include them if the target description
indicates that they are present, i.e. if the FPSCR register has more
than 32 bits.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* rs6000-tdep.c (rs6000_gdbarch_init): Assign 1 to have_dfp only
if the size of fpscr is larger than 32 bits.
The functions used by the VSX regset to collect and supply registers
from core files where incorrect. This patch changes the regset to use
the standard regset collect/supply functions to fix this. The native
target is also changed to use the same regset.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* ppc-linux-tdep.c (ppc_linux_vsxregset): New function.
(ppc32_linux_vsxregmap): New global.
(ppc32_linux_vsxregset): Initialize with ppc32_linux_vsxregmap,
regcache_supply_regset, and regcache_collect_regset.
* ppc-linux-tdep.h (ppc_linux_vsxregset): Declare.
* ppc-linux-nat.c (supply_vsxregset, fill_vsxregset): Remove.
(fetch_vsx_register, store_vsx_register): Remove.
(fetch_vsx_registers): Add regno parameter. Get regset using
ppc_linux_vsxregset. Use regset to supply registers.
(store_vsx_registers): Add regno parameter. Get regset using
ppc_linux_vsxregset. Use regset to collect registers.
(fetch_register): Call fetch_vsx_registers instead of
fetch_vsx_register.
(store_register): Call store_vsx_registers instead of
store_vsx_register.
(fetch_ppc_registers): Call fetch_vsx_registers with -1 for the
new regno parameter.
(store_ppc_registers): Call store_vsx_registers with -1 for the
new regno parameter.
* rs6000-tdep.c (ppc_vsx_support_p, ppc_supply_vsxreget)
(ppc_collect_vsxregset): Remove.
gdb/testsuite/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* gdb.arch/powerpc-vsx-gcore.exp: New file.
The 4-byte VSCR register is found inside a 16-byte field in the regset
returned by ptrace and in core files. The position of VSCR depends on
the endianess of the target, which was previously assumed to be
big-endian for the purpose of getting VSCR. This patch removes this
assumption to fix access to VSCR in little-endian mode.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* ppc-tdep.h (struct ppc_reg_offsets): Remove vector register
offset fields.
* ppc-fbsd-tdep.c (ppc32_fbsd_reg_offsets): Remove initializers
for vector register offset fields.
(ppc64_fbsd_reg_offsets): Likewise.
* ppc-nbsd-tdep.c (_initialize_ppcnbsd_tdep): Remove assignment
to vector register offset fields.
* ppc-obsd-tdep.c (_initialize_ppcnbsd_tdep): Remove assignment
to vector register offset fields.
* ppc-obsd-nat.c (_initialize_ppcobsd_nat): Remove assignment to
vector register offset fields.
* rs6000-aix-tdep.c (rs6000_aix32_reg_offsets): Remove
initializers for vector register offset fields.
(rs6000_aix64_reg_offsets): Likewise.
* rs6000-tdep.c (ppc_vrreg_offset): Remove.
(ppc_supply_vrregset): Remove.
(ppc_collect_vrregset): Remove.
* ppc-linux-tdep.c (ppc_linux_collect_vrregset): New function.
(ppc_linux_vrregset) : New function.
(ppc32_le_linux_vrregmap, ppc32_be_linux_vrregmap)
(ppc32_le_linux_vrregset, ppc32_be_linux_vrregset): New globals.
(ppc32_linux_vrregset): Remove.
(ppc_linux_iterate_over_regset_sections): Call ppc_linux_vrregset
and use result instead of ppc32_linux_vrregset.
(ppc32_linux_reg_offsets): Remove initializers for vector register
offset fields.
(ppc64_linux_reg_offsets): Likewise.
* ppc-linux-tdep.h (ppc_linux_vrregset): New declaration.
* ppc-linux-nat.c: Include regset.h.
(gdb_vrregset_t): Adjust comment to account for little-endian
mode.
(supply_vrregset, fill_vrregset): Remove.
(fetch_altivec_register, store_altivec_register): Remove.
(fetch_altivec_registers): Add regno parameter. Get regset using
ppc_linux_vrregset. Use regset to supply registers.
(store_altivec_registers): Add regno parameter. Get regset using
ppc_linux_vrregset. Use regset to collect registers.
(fetch_register): Call fetch_altivec_registers instead of
fetch_altivec_register.
(store_register): Call store_altivec_registers instead of
store_altivec_register.
(fetch_ppc_registers): Call fetch_altivec_registers with -1 for
the new regno parameter.
(store_ppc_registers): Call store_altivec_registers with -1 for
the new regno parameter.
gdb/gdbserver/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* linux-ppc-low.c (ppc_fill_vrregset): Add vscr_offset variable.
Set vscr_offset to 0 in little-endian mode and 12 in big-endian
mode. Call collect_register_by_name with vscr using
vscr_offset. Zero-pad vscr and vrsave fields in collector buffer.
(ppc_store_vrregset): Add and set vscr_offset variable as in
ppc_fill_vrregset. Call supply_register_by_name with vscr using
vscr_offset.
This patch defines constants for the sizes of the two vector
regsets (vector-scalar registers and regular vector registers).
The native, gdbserver and core file targets are changed to use these
constants.
The Linux ptrace calls return (or read) a smaller regset than the one
found in core files for vector registers, because ptrace uses a single
4-byte quantity for vrsave at the end of the regset, while the
core-file regset uses a full 16-byte field for vrsave. For simplicity,
the larger size is used in both cases, and so a buffer with 12 unused
additional bytes is passed to ptrace in the native target.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_VRREGSET)
(PPC_LINUX_SIZEOF_VSXREGSET): Define.
* ppc-linux-nat.c (SIZEOF_VSXREGS, SIZEOF_VRREGS): Remove.
(gdb_vrregset_t): Change array type size to
PPC_LINUX_SIZEOF_VRREGSET.
(gdb_vsxregset_t): Change array type size to
PPC_LINUX_SIZEOF_VSXREGSET.
* ppc-linux-tdep.c (ppc_linux_iterate_over_regset_sections):
Change integer literals to PPC_LINUX_SIZEOF_VRREGSET and
PPC_LINUX_SIZEOF_VSXREGSET.
gdb/gdbserver/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* linux-ppc-low.c (SIZEOF_VSXREGS, SIZEOF_VRREGS): Remove.
(ppc_arch_setup): Change SIZEOF_VRREGS and SIZEOF_VSXREGS to
PPC_LINUX_SIZEOF_VRREGSET and PPC_LINUX_SIZEOF_VSXREGSET.
Currently the linux-ppc-low.c fill/store functions for extended
regsets check whether they should execute by using the global hwcap
variable.
This patch explicitly sets the regset sizes to zero when needed to
disable them instead, so that the fill/store functions are not called
in the first place by regsets_fetch_inferior_registers in linux-low.c.
gdb/gdbserver/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* linux-ppc-low.c (ppc_fill_vsxregset): Remove ppc_hwcap check.
(ppc_store_vsxregset): Likewise.
(ppc_fill_vrregset): Likewise.
(ppc_store_vrregset): Likewise.
(ppc_fill_evrregset): Likewise.
(ppc_store_evrregset): Likewise.
(ppc_regsets): Set VSX/VR/EVR regset sizes to 0.
(ppc_arch_setup): Iterate through ppc_regsets and set sizes when
needed.
This patch moves the native target wordsize getter for ppc linux to
nat/ so that it can be used to simplify ppc_arch_setup in
gdbserver. The ptrace call used to get MSR for this is ultimately the
same as before, but it is no longer necessary to create a temporary
regcache to call fetch_inferior_registers.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* configure.nat <linux powerpc>: Add ppc-linux.o to NATDEPFILES.
* ppc-linux-nat.c (ppc_linux_target_wordsize): Move to
nat/ppc-linux.c.
(ppc_linux_nat_target::auxv_parse): Get thread id tid. Call
ppc_linux_target_wordsize with tid.
(ppc_linux_nat_target::read_description): Call ppc_linux_target
wordsize with tid.
* nat/ppc-linux.c: Include nat/gdb_ptrace.h.
(ppc64_64bit_inferior_p): Add static and inline specifiers.
(ppc_linux_target_wordsize): Move here from ppc-linux-nat.c. Add
tid parameter. Remove static specifier.
* nat/ppc-linux.h (ppc64_64bit_inferior_p): Remove declaration.
(ppc_linux_target_wordsize): New declaration.
gdb/gdbserver/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* linux-ppc-low.c (ppc_arch_setup): Remove code for getting the
wordsize of the inferior. Call ppc_linux_target_wordsize.
Share target description declarations and selection among ppc linux
native targets, core files, gdbserver and IPA.
To avoid complicated define guards, gdbserver and IPA now have
declarations for all descriptions, including 64-bit generated
descriptions when compiled in 32-bit mode. These have always been
linked into the gdbserver and IPA binaries. Because they might be
uninitialized, the selection function checks that the selected
description is initialized.
gdb/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* arch/ppc-linux-common.c: New file.
* arch/ppc-linux-common.h: New file.
* arch/ppc-linux-tdesc.h: New file.
* configure.tgt (powerpc*-*-linux*): Add arch/ppc-linux-common.o.
* Makefile.in (ALL_TARGET_OBS): Add arch/ppc-linux-common.o.
(HFILES_NO_SRCDIR): Add arch/ppc-linux-common.h and
arch/ppc-linux-tdesc.h.
* ppc-linux-nat.c: Include arch/ppc-linux-common.h and
arch/ppc-linux-tdesc.h.
(ppc_linux_nat_target::read_description): Remove target
description matching code. Fill a ppc_linux_features struct and
call ppc_linux_match_description with it. Move comment about ISA
2.05 to ppc-linux-common.c.
* ppc-linux-tdep.c: Include arch/ppc-linux-common.h and
arch/ppc-linux-tdesc.h.
(ppc_linux_core_read_description): Remove target description
matching code. Fill a ppc_linux_features struct and call
ppc_linux_match_description with it.
* ppc-linux-tdep.h (tdesc_powerpc_32l, tdesc_powerpc_64l)
(tdesc_powerpc_altivec32l, tdesc_powerpc_altivec64l)
(tdesc_powerpc_cell32l, tdesc_powerpc_cell64l)
(tdesc_powerpc_vsx32l, tdesc_powerpc_vsx64l)
(tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_64l)
(tdesc_powerpc_isa205_altivec32l, tdesc_powerpc_isa205_altivec64l)
(tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_vsx64l)
(tdesc_powerpc_e500l): Remove.
gdb/gdbserver/ChangeLog:
2018-05-22 Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com>
* configure.srv (srv_tgtobj): Add arch/ppc-linux-common.o.
* Makefile.in (SFILES): Add arch/ppc-linux-common.c.
* linux-ppc-tdesc.h: Rename to linux-ppc-tdesc-init.h.
* linux-ppc-tdesc-init.h (tdesc_powerpc_32l, tdesc_powerpc_64l)
(tdesc_powerpc_altivec32l, tdesc_powerpc_altivec64l)
(tdesc_powerpc_cell32l, tdesc_powerpc_cell64l)
(tdesc_powerpc_vsx32l, tdesc_powerpc_vsx64l)
(tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_64l)
(tdesc_powerpc_isa205_altivec32l, tdesc_powerpc_isa205_altivec64l)
(tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_vsx64l)
(tdesc_powerpc_e500l): Remove.
* linux-ppc-ipa.c: Include arch/ppc-linux-tdesc.h and
linux-ppc-tdesc-init.h. Don't include linux-ppc-tdesc.h.
* linux-ppc-low.c: Include arch/ppc-linux-common.h,
arch/ppc-linux-tdesc.h, and linux-ppc-tdesc-init.h. Don't include
linux-ppc-tdesc.h.
(ppc_arch_setup): Remove target description matching code. Fill a
ppc_linux_features struct and call ppc_linux_match_description
with it.
Trying to insert a catchpoint on all Ada assertions now triggers
the following internal warning regardless of the situation. For
instance, not even debugging any program:
(gdb) catch assert
/[...]/gdb/common/cleanups.c:264: internal-warning:
restore_my_cleanups has found a stale cleanup
This is due to a small bug in the following C++-ification commit:
commit bc18fbb575
Author: Tom Tromey <tom@tromey.com>
Date: Fri May 18 15:58:50 2018 -0600
Subject: Change ada_catchpoint::excep_string to be a std::string
The stale cleanup in question is the following one in top.c:execute_command:
cleanup_if_error = make_bpstat_clear_actions_cleanup ();
This cleanup is expected to be discarded if there are no exception.
There were no GDB exception; however, a C++ exception was triggered,
because we passed NULL as the excep_string argument when calling
create_ada_exception_catchpoint, which is a reference to a const
string. So we get a C++ exception during the std::string constructor,
which propagates up, causing the cleanup to unexpectedly remain
in the cleanup chain.
This patch fixes the immediate issue of the incorrect call to
create_ada_exception_catchpoint.
gdb/ChangeLog:
* ada-lang.c (catch_assert_command): Pass empty string instead
of NULL for excep_string argument.
Tested on x86_64-linux, fixes the following failures:
* catch_assert_if.exp: insert catchpoint on failed assertions with condition
* catch_ex.exp: insert catchpoint on failed assertions
This also fixes about a dozen UNRESOLVED tests that are a consequence
of the two tests above failing and crashing GDB.
On the MIPS target DSP ASE registers can only be accessed with the
PTRACE_PEEKUSR and PTRACE_POKEUSR `ptrace' requests. With the n32 ABI
these requests only pass 32-bit data quantities, which are narrower than
the width of DSP accumulator registers, which are 64-bit.
Generic code is prepared to transfer registers wider than the `ptrace'
data type by offsetting into the USR address space, by the data width
transferred. That however does not work with the MIPS target, because
of how the API has been defined, where USR register addresses are
actually indices rather than offsets. Consequently given address `a'
using `a + 4' accesses the fourth next register rather than the upper
half of the original register.
With native debugging this causes clobbered register contents, as well
as access failures as locations beyond the available USR space are
addressed:
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 0000000000000001 0000000000000000
a0 a1 a2 a3
R4 0000000010019158 0000000000000000 0000000000000011 0000000010019160
a4 a5 a6 a7
R8 0000000010019160 fffffffffff00000 fffffffffffffff8 0000000000000000
t0 t1 t2 t3
R12 0000000010019150 0000000000000001 0000000000000001 000000000000000f
s0 s1 s2 s3
R16 0000000077ee6f20 0000000010007bb0 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 000000000052e668 000000000052f008 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000001 0000000010019010 0000000000000000 0000000000000000
gp sp s8 ra
R28 0000000010020280 000000007fff4c10 000000007fff4c10 0000000010004f48
status lo hi badvaddr
0000000000109cf3 0000000000943efe 000000000000000e 000000001001900c
cause pc
0000000000800024 0000000010004f48
fcsr fir hi1 lo1
0e800000 00f30000 0000000004040404 0101010105050505
hi2 lo2 hi3 lo3
0202020255aa33cc Couldn't read register (#75): Input/output error.
(gdb)
With `gdbserver' this makes debugging impossible due to a fatal failure:
(gdb) target remote :2346
Remote debugging using :2346
Reading symbols from .../sysroot/mips-r2-hard/lib32/ld.so.1...done.
0x77fc3d50 in __start () from .../sysroot/mips-r2-hard/lib32/ld.so.1
(gdb) continue
Continuing.
warning: Remote failure reply: E01
Remote communication error. Target disconnected.: Connection reset by peer.
(gdb)
Correct the problem by marking any register in the MIPS backend whose
width exceeds the width of the `ptrace' data type unavailable for the
purpose of PTRACE_PEEKUSR and PTRACE_POKEUSR requests:
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 0000000000000001 0000000000000000
a0 a1 a2 a3
R4 0000000010019158 0000000000000000 0000000000000011 0000000010019160
a4 a5 a6 a7
R8 0000000010019160 fffffffffff00000 fffffffffffffff8 0000000000000000
t0 t1 t2 t3
R12 0000000010019150 0000000000000001 0000000000000001 000000000000000f
s0 s1 s2 s3
R16 0000000077ee6f20 0000000010007bb0 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 000000000052e5c8 000000000052f008 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000001 0000000010019010 0000000000000000 0000000000000000
gp sp s8 ra
R28 0000000010020280 000000007fff4be0 000000007fff4be0 0000000010004f48
status lo hi badvaddr
0000000000109cf3 0000000000943efe 000000000000000e 000000001001900c
cause pc
0000000000800024 0000000010004f48
fcsr fir hi1 lo1
0e800000 00f30000 <unavailable> <unavailable>
hi2 lo2 hi3 lo3
<unavailable> <unavailable> <unavailable> <unavailable>
dspctl restart
55aa33cc 0000000000000000
(gdb)
as there is no way to access full contents of these registers with the
limited API available anyway.
This obviously does not affect general-purpose registers (which use the
PTRACE_GETREGS and PTRACE_SETREGS requests for access) or floating-point
general registers (which use PTRACE_GETFPREGS and PTRACE_SETFPREGS).
And $dspctl, being 32-bit, remains accessible too, which is important
for BPOSGE32 branch decoding in single-stepping.
For DSP accumulator access with the n32 ABI a new `ptrace' API is required
on the kernel side.
gdb/
* mips-linux-nat.c (mips64_linux_register_addr): Return -1 if
the width of the requested register exceeds the width of the
`ptrace' data type.
gdb/gdbserver/
* linux-mips-low.c (mips_cannot_fetch_register): Return 1 if the
width of the requested register exceeds the width of the
`ptrace' data type.
(mips_cannot_store_register): Likewise.
Consistently supply hardwired $zero as a zeroed register, correcting
issues with the PTRACE_GETREGS path that currently copies the value of
$restart into $zero as illustrated by this program:
$ cat read.c
int
main (void)
{
char buf[1024];
ssize_t size;
size = read (0, buf, sizeof (buf));
return size;
}
$
and this corresponding debug session:
(gdb) break main
Breakpoint 1 at 0x120000970: file read.c, line 9.
(gdb) target remote :2346
Remote debugging using :2346
Reading symbols from .../sysroot/mips-r2-hard/lib64/ld.so.1...done.
0x000000fff7fca5a0 in __start ()
from .../sysroot/mips-r2-hard/lib64/ld.so.1
(gdb) continue
Continuing.
Breakpoint 1, main () at read.c:9
9 size = read (0, buf, sizeof (buf));
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 000000fff7ffe710 0000000000000000
a0 a1 a2 a3
R4 0000000000000001 000000ffffffeb88 000000ffffffeb98 0000000000000000
a4 a5 a6 a7
R8 000000fff7fc8800 000000fff7fc38f0 000000ffffffeb80 2f2f2f2f2f2f2f2f
t0 t1 t2 t3
R12 0000000000000437 0000000000000002 000000fff7ffd000 0000000120000a00
s0 s1 s2 s3
R16 000000fff7fc7068 0000000120000b90 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 0000000000521d88 0000000000522608 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 0000000120000970 0000000000000000 0000000000000000
gp sp s8 ra
R28 000000fff7fc8800 000000ffffffea50 0000000000000000 000000fff7e4088c
status lo hi badvaddr
0000000000109cf3 0000000000005ea5 0000000000000211 000000fff7eadf00
cause pc
0000000000800024 0000000120000970
fcsr fir restart
00000000 00f30000 0000000000000000
(gdb) continue
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x000000fff7f084ac in __GI___libc_read (fd=0, buf=0xffffffe640, nbytes=1024)
at ../sysdeps/unix/sysv/linux/read.c:27
27 return SYSCALL_CANCEL (read, fd, buf, nbytes);
(gdb) info registers
zero at v0 v1
R0 0000000000001388 0000000000000001 0000000000000200 000000fff7ffe710
a0 a1 a2 a3
R4 0000000000000000 000000ffffffe640 0000000000000400 0000000000000001
a4 a5 a6 a7
R8 000000fff7fc8800 000000fff7fc38f0 000000ffffffeb80 2f2f2f2f2f2f2f2f
t0 t1 t2 t3
R12 00000000000005e3 0000000000000002 000000fff7ffd000 000000012000099c
s0 s1 s2 s3
R16 000000fff7fc7068 0000000120000b90 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 0000000000521d88 0000000000522608 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 000000fff7f2da20 0000000000000000 0000000000000000
gp sp s8 ra
R28 000000fff7fc8800 000000ffffffe600 0000000000000000 000000012000099c
status lo hi badvaddr
0000000000109cf3 00000000000001e6 00000000000000be 000000fff7f08470
cause pc
0000000000800020 000000fff7f084ac
fcsr fir restart
00000000 00f30000 0000000000001388
(gdb)
and with the PTRACE_PEEKUSR path that does not supply this register at
all, causing issues analogous to ones addressed for the native MIPS
backend with commit 4e6ff0e1b8 ("MIPS/Linux/native: Supply $zero for
the !PTRACE_GETREGS case"):
(gdb) info registers
zero at v0 v1
R0 <unavailable> 0000000000000001 0000000000000001 0000000000000000
a0 a1 a2 a3
R4 00000001200212b0 0000000000000000 0000000000000021 000000012001a260
a4 a5 a6 a7
R8 000000012001a260 0000000000000004 800000010cab1680 fffffffffffffff8
t0 t1 t2 t3
R12 0000000000000000 000000fff7edab68 0000000000000001 0000000000000000
s0 s1 s2 s3
R16 000000fff7ee2068 0000000120008b80 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 000000000052e5c8 000000000052f008 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 00000001200027c0 0000000000000000 0000000000000000
gp sp s8 ra
R28 00000001200212b0 000000ffffffc880 000000ffffffc880 0000000120005ee8
status lo hi badvaddr
<unavailable> 0000000000943efe 000000000000000e 000000012001a008
cause pc
0000000000800024 0000000120005ee8
fcsr fir restart
0e800000 00f30000 0000000000000000
(gdb)
and (under certain circumstances):
(gdb) next
Register 0 is not available
(gdb)
The problem with PTRACE_GETREGS happens because `mips_store_gregset'
supplies the contents of register slot #0, occupied by $restart, to
$zero. The problem with PTRACE_PEEKUSR happens because for $zero
`mips_cannot_fetch_register' returns one, and no alternative way to
supply that register has been defined.
Correct `mips_store_gregset' then for the PTRACE_GETREGS case and add
`mips_fetch_register' for the PTRACE_PEEKUSR case.
gdb/gdbserver/
* linux-mips-low.c (mips_fetch_register): New function. Update
preceding comment.
(mips_store_gregset): Supply 0 rather than $restart for $zero.
(the_low_target): Wire `mips_fetch_register'.
I happened to notice that output_command_const still exists, but is
not needed any more -- commands are always const-correct now. This
patch removes this leftover.
2018-05-21 Tom Tromey <tom@tromey.com>
* printcmd.c (output_command): Remove.
(output_command_const): Rename to output_command.
* valprint.h (output_command): Rename from output_command_const.
* tracepoint.c (trace_dump_actions): Call output_command.
This changes ada_catchpoint::excep_string to be a std::string and then
fixes up all t he users.
This found a memory leak in catch_ada_exception_command_split, where
"cond" was copied but never freed.
I changed the type of the "cond_string" argument to
catch_ada_exception_command_split to follow the rule that out
parameters should be pointers and not references.
This patch enables the removal of some cleanups and also the function
ada_get_next_arg.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* mi/mi-cmd-catch.c (mi_cmd_catch_assert)
(mi_cmd_catch_exception, mi_cmd_catch_handlers): Update.
* ada-lang.h (create_ada_exception_catchpoint): Update.
* ada-lang.c (struct ada_catchpoint) <excep_string>: Now a
std::string.
(create_excep_cond_exprs, ~ada_catchpoint)
(should_stop_exception, print_one_exception)
(print_mention_exception, print_recreate_exception): Update.
(ada_get_next_arg): Remove.
(catch_ada_exception_command_split): Use std::string. Change type
of "excep_string", "cond_string".
(catch_ada_exception_command): Update.
(create_ada_exception_catchpoint): Change type of excep_string.
(ada_exception_sal): Remove excep_string parameter.
(~ada_catchpoint): Remove.
ada_collect_symbol_completion_matches installs a null_cleanup but not
any other cleanups. This patch removes it.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_collect_symbol_completion_matches): Remove
cleanup.
This removes a cleanup from ada-lang.c by having
ada_exception_message_1 return a unique_xmalloc_ptr.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_exception_message_1, ada_exception_message):
Return unique_xmalloc_ptr.
(print_it_exception): Update.
This changes trace_dump_actions to use std::string, removing a
cleanup.
Tested by the buildbot.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* tracepoint.c (trace_dump_actions): Use std::string.
This removes a cleanup from reread_symbols by using std::string. This
fixes a memory leak, because this cleanup is ordinarily discarded, not
run.
Tested by the buildbot.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* symfile.c (reread_symbols): Use std::string for original_name.
This changes dwarf2_read_debug_names to use std::unique_ptr from the
outset. This simplifies the code that installs the resulting map into
dwarf2_per_objfile.
Tested by the buildbot.
ChangeLog
2018-05-21 Tom Tromey <tom@tromey.com>
* dwarf2read.c (dwarf2_read_debug_names): Use std::unique_ptr.
(mapped_index_base): Use DISABLE_COPY_AND_ASSIGN. Default
constructor.
I realized after pushing that I made a copy-pasto, I had:
# define HAVE_IS_TRIVIALLY_COPYABLE 1
instead of
# define HAVE_IS_TRIVIALLY_CONSTRUCTIBLE 1
with the consequence that IsMallocable was always std::true_type (and
was therefore not enforcing anything). Fixing that mistake triggered a
build failure:
/home/simark/src/binutils-gdb/gdb/objfiles.c:150:12: required from here
/home/simark/src/binutils-gdb/gdb/common/poison.h:228:3: error: static assertion failed: Trying to use XOBNEW with a non-POD data type.
I am not sure why I did not see this when I originally wrote the patch
(but I saw and fixed other failures). In any case, I swapped XOBNEW
with obstack_new to get rid of it.
Regtested on the buildbot.
gdb/ChangeLog:
* common/traits.h (HAVE_IS_TRIVIALLY_COPYABLE): Rename the wrong
instance to...
(HAVE_IS_TRIVIALLY_CONSTRUCTIBLE): ... this.
* objfiles.c (get_objfile_bfd_data): Allocate
objfile_per_bfd_storage with obstack_new when allocating on
obstack.
Since XOBNEW/XOBNEWVEC/OBSTACK_ZALLOC are now poisoned to prevent using
them with non-trivially-constructible objects, it is worth using them
over plain obstack_alloc. This patch changes the locations I could find
where we can do that change easily.
gdb/ChangeLog:
* ada-lang.c (cache_symbol): Use XOBNEW and/or XOBNEWVEC and/or
OBSTACK_ZALLOC.
* dwarf2-frame.c (dwarf2_build_frame_info): Likewise.
* hppa-tdep.c (hppa_init_objfile_priv_data): Likewise.
* mdebugread.c (mdebug_build_psymtabs): Likewise.
(add_pending): Likewise.
(parse_symbol): Likewise.
(parse_partial_symbols): Likewise.
(psymtab_to_symtab_1): Likewise.
(new_psymtab): Likewise.
(elfmdebug_build_psymtabs): Likewise.
* minsyms.c (terminate_minimal_symbol_table): Likewise.
* objfiles.c (get_objfile_bfd_data): Likewise.
(objfile_register_static_link): Likewise.
* psymtab.c (allocate_psymtab): Likewise.
* stabsread.c (read_member_functions): Likewise.
* xcoffread.c (xcoff_end_psymtab): Likewise.
Since we use obstacks with objects that are not default constructible,
we sometimes need to manually call the constructor by hand using
placement new:
foo *f = obstack_alloc (obstack, sizeof (foo));
f = new (f) foo;
It's possible to use allocate_on_obstack instead, but there are types
that we sometimes want to allocate on an obstack, and sometimes on the
regular heap. This patch introduces a utility to make this pattern
simpler if allocate_on_obstack is not an option:
foo *f = obstack_new<foo> (obstack);
Right now there's only one usage (in tdesc_data_init).
To help catch places where we would forget to call new when allocating
such an object on an obstack, this patch also poisons some other methods
of allocating an instance of a type on an obstack:
- OBSTACK_ZALLOC/OBSTACK_CALLOC
- XOBNEW/XOBNEW
- GDBARCH_OBSTACK_ZALLOC/GDBARCH_OBSTACK_CALLOC
Unfortunately, there's no way to catch wrong usages of obstack_alloc.
By pulling on that string though, it tripped on allocating struct
template_symbol using OBSTACK_ZALLOC. The criterion currently used to
know whether it's safe to "malloc" an instance of a struct is whether it
is a POD. Because it inherits from struct symbol, template_symbol is
not a POD. This criterion is a bit too strict however, it should still
safe to allocate memory for a template_symbol and memset it to 0. We
didn't use is_trivially_constructible as the criterion in the first
place only because it is not available in gcc < 5. So here I considered
two alternatives:
1. Relax that criterion to use std::is_trivially_constructible and add a
bit more glue code to make it work with gcc < 5
2. Continue pulling on the string and change how the symbol structures
are allocated and initialized
I managed to do both, but I decided to go with #1 to keep this patch
simpler and more focused. When building with a compiler that does not
have is_trivially_constructible, the check will just not be enforced.
gdb/ChangeLog:
* common/traits.h (HAVE_IS_TRIVIALLY_COPYABLE): Define if
compiler supports std::is_trivially_constructible.
* common/poison.h: Include obstack.h.
(IsMallocable): Define to is_trivially_constructible if the
compiler supports it, define to true_type otherwise.
(xobnew): New.
(XOBNEW): Redefine.
(xobnewvec): New.
(XOBNEWVEC): Redefine.
* gdb_obstack.h (obstack_zalloc): New.
(OBSTACK_ZALLOC): Redefine.
(obstack_calloc): New.
(OBSTACK_CALLOC): Redefine.
(obstack_new): New.
* gdbarch.sh: Include gdb_obstack in gdbarch.h.
(gdbarch_obstack): New declaration in gdbarch.h, definition in
gdbarch.c.
(GDBARCH_OBSTACK_CALLOC, GDBARCH_OBSTACK_ZALLOC): Use
obstack_calloc/obstack_zalloc.
(gdbarch_obstack_zalloc): Remove.
* target-descriptions.c (tdesc_data_init): Use obstack_new.
This adds a constructor to struct dwz_file and arranges for it to be
allocated with "new" and wrapped in a unique_ptr. This cuts down on
the amount of manual memory management that must be done.
Regression tested by the buildbot.
gdb/ChangeLog
2018-05-18 Tom Tromey <tom@tromey.com>
* dwarf2read.c (struct dwz_file): Add constructor, initializers.
<dwz_bfd>: Now a gdb_bfd_ref_ptr.
(~dwarf2_per_objfile): Update
(dwarf2_get_dwz_file): Use new.
* dwarf2read.h (struct dwarf2_per_objfile) <dwz_file>: Now a
unique_ptr.
This adds a constructor and initializer to dwp_file and changes it to
be allocated with "new". This removes a bit of manual refcount
management.
Tested by the buildbot.
gdb/ChangeLog
2018-05-18 Tom Tromey <tom@tromey.com>
* dwarf2read.h (struct dwarf2_per_objfile) <dwp_file>: Now a
unique_ptr.
* dwarf2read.c (struct dwp_file): Add constructor and
initializers.
(open_and_init_dwp_file): Return a unique_ptr.
(dwarf2_per_objfile, create_dwp_hash_table)
(create_dwo_unit_in_dwp_v1, create_dwo_unit_in_dwp_v2)
(lookup_dwo_unit_in_dwp): Update.
(open_and_init_dwp_file, get_dwp_file): Update.
This changes struct mapped_index to be allocated with new. This
simplifies the creation a bit (see dwarf2_read_index) and also removes
a somewhat ugly explicit destructor call from ~dwarf2_per_objfile.
Tested by the buildbot.
gdb/ChangeLog
2018-05-18 Tom Tromey <tom@tromey.com>
* dwarf2read.c (dwarf2_per_objfile): Update.
(struct mapped_index): Add initializers.
(dwarf2_read_index): Use new.
(dw2_symtab_iter_init): Update.
* dwarf2read.h (struct dwarf2_per_objfile) <index_table>: Now a
unique_ptr.
Silence this:
unittests/format_pieces-selftests.c:51: warning: code: Do not use printf("%ll"), instead use printf("%s",phex()) to dump a `long long' value
unittests/format_pieces-selftests.c:56: warning: code: Do not use printf("%ll"), instead use printf("%s",phex()) to dump a `long long' value
gdb/ChangeLog:
* unittests/format_pieces-selftests.c (test_format_specifier):
Add ARI comments.
I was recently using ptype/o to look at the layout of some objects in
gdb. I noticed that trailing padding was not shown -- but I wanted to
be able to look at that, too.
This patch changes ptype/o to also print trailing holes.
Tested on x86-64 Fedora 26.
gdb/ChangeLog
2018-05-18 Tom Tromey <tom@tromey.com>
* c-typeprint.c (maybe_print_hole): New function.
(c_print_type_struct_field_offset): Update.
(c_type_print_base_struct_union): Call maybe_print_hole.
gdb/testsuite/ChangeLog
2018-05-18 Tom Tromey <tom@tromey.com>
* gdb.base/ptype-offsets.exp: Update.
This patch essentially causes GDB to treat inlined frames like "normal"
frames from the user's perspective. This means, for example, that when a
user sets a breakpoint in an inlined function, GDB will now actually stop
"in" that function.
Using the test case from breakpoints/17534,
3 static inline void NVIC_EnableIRQ(int IRQn)
4 {
5 volatile int y;
6 y = IRQn;
7 }
8
9 __attribute__( ( always_inline ) ) static inline void __WFI(void)
10 {
11 __asm volatile ("nop");
12 }
13
14 int main(void) {
15
16 x= 42;
17
18 if (x)
19 NVIC_EnableIRQ(16);
20 else
21 NVIC_EnableIRQ(18);
(gdb) b NVIC_EnableIRQ
Breakpoint 1 at 0x4003e4: NVIC_EnableIRQ. (2 locations)
(gdb) r
Starting program: 17534
Breakpoint 1, main () at 17534.c:19
19 NVIC_EnableIRQ(16);
Because skip_inline_frames currently skips every inlined frame, GDB "stops"
in the caller. This patch adds a new parameter to skip_inline_frames
that allows us to pass in a bpstat stop chain. The breakpoint locations
on the stop chain can be used to determine if we've stopped inside an inline
function (due to a user breakpoint). If we have, we do not elide the frame.
With this patch, GDB now reports that the inferior has stopped inside the
inlined function:
(gdb) r
Starting program: 17534
Breakpoint 1, NVIC_EnableIRQ (IRQn=16) at 17534.c:6
6 y = IRQn;
Many thanks to Jan and Pedro for guidance on this.
gdb/ChangeLog:
* breakpoint.c (build_bpstat_chain): New function, moved from
bpstat_stop_status.
(bpstat_stop_status): Add optional parameter, `stop_chain'.
If no stop chain is passed, call build_bpstat_chain to build it.
* breakpoint.h (build_bpstat_chain): Declare.
(bpstat_stop_status): Move documentation here from breakpoint.c.
* infrun.c (handle_signal_stop): Before eliding inlined frames,
build the stop chain and pass it to skip_inline_frames.
Pass this stop chain to bpstat_stop_status.
* inline-frame.c: Include breakpoint.h.
(stopped_by_user_bp_inline_frame): New function.
(skip_inline_frames): Add parameter `stop_chain'.
Move documention to inline-frame.h.
If non-NULL, use stopped_by_user_bp_inline_frame to determine
whether the frame should be elided.
* inline-frame.h (skip_inline_frames): Add parameter `stop_chain'.
Add moved documentation and update for new parameter.
gdb/testsuite/ChangeLog:
* gdb.ada/bp_inlined_func.exp: Update inlined frame locations
in expected breakpoint stop locations.
* gdb.dwarf2/implptr.exp (implptr_test_baz): Use up/down to
move to proper scope to test variable values.
* gdb.opt/inline-break.c (inline_func1, not_inline_func1)
(inline_func2, not_inline_func2, inline_func3, not_inline_func3):
New functions.
(main): Call not_inline_func3.
* gdb.opt/inline-break.exp: Start inferior and set breakpoints at
inline_func1, inline_func2, and inline_func3. Test that when each
breakpoint is hit, GDB properly reports both the stop location
and the backtrace. Repeat tests for temporary breakpoints.
I noticed that the printf command did not recognize the \e escape
sequence, used amongst other things to use colors:
(gdb) printf "This is \e[32mgreen\e[m!\n"
Unrecognized escape character \e in format string.
This patch makes format_pieces recognize it, which makes that command
print the expected result in glorious color.
I wrote a really simple unit test for format_pieces.
format_pieces::operator[] is unused so I removed it. I added
format_piece::operator==, which is needed to compare vectors of
format_piece.
gdb/ChangeLog:
PR cli/14975
* Makefile.in (SUBDIR_UNITTESTS_SRCS): Add
unittests/format_pieces-selftests.c.
* common/format.h (format_piece) <operator==>: New.
(format_pieces) <operator[]>: Remove.
* common/format.c (format_pieces::format_pieces): Handle \e.
* unittests/format_pieces-selftests.c: New.
PR symtab/23010 reports a crash that occurs when using -readnow
on a dwz-generated debuginfo file.
The crash occurs because the DWARF has a partial CU with no language
set, and then a full CU that references this partial CU using
DW_AT_abstract_origin.
In this case, the partial CU is read by dw2_expand_all_symtabs using
language_minimal; but then this conflicts with the creation of the
block's symbol table in the C++ CU.
This patch fixes the problem by arranging for partial CUs not to be
read by -readnow. I tend to think that it doesn't make sense to read
a partial CU in isolation -- they should only be read when imported
into some other CU.
In conjunction with some other patches I am going to post, this also
fixes the Rust -readnow crash that Jan reported.
There are two problems with this patch:
1. It is difficult to reason about. There are many cases where I've
patched the code to call init_cutu_and_read_dies with the flag set
to "please do read partial units" -- but I find it difficult to be
sure that this is always correct.
2. It is still missing a standalone test case. This seemed hard.
2018-05-17 Tom Tromey <tom@tromey.com>
PR symtab/23010:
* dwarf2read.c (load_cu, dw2_do_instantiate_symtab)
(dw2_instantiate_symtab): Add skip_partial parameter.
(dw2_find_last_source_symtab, dw2_map_expand_apply)
(dw2_lookup_symbol, dw2_expand_symtabs_for_function)
(dw2_expand_all_symtabs, dw2_expand_symtabs_with_fullname)
(dw2_expand_symtabs_matching_one)
(dw2_find_pc_sect_compunit_symtab)
(dw2_debug_names_lookup_symbol)
(dw2_debug_names_expand_symtabs_for_function): Update.
(init_cutu_and_read_dies): Add skip_partial parameter.
(process_psymtab_comp_unit, build_type_psymtabs_1)
(process_skeletonless_type_unit, load_partial_comp_unit)
(psymtab_to_symtab_1): Update.
(load_full_comp_unit): Add skip_partial parameter.
(process_imported_unit_die, dwarf2_read_addr_index)
(follow_die_offset, dwarf2_fetch_die_loc_sect_off)
(dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off)
(read_signatured_type): Update.
Obvious patch to remove unused local variables (found by adding
-Wunused). I didn't touch this one in value_fetch_lazy, because
check_typedef could have a desired side-effect.
3743 struct type *type = check_typedef (value_type (val));
gdb/ChangeLog:
* value.c (release_value): Remove unused variable.
(record_latest_value): Likewise.
(access_value_history): Likewise.
(preserve_values): Likewise.
When running gdb in the build directory without passing
--data-directory, I noticed I could provoke a crash by:
$ ./gdb -nx ./gdb
(gdb) ptype/o struct dwarf2_per_objfile
... and then trying to "q" out at the pagination prompt.
valgrind complained about an uninitialized use of py_type_printers.
Initializing this member fixes the bug.
I believe this bug can occur even when the gdb Python libraries are
available, for example if get_type_recognizers fails.
Tested by hand on x86-64 Fedora 26. No test case because it seemed
difficult to guarantee failures.
gdb/ChangeLog
2018-05-17 Tom Tromey <tom@tromey.com>
* extension.h (struct ext_lang_type_printers) <py_type_printers>:
Initialize.
Update `fetch_register' and `store_register' code to support arbitrary
register widths rather than only ones that are a multiply of the size of
the `ptrace' data type used with PTRACE_PEEKUSR and PTRACE_POKEUSR
requests to access registers. Remove associated assertions, correcting
an issue with accessing the DSPControl (`$dspctl') register on n64 MIPS
native targets:
(gdb) print /x $dspctl
.../gdb/linux-nat-trad.c:50: internal-error: void linux_nat_trad_target::fetch_register(regcache*, int): Assertion `(size % sizeof (PTRACE_TYPE_RET)) == 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) n
This is a bug, please report it. For instructions, see:
<http://www.gnu.org/software/gdb/bugs/>.
.../gdb/linux-nat-trad.c:50: internal-error: void linux_nat_trad_target::fetch_register(regcache*, int): Assertion `(size % sizeof (PTRACE_TYPE_RET)) == 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) n
Command aborted.
(gdb)
All registers are now reported correctly and their architectural
hardware widths respected:
(gdb) print /x $dspctl
$1 = 0x55aa33cc
(gdb) info registers
zero at v0 v1
R0 0000000000000000 0000000000000001 000000fff7ffeb20 0000000000000000
a0 a1 a2 a3
R4 0000000000000001 000000ffffffeaf8 000000ffffffeb08 0000000000000000
a4 a5 a6 a7
R8 000000fff7ee3800 000000fff7ede8f0 000000ffffffeaf0 2f2f2f2f2f2f2f2f
t0 t1 t2 t3
R12 0000000000000437 0000000000000002 000000fff7ffd000 0000000120000ad0
s0 s1 s2 s3
R16 000000fff7ee2068 0000000120000e60 0000000000000000 0000000000000000
s4 s5 s6 s7
R20 0000000000521ec8 0000000000522608 0000000000000000 0000000000000000
t8 t9 k0 k1
R24 0000000000000000 0000000120000d9c 0000000000000000 0000000000000000
gp sp s8 ra
R28 0000000120019030 000000ffffffe990 000000ffffffe990 000000fff7d5b88c
status lo hi badvaddr
0000000000109cf3 0000000000005ea5 0000000000000211 000000fff7fc6fe0
cause pc
0000000000800024 0000000120000dbc
fcsr fir hi1 lo1
00000000 00f30000 0000000000000000 0101010101010101
hi2 lo2 hi3 lo3
0202020202020202 0303030303030303 0404040404040404 0505050505050505
dspctl restart
55aa33cc 0000000000000000
(gdb)
NB due to the lack of access to 64-bit DSP hardware all DSP register
values in the dumps are artificial and have been created with a debug
change applied to the kernel handler of the `ptrace' syscall.
The use of `store_unsigned_integer' and `extract_unsigned_integer'
unconditionally in all cases rather than when actual data occupies a
part of the data quantity exchanged with `ptrace' makes code perhaps
marginally slower, however I think avoiding it is not worth code
obfuscation it would cause. If this turns out unfounded, then there
should be no problem with optimizing this code later.
gdb/
PR gdb/22286
* linux-nat-trad.c (linux_nat_trad_target::fetch_register):
Also handle registers whose width is not a multiple of
PTRACE_TYPE_RET.
(linux_nat_trad_target::store_register): Likewise.
This changes program_space::cbfd to be a gdb_bfd_ref_ptr. This makes
it somewhat less error-prone to use, because now it manages the
reference counting automatically.
Tested by the buildbot.
2018-05-16 Tom Tromey <tom@tromey.com>
* gdbcore.h (core_bfd): Redefine.
* corelow.c (core_target::close): Update.
(core_target_open): Update.
* progspace.h (struct program_space) <cbfd>: Now a
gdb_bfd_ref_ptr.
One part of PR cli/19551 is that the mini debug info objfile reuses the
name of the main objfile from which it comes. This can be seen because
gdb claims to be reading symbols from the same file two times, like:
Reading symbols from /bin/gdb...Reading symbols from /bin/gdb...(no debugging symbols found)...done.
I think this would be less confusing if the minidebug objfile were given
a different name. That is what this patch implements. It also arranges
for the minidebug objfile to be marked OBJF_NOT_FILENAME.
After this patch the output looks like:
Reading symbols from /bin/gdb...Reading symbols from .gnu_debugdata for /usr/libexec/gdb...(no debugging symbols found)...done.
Tested by the buildbot.
gdb/ChangeLog
2018-05-16 Tom Tromey <tom@tromey.com>
PR cli/19551:
* symfile-add-flags.h (enum symfile_add_flags)
<SYMFILE_NOT_FILENAME>: New constant.
* symfile.c (read_symbols): Use SYMFILE_NOT_FILENAME. Get
objfile name from BFD.
(symbol_file_add_with_addrs): Check SYMFILE_NOT_FILENAME.
* minidebug.c (find_separate_debug_file_in_section): Put
".gnu_debugdata" into BFD's file name.
This patch if the first patch in a series to add the ability to add constraints
to system registers that an instruction must adhere to in order for the register
to be usable with that instruction.
These constraints can also be used to disambiguate between registers with the
same encoding during disassembly.
This patch adds a new flags entry in the sysreg structures and ensures it is
filled in and read out during assembly/disassembly. It also adds the ability for
the assemble and disassemble functions to be able to gracefully fail and re-use
the existing error reporting infrastructure.
The return type of these functions are changed to a boolean to denote success or
failure and the error structure is passed around to them. This requires
aarch64-gen changes so a lot of the changes here are just mechanical.
gas/
PR binutils/21446
* config/tc-aarch64.c (parse_sys_reg): Return register flags.
(parse_operands): Fill in register flags.
gdb/
PR binutils/21446
* aarch64-tdep.c (aarch64_analyze_prologue,
aarch64_software_single_step, aarch64_displaced_step_copy_insn):
Indicate not interested in errors.
include/
PR binutils/21446
* opcode/aarch64.h (aarch64_opnd_info): Change sysreg to struct.
(aarch64_decode_insn): Accept error struct.
opcodes/
PR binutils/21446
* aarch64-asm.h (aarch64_insert_operand, aarch64_##x): Return boolean
and take error struct.
* aarch64-asm.c (aarch64_ext_regno, aarch64_ins_reglane,
aarch64_ins_reglist, aarch64_ins_ldst_reglist,
aarch64_ins_ldst_reglist_r, aarch64_ins_ldst_elemlist,
aarch64_ins_advsimd_imm_shift, aarch64_ins_imm, aarch64_ins_imm_half,
aarch64_ins_advsimd_imm_modified, aarch64_ins_fpimm,
aarch64_ins_imm_rotate1, aarch64_ins_imm_rotate2, aarch64_ins_fbits,
aarch64_ins_aimm, aarch64_ins_limm_1, aarch64_ins_limm,
aarch64_ins_inv_limm, aarch64_ins_ft, aarch64_ins_addr_simple,
aarch64_ins_addr_regoff, aarch64_ins_addr_offset, aarch64_ins_addr_simm,
aarch64_ins_addr_simm10, aarch64_ins_addr_uimm12,
aarch64_ins_simd_addr_post, aarch64_ins_cond, aarch64_ins_sysreg,
aarch64_ins_pstatefield, aarch64_ins_sysins_op, aarch64_ins_barrier,
aarch64_ins_prfop, aarch64_ins_hint, aarch64_ins_reg_extended,
aarch64_ins_reg_shifted, aarch64_ins_sve_addr_ri_s4xvl,
aarch64_ins_sve_addr_ri_s6xvl, aarch64_ins_sve_addr_ri_s9xvl,
aarch64_ins_sve_addr_ri_s4, aarch64_ins_sve_addr_ri_u6,
aarch64_ins_sve_addr_rr_lsl, aarch64_ins_sve_addr_rz_xtw,
aarch64_ins_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ins_sve_addr_zz_lsl, aarch64_ins_sve_addr_zz_sxtw,
aarch64_ins_sve_addr_zz_uxtw, aarch64_ins_sve_aimm,
aarch64_ins_sve_asimm, aarch64_ins_sve_index, aarch64_ins_sve_limm_mov,
aarch64_ins_sve_quad_index, aarch64_ins_sve_reglist,
aarch64_ins_sve_scale, aarch64_ins_sve_shlimm, aarch64_ins_sve_shrimm,
aarch64_ins_sve_float_half_one, aarch64_ins_sve_float_half_two,
aarch64_ins_sve_float_zero_one, aarch64_opcode_encode): Likewise.
* aarch64-dis.h (aarch64_extract_operand, aarch64_##x): Likewise.
* aarch64-dis.c (aarch64_ext_regno, aarch64_ext_reglane,
aarch64_ext_reglist, aarch64_ext_ldst_reglist,
aarch64_ext_ldst_reglist_r, aarch64_ext_ldst_elemlist,
aarch64_ext_advsimd_imm_shift, aarch64_ext_imm, aarch64_ext_imm_half,
aarch64_ext_advsimd_imm_modified, aarch64_ext_fpimm,
aarch64_ext_imm_rotate1, aarch64_ext_imm_rotate2, aarch64_ext_fbits,
aarch64_ext_aimm, aarch64_ext_limm_1, aarch64_ext_limm, decode_limm,
aarch64_ext_inv_limm, aarch64_ext_ft, aarch64_ext_addr_simple,
aarch64_ext_addr_regoff, aarch64_ext_addr_offset, aarch64_ext_addr_simm,
aarch64_ext_addr_simm10, aarch64_ext_addr_uimm12,
aarch64_ext_simd_addr_post, aarch64_ext_cond, aarch64_ext_sysreg,
aarch64_ext_pstatefield, aarch64_ext_sysins_op, aarch64_ext_barrier,
aarch64_ext_prfop, aarch64_ext_hint, aarch64_ext_reg_extended,
aarch64_ext_reg_shifted, aarch64_ext_sve_addr_ri_s4xvl,
aarch64_ext_sve_addr_ri_s6xvl, aarch64_ext_sve_addr_ri_s9xvl,
aarch64_ext_sve_addr_ri_s4, aarch64_ext_sve_addr_ri_u6,
aarch64_ext_sve_addr_rr_lsl, aarch64_ext_sve_addr_rz_xtw,
aarch64_ext_sve_addr_zi_u5, aarch64_ext_sve_addr_zz,
aarch64_ext_sve_addr_zz_lsl, aarch64_ext_sve_addr_zz_sxtw,
aarch64_ext_sve_addr_zz_uxtw, aarch64_ext_sve_aimm,
aarch64_ext_sve_asimm, aarch64_ext_sve_index, aarch64_ext_sve_limm_mov,
aarch64_ext_sve_quad_index, aarch64_ext_sve_reglist,
aarch64_ext_sve_scale, aarch64_ext_sve_shlimm, aarch64_ext_sve_shrimm,
aarch64_ext_sve_float_half_one, aarch64_ext_sve_float_half_two,
aarch64_ext_sve_float_zero_one, aarch64_opcode_decode): Likewise.
(determine_disassembling_preference, aarch64_decode_insn,
print_insn_aarch64_word, print_insn_data): Take errors struct.
(print_insn_aarch64): Use errors.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Regenerate.
* aarch64-gen.c (print_operand_inserter): Use errors and change type to
boolean in aarch64_insert_operan.
(print_operand_extractor): Likewise.
* aarch64-opc.c (aarch64_print_operand): Use sysreg struct.
With native MIPS/Linux targets the $zero register is inaccessible, with
its supposed context slot provided by the OS occupied by the $restart
register. The PTRACE_GETREGS path takes care of it by artificially
supplying the hardwired contents of $zero in `mips_supply_gregset' or
`mips64_supply_gregset', as applicable, however the PTRACE_PEEKUSER
fallback does not, making the register unavailable, e.g.:
(gdb) info registers
zero at v0 v1 a0 a1 a2 a3
R0 <unavl> 00000001 00000001 d2f1a9fc 00000000 00000000 00417158 00417150
t0 t1 t2 t3 t4 t5 t6 t7
R8 00000004 00000000 fffffff8 00000000 00000000 00000000 00000001 00000007
s0 s1 s2 s3 s4 s5 s6 s7
R16 00000000 00405e30 00000000 00500000 00000000 0052ec08 00000000 00000000
t8 t9 k0 k1 gp sp s8 ra
R24 00000000 00417008 00000000 00000000 0041e220 7fff4ce0 7fff4ce0 00405d0c
status lo hi badvaddr cause pc
<unavl> 00441cf1 00000017 00417004 00800024 00405d10
fcsr fir restart
00800000 00f30000 00000000
(gdb)
or (under certain circumstances):
(gdb) stepi
Register 0 is not available
(gdb)
This is specifically because `mips_linux_register_addr' and
`mips64_linux_register_addr', both correctly return -1 for
MIPS_ZERO_REGNUM, and therefore `linux_nat_trad_target::fetch_registers'
faithfully marks this register as unavailable.
Supply this register artificially then in the PTRACE_PEEKUSER case as
well, correcting this issue.
gdb/
* mips-linux-nat.c (mips_linux_nat_target::fetch_registers):
Supply the MIPS_ZERO_REGNUM register.
Make the `mask_address_var' variable static, it is not used outside
mips-tdep.c and having no target name embedded within it causes a risk
of a namespace clash.
gdb/
* mips-tdep.c (mask_address_var): Make variable static.
Fix a commit f90183d7e3 ("Get GDBserver pid on remote target") bug and
correctly handle the case where the PID of `gdbserver' could not have
been retrieved. If that happens, $server_pid is unset causing:
FAIL: gdb.server/server-kill.exp: p server_pid
ERROR: tcl error sourcing .../gdb/testsuite/gdb.server/server-kill.exp.
ERROR: can't read "server_pid": no such variable
while executing
"if {$server_pid == "" } {
return -1
}"
(file ".../gdb/testsuite/gdb.server/server-kill.exp" line 49)
invoked from within
"source .../gdb/testsuite/gdb.server/server-kill.exp"
("uplevel" body line 1)
invoked from within
"uplevel #0 source .../gdb/testsuite/gdb.server/server-kill.exp"
invoked from within
"catch "uplevel #0 source $test_file_name""
Verify that the variable exists then rather than trying to access it.
gdb/testsuite/
* gdb.server/server-kill.exp: Verify whether `server_pid' exists
rather then trying to access it in determining whether the PID
of `gdbserver' could have been retrieved.