aboutsummaryrefslogtreecommitdiff
path: root/gdb/fbsd-nat.c
AgeCommit message (Collapse)AuthorFilesLines
2024-04-25gdb: remove gdbcmd.hSimon Marchi1-1/+1
Most files including gdbcmd.h currently rely on it to access things actually declared in cli/cli-cmds.h (setlist, showlist, etc). To make things easy, replace all includes of gdbcmd.h with includes of cli/cli-cmds.h. This might lead to some unused includes of cli/cli-cmds.h, but it's harmless, and much faster than going through the 170 or so files by hand. Change-Id: I11f884d4d616c12c05f395c98bbc2892950fb00f Approved-By: Tom Tromey <tom@tromey.com>
2024-03-26gdb, gdbserver, gdbsupport: remove includes of early headersSimon Marchi1-1/+0
Now that defs.h, server.h and common-defs.h are included via the `-include` option, it is no longer necessary for source files to include them. Remove all the inclusions of these files I could find. Update the generation scripts where relevant. Change-Id: Ia026cff269c1b7ae7386dd3619bc9bb6a5332837 Approved-By: Pedro Alves <pedro@palves.net>
2024-01-12Update copyright year range in header of all files managed by GDBAndrew Burgess1-1/+1
This commit is the result of the following actions: - Running gdb/copyright.py to update all of the copyright headers to include 2024, - Manually updating a few files the copyright.py script told me to update, these files had copyright headers embedded within the file, - Regenerating gdbsupport/Makefile.in to refresh it's copyright date, - Using grep to find other files that still mentioned 2023. If these files were updated last year from 2022 to 2023 then I've updated them this year to 2024. I'm sure I've probably missed some dates. Feel free to fix them up as you spot them.
2023-11-29Use C++17 [[fallthrough]] attributeTom Tromey1-1/+1
This changes gdb to use the C++17 [[fallthrough]] attribute rather than special comments. This was mostly done by script, but I neglected a few spellings and so also fixed it up by hand. I suspect this fixes the bug mentioned below, by switching to a standard approach that, presumably, clang supports. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=23159 Approved-By: John Baldwin <jhb@FreeBSD.org> Approved-By: Luis Machado <luis.machado@arm.com> Approved-By: Pedro Alves <pedro@palves.net>
2023-11-21gdb: Replace gdb::optional with std::optionalLancelot Six1-3/+3
Since GDB now requires C++17, we don't need the internally maintained gdb::optional implementation. This patch does the following replacing: - gdb::optional -> std::optional - gdb::in_place -> std::in_place - #include "gdbsupport/gdb_optional.h" -> #include <optional> This change has mostly been done automatically. One exception is gdbsupport/thread-pool.* which did not use the gdb:: prefix as it already lives in the gdb namespace. Change-Id: I19a92fa03e89637bab136c72e34fd351524f65e9 Approved-By: Tom Tromey <tom@tromey.com> Approved-By: Pedro Alves <pedro@palves.net>
2023-10-10gdb: remove target_gdbarchSimon Marchi1-1/+1
This function is just a wrapper around the current inferior's gdbarch. I find that having that wrapper just obscures where the arch is coming from, and that it's often used as "I don't know which arch to use so I'll use this magical target_gdbarch function that gets me an arch" when the arch should in fact come from something in the context (a thread, objfile, symbol, etc). I think that removing it and inlining `current_inferior ()->arch ()` everywhere will make it a bit clearer where that arch comes from and will trigger people into reflecting whether this is the right place to get the arch or not. Change-Id: I79f14b4e4934c88f91ca3a3155f5fc3ea2fadf6b Reviewed-By: John Baldwin <jhb@FreeBSD.org> Approved-By: Andrew Burgess <aburgess@redhat.com>
2023-09-26fbsd-nat: Fix build failure with GCC 12Enze Li1-1/+1
A user pointed out that the build failed on FreeBSD/amd64 with my last commit. The problem is that I'm not using the proper way to tell the compiler that the variable has been "used". This patch fixes this issue as suggested by John. Pushed as obvious. Tested both on FreeBSD/amd64 and FreeBSD/aarch64 by rebuilding. Suggested-By: John Baldwin <jhb@FreeBSD.org>
2023-09-22fbsd-nat: Pacify gcc with no functional changesEnze Li1-5/+6
I see these errors on FreeBSD/aarch64 when using gcc 12 without passing --disable-werror. ===================================================================== CXX fbsd-nat.o fbsd-nat.c: In member function 'void fbsd_nat_target::resume_one_process(ptid_t, int, gdb_signal)': fbsd-nat.c:1208:11: error: unused variable 'request' [-Werror=unused-variable] 1208 | int request; | ^~~~~~~ fbsd-nat.c: In member function 'virtual ptid_t fbsd_nat_target::wait(ptid_t, target_waitstatus*, target_wait_flags)': fbsd-nat.c:1726:22: error: declaration of 'inf' shadows a previous local [-Werror=shadow=compatible-local] 1726 | for (inferior *inf : all_non_exited_inferiors (this)) | ^~~ fbsd-nat.c:1697:17: note: shadowed declaration is here 1697 | inferior *inf = find_inferior_ptid (this, wptid); | ^~~ fbsd-nat.c: In member function 'virtual void fbsd_nat_target::detach(inferior*, int)': fbsd-nat.c:2044:18: error: variable 'wptid' set but not used [-Werror=unused-but-set-variable] 2044 | ptid_t wptid = wait_1 (ptid, &ws, 0); | ^~~~~ cc1plus: all warnings being treated as errors ===================================================================== This patch includes the following non-functional changes, 1. Remove unused variable "request". 2. Rename inf to inf_p to avoid shadowed declaration warnings. 3. Mark wptid as used when USE_SIGTRAP_SIGINFO is defined. Tested on FreeBSD/aarch64 by rebuilding. Approved-By: John Baldwin <jhb@FreeBSD.org>
2023-08-23gdb: centralize "[Thread ...exited]" notificationsPedro Alves1-3/+0
Currently, each target backend is responsible for printing "[Thread ...exited]" before deleting a thread. This leads to unnecessary differences between targets, like e.g. with the remote target, we never print such messages, even though we do print "[New Thread ...]". E.g., debugging the gdb.threads/attach-many-short-lived-threads.exp with gdbserver, letting it run for a bit, and then pressing Ctrl-C, we currently see: (gdb) c Continuing. ^C[New Thread 3850398.3887449] [New Thread 3850398.3887500] [New Thread 3850398.3887551] [New Thread 3850398.3887602] [New Thread 3850398.3887653] ... Thread 1 "attach-many-sho" received signal SIGINT, Interrupt. 0x00007ffff7e6a23f in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=req@entry=0x7fffffffda80, rem=rem@entry=0x7fffffffda80) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78 78 in ../sysdeps/unix/sysv/linux/clock_nanosleep.c (gdb) Above, we only see "New Thread" notifications, even though threads were deleted. After this patch, we'll see: (gdb) c Continuing. ^C[Thread 3558643.3577053 exited] [Thread 3558643.3577104 exited] [Thread 3558643.3577155 exited] [Thread 3558643.3579603 exited] ... [New Thread 3558643.3597415] [New Thread 3558643.3600015] [New Thread 3558643.3599965] ... Thread 1 "attach-many-sho" received signal SIGINT, Interrupt. 0x00007ffff7e6a23f in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=req@entry=0x7fffffffda80, rem=rem@entry=0x7fffffffda80) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78 78 in ../sysdeps/unix/sysv/linux/clock_nanosleep.c (gdb) q This commit fixes this by moving the thread exit printing to common code instead, triggered from within delete_thread (or rather, set_thread_exited). There's one wrinkle, though. While most targest want to print: [Thread ... exited] the Windows target wants to print: [Thread ... exited with code <exit_code>] ... and sometimes wants to suppress the notification for the main thread. To address that, this commits adds a delete_thread_with_code function, only used by that target (so far). This fix was originally posted as part of a larger series: https://inbox.sourceware.org/gdb-patches/20221212203101.1034916-1-pedro@palves.net/ But didn't really need to be part of that series. In order to get this fix merged sooner, I (Andrew Burgess) have rebased this commit outside of the original series. Any bugs introduced while splitting this patch out and rebasing, are entirely my own. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30129 Co-Authored-By: Andrew Burgess <aburgess@redhat.com>
2023-08-14fbsd-nat: Stop a process if it is running before killing it.John Baldwin1-17/+76
In addition, detach from any child processes implicitly attached to by the kernel due to fork following that have not yet been processed by GDB's core.
2023-08-14fbsd-nat: Fix thread_alive against a running thread.John Baldwin1-1/+7
FreeBSD's ptrace fails requests with EBUSY against a running process. Report that the thread is alive instead of dead if ptrace fails with EBUSY. This fixes an internal error in the gdb.threads/detach-step-over.exp test where one process was detached while a thread in a second process was being stepped. The core incorrectly assumed the stepping thread had vanished and discarded the pending stepping state. When the thread later reported a SIGTRAP from completing the step, this triggered an assertion.
2023-08-14fbsd-nat: Fix several issues with detaching.John Baldwin1-0/+262
- Detach from any child processes implicitly attached to by the kernel due to fork following that have not yet been processed by GDB's core. - Delete breakpoints before detaching. inf-ptrace::detach does not do this (somewhat surprisingly), so add an override to remove breakpoints from a process before detaching from it. This also requires explicitly draining any pending SIGTRAP events for software breakpoints before detaching. In particular, threads may need their PC adjusted due to the software breakpoint before being resumed after detach. On more modern systems using the si_code from SIGTRAP to identify software breakpoint traps, the PC is adjusted in ::wait_1 as a side effect of parsing the event. To support older kernels, ::detach fixes up the PC for any SIGTRAP stop whose potential new PC matches an existing software breakpoint.
2023-08-14fbsd-nat: Fix resuming and waiting with multiple processes.John Baldwin1-84/+311
I did not fully understand the requirements of multiple process support when I enabled it previously and several parts were broken. In particular, the resume method was only resuming a single process, and wait was not stopping other processes when reporting an event. To support multiple running inferiors, add a new per-inferior structure which trackes the number of existing and running LWPs for each process. The structure also stores a ptid_t describing the set of LWPs currently resumed for each process. For the resume method, iterate over all non-exited inferiors resuming each process matching the passed in ptid rather than only resuming the current inferior's process for a wildcard ptid. If a resumed process has a pending event, don't actually resume the process, but other matching processes without a pending event are still resumed in case the later call to the wait method requests an event from one of the processes without a pending event. For the wait method, stop other running processes before returning an event to the core. When stopping a process, first check to see if an event is already pending. If it is, queue the event to be reported later. If not, send a SIGSTOP to the process and wait for it to stop. If the event reported by the wait is not for the SIGSTOP, queue the event and remember to ignore a future SIGSTOP event for the process. Note that, unlike the Linux native target, entire processes are stopped rather than individual LWPs. In FreeBSD one can only wait on processes (via pid), not for an event from a specific thread. Other changes in this commit handle bookkeeping for the per-inferior data such as migrating the data to the new inferior in the follow_exec method. The per-inferior data is created in the attach, create_inferior, and follow_fork methods.
2023-08-14fbsd-nat: Defer any ineligible events reported by wait.John Baldwin1-1/+34
If wait_1 finds an event for a thread or process that does not match the set of threads and processes previously resumed, defer the event. If the event is for a specific thread, suspend the thread and continue the associated process before waiting for another event. One specific example of such an event is if a thread is created while another thread in the same process hits a breakpoint. If the second thread's event is reported first, the target resume method does not yet "know" about the new thread and will not suspend it via PT_SUSPEND. When wait is called, it will probably return the event from the first thread before the result of the step from second thread. This is the case reported in PR 21497. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=21497
2023-08-14fbsd-nat: Add a list of pending events.John Baldwin1-55/+73
The m_pending_events list stores a queue of deferred events that might be reported by the next call to the target's wait method. The set of events that are eligible is filtered by the ptid passed to resume. For now this just replaces the list of vfork_done events. A subsequent commit will reuse this to store other events.
2023-04-04gdb: make find_thread_ptid a process_stratum_target methodSimon Marchi1-1/+1
Make find_thread_ptid (the overload that takes a process_stratum_target) a method of process_stratum_target. Change-Id: Ib190a925a83c6b93e9c585dc7c6ab65efbdd8629 Reviewed-By: Tom Tromey <tom@tromey.com>
2023-03-27fbsd-nat: Use correct constant for target_waitstatus::sig.John Baldwin1-1/+1
Use GDB_SIGNAL_TRAP instead of SIGTRAP. This is a no-op since the value of SIGTRAP on FreeBSD matches the value of GDB_SIGNAL_TRAP, but it is more correct. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-03-27fbsd-nat: Avoid a direct write to target_waitstatus::kind.John Baldwin1-1/+1
This is in #ifdef'd code for a workaround for FreeBSD versions older than 11.1 which is why it wasn't caught earlier. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-03-27fbsd-nat: Add missing spaces.John Baldwin1-11/+11
No functional change, just style fixes. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2023-01-01Update copyright year range in header of all files managed by GDBJoel Brobecker1-1/+1
This commit is the result of running the gdb/copyright.py script, which automated the update of the copyright year range for all source files managed by the GDB project to be updated to include year 2023.
2022-11-22fbsd-nat: Pass an optional register base to the register set helpers.John Baldwin1-15/+19
This is needed to permit using the helpers for register sets with a variable base. In particular regnum needs to be converted into a relative register number before passed to regcache_map_supplies. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2022-11-22fbsd-nat: Use regset supply/collect methods.John Baldwin1-4/+4
fbsd-nat includes various helper routines for fetching and storing register sets via ptrace where the register set is described by a regset. These helper routines directly invoke the supply/collect_regset regcache methods which doesn't permit a regset to provide custom logic when fetching or storing a register set. Instead, just use the function pointers from the struct regset directly. Approved-By: Simon Marchi <simon.marchi@efficios.com>
2022-10-19internal_error: remove need to pass __FILE__/__LINE__Pedro Alves1-1/+1
Currently, every internal_error call must be passed __FILE__/__LINE__ explicitly, like: internal_error (__FILE__, __LINE__, "foo %d", var); The need to pass in explicit __FILE__/__LINE__ is there probably because the function predates widespread and portable variadic macros availability. We can use variadic macros nowadays, and in fact, we already use them in several places, including the related gdb_assert_not_reached. So this patch renames the internal_error function to something else, and then reimplements internal_error as a variadic macro that expands __FILE__/__LINE__ itself. The result is that we now should call internal_error like so: internal_error ("foo %d", var); Likewise for internal_warning. The patch adjusts all calls sites. 99% of the adjustments were done with a perl/sed script. The non-mechanical changes are in gdbsupport/errors.h, gdbsupport/gdb_assert.h, and gdb/gdbarch.py. Approved-By: Simon Marchi <simon.marchi@efficios.com> Change-Id: Ia6f372c11550ca876829e8fd85048f4502bdcf06
2022-08-02fbsd-nat: Correct the return type of the have_regset method.John Baldwin1-1/+1
During the development of 40c23d880386d6e8202567eaa2a6b041feb1a652, the return value of fbsd_nat_target::have_regset was changed from a simple boolean to returning the size of the register set. The comments and callers were all updated for this change, but the actual return type was accidentally left as a bool. This change fixes the return type to be a size_t. Current callers of this only checked the value against 0 and thus still worked correctly.
2022-07-26gdb/hurd: pass memory_tagged as false to find_memory_region_ftypeEnze Li1-1/+1
I tried building GDB on GNU/Hurd, and ran into this error: CXX gnu-nat.o gnu-nat.c: In member function ‘virtual int gnu_nat_target::find_memory_regions(find_memory_region_ftype, void*)’: gnu-nat.c:2620:21: error: too few arguments to function 2620 | (*func) (last_region_address, | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~ 2621 | last_region_end - last_region_address, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2622 | last_protection & VM_PROT_READ, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | last_protection & VM_PROT_WRITE, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2624 | last_protection & VM_PROT_EXECUTE, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2625 | 1, /* MODIFIED is unknown, pass it as true. */ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2626 | data); | ~~~~~ gnu-nat.c:2635:13: error: too few arguments to function 2635 | (*func) (last_region_address, last_region_end - last_region_address, | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2636 | last_protection & VM_PROT_READ, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2637 | last_protection & VM_PROT_WRITE, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | last_protection & VM_PROT_EXECUTE, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2639 | 1, /* MODIFIED is unknown, pass it as true. */ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2640 | data); | ~~~~~ make[2]: *** [Makefile:1926: gnu-nat.o] Error 1 This is because in this commit: commit 68cffbbd4406b4efe1aa6e18460b1d7ca02549f1 Date: Thu Mar 31 11:42:35 2022 +0100 [AArch64] MTE corefile support Added a new argument to find_memory_region_ftype, but did not pass it to the function in gnu-nat.c. Fix this by passing memory_tagged as false. As Luis pointed out, similar bugs may also appear on FreeBSD and NetBSD, and I have reproduced them on both systems. This patch fixes them incidentally. Tested by rebuilding on GNU/Hurd, FreeBSD/amd64 and NetBSD/amd64.
2022-07-22Change target_ops::async to accept boolTom Tromey1-2/+2
This changes the parameter of target_ops::async from int to bool. Regression tested on x86-64 Fedora 34.
2022-06-08gdb: remove trailing '.' from perror_with_name callsAndrew Burgess1-1/+1
I ran into this error while working on AArch64 GDB: Unable to fetch VFP registers.: Invalid argument. Notice the '.:' in the middle of this error message. This is because of this call in aarch64-linux-nat.c: perror_with_name (_("Unable to fetch VFP registers.")); The perror_with_name function take a string, and adds ': <message>' to the end the string, so I don't think the string that we pass to perror_with_name should end in '.'. This commit removes all of the trailing '.' characters from perror_with_name calls, which give more readable error messages. I don't believe that any of these errors are tested in the testsuite (after a little grepping).
2022-05-13Constify target_pid_to_exec_fileTom Tromey1-1/+1
This changes target_pid_to_exec_file and target_ops::pid_to_exec_file to return a "const char *". I couldn't build many of these targets, but did examine the code by hand -- also, as this only affects the return type, it's normally pretty safe. This brings gdb and gdbserver a bit closer, and allows for the removal of a const_cast as well.
2022-05-03fbsd-nat: Add helper routines for register sets using PT_[G]SETREGSET.John Baldwin1-0/+75
FreeBSD's kernel has recently added PT_GETREGSET and PT_SETREGSET operations to fetch a register set named by an ELF note type. These helper routines provide helpers to check for a register set's existence, fetch registers for a register set, and store registers to a register set.
2022-03-29Unify gdb printf functionsTom Tromey1-74/+74
Now that filtered and unfiltered output can be treated identically, we can unify the printf family of functions. This is done under the name "gdb_printf". Most of this patch was written by script.
2022-03-29Remove some uses of printf_unfilteredTom Tromey1-2/+2
A number of spots call printf_unfiltered only because they are in code that should not be interrupted by the pager. However, I believe these cases are all handled by infrun's blanket ban on paging, and so can be converted to the default (_filtered) API. After this patch, I think all the remaining _unfiltered calls are ones that really ought to be. A few -- namely in complete_command -- could be replaced by a scoped assignment to pagination_enabled, but for the remainder, the code seems simple enough like this.
2022-03-22fbsd-nat: Add a low_prepare_to_resume virtual method.John Baldwin1-2/+7
This method can be overridden by architecture-specific targets to perform additional work before a thread is resumed.
2022-03-22fbsd-nat: Add a low_delete_thread virtual method.John Baldwin1-0/+1
This method can be overridden by architecture-specific targets to perform additional work when a thread is deleted. Note that this method is only invoked on systems supporting LWP events, but the pending use case (aarch64 debug registers) is not supported on older kernels that do not support LWP events.
2022-03-22fbsd-nat: Add helper routine to fetch siginfo_t for a ptid.John Baldwin1-0/+16
2022-03-22fbsd-nat: Add a low_new_fork virtual method.John Baldwin1-0/+2
This method can be overridden by architecture-specific targets to perform additional work when a new child process is forked.
2022-02-22inf-ptrace: Add an event_pipe to be used for async mode in subclasses.John Baldwin1-41/+9
Subclasses of inf_ptrace_target have to opt-in to using the event_pipe by implementing the can_async_p and async methods. For subclasses which do this, inf_ptrace_target provides is_async_p, async_wait_fd and closes the pipe in the close target method. inf_ptrace_target also provides wrapper routines around the event pipe (async_file_open, async_file_close, async_file_flush, and async_file_mark) for use in target methods such as async. inf_ptrace_target also exports a static async_file_mark_if_open function which can be used in SIGCHLD signal handlers.
2022-02-22Enable async mode in the target in attach_cmd.John Baldwin1-13/+0
If the attach target supports async mode, enable it after the attach target's ::attach method returns.
2022-02-22fbsd-nat: Return nullptr rather than failing ::thread_name.John Baldwin1-2/+2
ptrace on FreeBSD cannot be used against running processes and instead fails with EBUSY. This meant that 'info threads' would fail if any of the threads were running (for example when using schedule-multiple=on in gdb.base/fork-running-state.exp). Instead of throwing errors, just return nullptr as no thread name is better than causing info threads to fail completely.
2022-02-22fbsd-nat: Various cleanups to the ::resume entry debug message.John Baldwin1-2/+3
Move the message from 'show debug fbsd-lwp' to 'show debug fbsd-nat' since it is helpful for debugging async target support and not just LWP support. Use target_pid_to_str to format the ptid and log the step and signo arguments.
2022-02-22fbsd-nat: Include ptrace operation in error messages.John Baldwin1-16/+18
2022-02-22fbsd-nat: Implement async target support.John Baldwin1-2/+152
This is a fairly simple version of async target support. Synchronous mode still uses blocking waitpid() calls in inf_ptrace::wait() unlike the Linux native target which always uses WNOHANG and uses sigsuspend() for synchronous operation. Asynchronous mode registers an event pipe with the core as a file handle and writes to the pipe when SIGCHLD is raised. TARGET_WNOHANG is handled by inf_ptrace::wait().
2022-01-28fbsd-nat: Return a bool from fetch_register_set and store_register_set.John Baldwin1-2/+6
Change these helper functions to return true if they did any work.
2022-01-25Reduce explicit use of gdb_stdoutTom Tromey1-7/+6
In an earlier version of the pager rewrite series, it was important to audit unfiltered output calls to see which were truly necessary. This is no longer necessary, but it still seems like a decent cleanup to change calls to avoid explicitly passing gdb_stdout. That is, rather than using something like fprintf_unfiltered with gdb_stdout, the code ought to use plain printf_unfiltered instead. This patch makes this change. I went ahead and converted all the _filtered calls I could find, as well, for the same clarity.
2022-01-19fbsd-nat: Add include for gdb_argv.John Baldwin1-0/+1
2022-01-01Automatic Copyright Year update after running gdb/copyright.pyJoel Brobecker1-1/+1
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
2021-12-13gdb: make post_startup_inferior a virtual method on inf_ptrace_targetAndrew Burgess1-1/+1
While working on a later patch that required me to understand how GDB starts up inferiors, I was confused by the target_ops::post_startup_inferior method. The post_startup_inferior target function is only called from inf_ptrace_target::create_inferior. Part of the target class hierarchy looks like this: inf_child_target | '-- inf_ptrace_target | |-- linux_nat_target | |-- fbsd_nat_target | |-- nbsd_nat_target | |-- obsd_nat_target | '-- rs6000_nat_target Every sub-class of inf_ptrace_target, except rs6000_nat_target, implements ::post_startup_inferior. The rs6000_nat_target picks up the implementation of ::post_startup_inferior not from inf_ptrace_target, but from inf_child_target. No descendent of inf_child_target, outside the inf_ptrace_target sub-tree, implements ::post_startup_inferior, which isn't really surprising, as they would never see the method called (remember, the method is only called from inf_ptrace_target::create_inferior). What I find confusing is the role inf_child_target plays in implementing, what is really a helper function for just one of its descendents. In this commit I propose that we formally make ::post_startup_inferior a helper function of inf_ptrace_target. To do this I will remove the ::post_startup_inferior from the target_ops API, and instead make this a protected, pure virtual function on inf_ptrace_target. I'll remove the empty implementation of ::post_startup_inferior from the inf_child_target class, and add a new empty implementation to the rs6000_nat_target class. All the other descendents of inf_ptrace_target already provide an implementation of this method and so don't need to change beyond making the method protected within their class declarations. To me, this makes much more sense now. The helper function, which is only called from within the inf_ptrace_target class, is now a part of the inf_ptrace_target class. The only way in which this change is visible to a user is if the user turns on 'set debug target 1'. With this debug flag on, prior to this patch the user would see something like: -> native->post_startup_inferior (...) <- native->post_startup_inferior (2588939) After this patch these lines are no longer present, as the post_startup_inferior is no longer a top level target method. For me, this is an acceptable change.
2021-10-21gdb, gdbserver: make target_waitstatus safeSimon Marchi1-15/+18
I stumbled on a bug caused by the fact that a code path read target_waitstatus::value::sig (expecting it to contain a gdb_signal value) while target_waitstatus::kind was TARGET_WAITKIND_FORKED. This meant that the active union field was in fact target_waitstatus::value::related_pid, and contained a ptid. The read signal value was therefore garbage, and that caused GDB to crash soon after. Or, since that GDB was built with ubsan, this nice error message: /home/simark/src/binutils-gdb/gdb/linux-nat.c:1271:12: runtime error: load of value 2686365, which is not a valid value for type 'gdb_signal' Despite being a large-ish change, I think it would be nice to make target_waitstatus safe against that kind of bug. As already done elsewhere (e.g. dynamic_prop), validate that the type of value read from the union matches what is supposed to be the active field. - Make the kind and value of target_waitstatus private. - Make the kind initialized to TARGET_WAITKIND_IGNORE on target_waitstatus construction. This is what most users appear to do explicitly. - Add setters, one for each kind. Each setter takes as a parameter the data associated to that kind, if any. This makes it impossible to forget to attach the associated data. - Add getters, one for each associated data type. Each getter validates that the data type fetched by the user matches the wait status kind. - Change "integer" to "exit_status", "related_pid" to "child_ptid", just because that's more precise terminology. - Fix all users. That last point is semi-mechanical. There are a lot of obvious changes, but some less obvious ones. For example, it's not possible to set the kind at some point and the associated data later, as some users did. But in any case, the intent of the code should not change in this patch. This was tested on x86-64 Linux (unix, native-gdbserver and native-extended-gdbserver boards). It was built-tested on x86-64 FreeBSD, NetBSD, MinGW and macOS. The rest of the changes to native files was done as a best effort. If I forgot any place to update in these files, it should be easy to fix (unless the change happens to reveal an actual bug). Change-Id: I0ae967df1ff6e28de78abbe3ac9b4b2ff4ad03b7
2021-09-23Change get_ada_task_ptid parameter typeTom Tromey1-2/+2
get_ada_task_ptid currently takes a 'long' as its 'thread' parameter type. However, on some platforms this is actually a pointer, and using 'long' can sometimes end up with the value being sign-extended. This sign extension can cause problems later, if the tid is then later used as an address again. This patch changes the parameter type to ULONGEST and updates all the uses. This approach preserves sign extension on the targets where it is apparently intended, while avoiding it on others. Co-Authored-By: John Baldwin <jhb@FreeBSD.org>
2021-09-23Remove defaulted 'tid' parameter to ptid_t constructorTom Tromey1-3/+3
I wanted to find, and potentially modify, all the spots where the 'tid' parameter to the ptid_t constructor was used. So, I temporarily removed this parameter and then rebuilt. In order to make it simpler to search through the "real" (nonzero) uses of this parameter, something I knew I'd have to do multiple times, I removed any ", 0" from constructor calls. Co-Authored-By: John Baldwin <jhb@FreeBSD.org>
2021-08-30fbsd-nat: Don't use '%jd' and '%ju' with printf_filtered.John Baldwin1-22/+23
The handler for 'info proc status' for native processes on FreeBSD uses the 'j' size modifier along with uintmax_t / intmax_t casts to output integer values for types such as off_t that are not aliases of a basic C type such as 'int' or 'long'. printf_filtered does not support the 'j' modifer, so this resulted in runtime errors in practice: (gdb) info proc stat process 8674 Name: ls State: T (stopped) Parent process: 8673 Process group: 8674 Session id: 2779 Unrecognized format specifier 'j' in printf Instead, use plongest and pulongest to generate the output strings of these integer values.