diff options
Diffstat (limited to 'gdbserver/linux-low.cc')
-rw-r--r-- | gdbserver/linux-low.cc | 3611 |
1 files changed, 1764 insertions, 1847 deletions
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 5cd2282..55788bb 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -73,47 +73,43 @@ /* Some targets did not define these ptrace constants from the start, so gdbserver defines them locally here. In the future, these may be removed after they are added to asm/ptrace.h. */ -#if !(defined(PT_TEXT_ADDR) \ - || defined(PT_DATA_ADDR) \ +#if !(defined(PT_TEXT_ADDR) || defined(PT_DATA_ADDR) \ || defined(PT_TEXT_END_ADDR)) #if defined(__mcoldfire__) /* These are still undefined in 3.10 kernels. */ -#define PT_TEXT_ADDR 49*4 -#define PT_DATA_ADDR 50*4 -#define PT_TEXT_END_ADDR 51*4 +#define PT_TEXT_ADDR 49 * 4 +#define PT_DATA_ADDR 50 * 4 +#define PT_TEXT_END_ADDR 51 * 4 /* These are still undefined in 3.10 kernels. */ #elif defined(__TMS320C6X__) -#define PT_TEXT_ADDR (0x10000*4) -#define PT_DATA_ADDR (0x10004*4) -#define PT_TEXT_END_ADDR (0x10008*4) +#define PT_TEXT_ADDR (0x10000 * 4) +#define PT_DATA_ADDR (0x10004 * 4) +#define PT_TEXT_END_ADDR (0x10008 * 4) #endif #endif -#if (defined(__UCLIBC__) \ - && defined(HAS_NOMMU) \ - && defined(PT_TEXT_ADDR) \ - && defined(PT_DATA_ADDR) \ - && defined(PT_TEXT_END_ADDR)) +#if (defined(__UCLIBC__) && defined(HAS_NOMMU) && defined(PT_TEXT_ADDR) \ + && defined(PT_DATA_ADDR) && defined(PT_TEXT_END_ADDR)) #define SUPPORTS_READ_OFFSETS #endif #ifdef HAVE_LINUX_BTRACE -# include "nat/linux-btrace.h" -# include "gdbsupport/btrace-common.h" +#include "nat/linux-btrace.h" +#include "gdbsupport/btrace-common.h" #endif #ifndef HAVE_ELF32_AUXV_T /* Copied from glibc's elf.h. */ typedef struct { - uint32_t a_type; /* Entry type */ + uint32_t a_type; /* Entry type */ union - { - uint32_t a_val; /* Integer value */ - /* We use to have pointer elements added here. We cannot do that, + { + uint32_t a_val; /* Integer value */ + /* We use to have pointer elements added here. We cannot do that, though, since it does not work when using 32-bit definitions on 64-bit platforms and vice versa. */ - } a_un; + } a_un; } Elf32_auxv_t; #endif @@ -121,14 +117,14 @@ typedef struct /* Copied from glibc's elf.h. */ typedef struct { - uint64_t a_type; /* Entry type */ + uint64_t a_type; /* Entry type */ union - { - uint64_t a_val; /* Integer value */ - /* We use to have pointer elements added here. We cannot do that, + { + uint64_t a_val; /* Integer value */ + /* We use to have pointer elements added here. We cannot do that, though, since it does not work when using 32-bit definitions on 64-bit platforms and vice versa. */ - } a_un; + } a_un; } Elf64_auxv_t; #endif @@ -157,8 +153,7 @@ ptid_of_lwp (struct lwp_info *lwp) /* See nat/linux-nat.h. */ void -lwp_set_arch_private_info (struct lwp_info *lwp, - struct arch_lwp_info *info) +lwp_set_arch_private_info (struct lwp_info *lwp, struct arch_lwp_info *info) { lwp->arch_private = info; } @@ -234,27 +229,27 @@ pull_pid_from_list (struct simple_pid_list **listp, int pid, int *statusp) for (p = listp; *p != NULL; p = &(*p)->next) if ((*p)->pid == pid) { - struct simple_pid_list *next = (*p)->next; + struct simple_pid_list *next = (*p)->next; - *statusp = (*p)->status; - xfree (*p); - *p = next; - return 1; + *statusp = (*p)->status; + xfree (*p); + *p = next; + return 1; } return 0; } enum stopping_threads_kind - { - /* Not stopping threads presently. */ - NOT_STOPPING_THREADS, +{ + /* Not stopping threads presently. */ + NOT_STOPPING_THREADS, - /* Stopping threads. */ - STOPPING_THREADS, + /* Stopping threads. */ + STOPPING_THREADS, - /* Stopping and suspending threads. */ - STOPPING_AND_SUSPENDING_THREADS - }; + /* Stopping and suspending threads. */ + STOPPING_AND_SUSPENDING_THREADS +}; /* This is set while stop_all_lwps is in effect. */ static stopping_threads_kind stopping_threads = NOT_STOPPING_THREADS; @@ -270,7 +265,8 @@ static void unsuspend_all_lwps (struct lwp_info *except); static void mark_lwp_dead (struct lwp_info *lwp, int wstat); static int lwp_is_marked_dead (struct lwp_info *lwp); static int kill_lwp (unsigned long lwpid, int signo); -static void enqueue_pending_signal (struct lwp_info *lwp, int signal, siginfo_t *info); +static void enqueue_pending_signal (struct lwp_info *lwp, int signal, + siginfo_t *info); static int linux_low_ptrace_options (int attached); static int check_ptrace_stopped_lwp_gone (struct lwp_info *lp); @@ -300,7 +296,7 @@ std::vector<CORE_ADDR> linux_process_target::low_get_next_pcs (regcache *regcache) { gdb_assert_not_reached ("linux target op low_get_next_pcs is not " - "implemented"); + "implemented"); } int @@ -339,7 +335,6 @@ elf_64_header_p (const Elf64_Ehdr *header, unsigned int *machine) { *machine = header->e_machine; return header->e_ident[EI_CLASS] == ELFCLASS64; - } *machine = EM_NONE; return -1; @@ -431,7 +426,6 @@ linux_process_target::add_linux_process_no_mem_file (int pid, int attached) return proc; } - process_info * linux_process_target::add_linux_process (int pid, int attached) { @@ -485,7 +479,7 @@ linux_process_target::arch_setup_thread (thread_info *thread) int linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, - int wstat) + int wstat) { client_state &cs = get_client_state (); struct lwp_info *event_lwp = *orig_event_lwp; @@ -509,129 +503,126 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, /* Get the pid of the new lwp. */ ptrace (PTRACE_GETEVENTMSG, lwpid_of (event_thr), (PTRACE_TYPE_ARG3) 0, - &new_pid); + &new_pid); /* If we haven't already seen the new PID stop, wait for it now. */ if (!pull_pid_from_list (&stopped_pids, new_pid, &status)) - { - /* The new child has a pending SIGSTOP. We can't affect it until it + { + /* The new child has a pending SIGSTOP. We can't affect it until it hits the SIGSTOP, but we're already attached. */ - ret = my_waitpid (new_pid, &status, __WALL); + ret = my_waitpid (new_pid, &status, __WALL); - if (ret == -1) - perror_with_name ("waiting for new child"); - else if (ret != new_pid) - warning ("wait returned unexpected PID %d", ret); - else if (!WIFSTOPPED (status)) - warning ("wait returned unexpected status 0x%x", status); - } + if (ret == -1) + perror_with_name ("waiting for new child"); + else if (ret != new_pid) + warning ("wait returned unexpected PID %d", ret); + else if (!WIFSTOPPED (status)) + warning ("wait returned unexpected status 0x%x", status); + } if (event == PTRACE_EVENT_FORK || event == PTRACE_EVENT_VFORK) - { - struct process_info *parent_proc; - struct process_info *child_proc; - struct lwp_info *child_lwp; - struct thread_info *child_thr; + { + struct process_info *parent_proc; + struct process_info *child_proc; + struct lwp_info *child_lwp; + struct thread_info *child_thr; - ptid = ptid_t (new_pid, new_pid); + ptid = ptid_t (new_pid, new_pid); - threads_debug_printf ("Got fork event from LWP %ld, " - "new child is %d", - ptid_of (event_thr).lwp (), - ptid.pid ()); + threads_debug_printf ("Got fork event from LWP %ld, " + "new child is %d", + ptid_of (event_thr).lwp (), ptid.pid ()); - /* Add the new process to the tables and clone the breakpoint + /* Add the new process to the tables and clone the breakpoint lists of the parent. We need to do this even if the new process will be detached, since we will need the process object and the breakpoints to remove any breakpoints from memory when we detach, and the client side will access registers. */ - child_proc = add_linux_process (new_pid, 0); - gdb_assert (child_proc != NULL); - child_lwp = add_lwp (ptid); - gdb_assert (child_lwp != NULL); - child_lwp->stopped = 1; - child_lwp->must_set_ptrace_flags = 1; - child_lwp->status_pending_p = 0; - child_thr = get_lwp_thread (child_lwp); - child_thr->last_resume_kind = resume_stop; - child_thr->last_status.set_stopped (GDB_SIGNAL_0); - - /* If we're suspending all threads, leave this one suspended + child_proc = add_linux_process (new_pid, 0); + gdb_assert (child_proc != NULL); + child_lwp = add_lwp (ptid); + gdb_assert (child_lwp != NULL); + child_lwp->stopped = 1; + child_lwp->must_set_ptrace_flags = 1; + child_lwp->status_pending_p = 0; + child_thr = get_lwp_thread (child_lwp); + child_thr->last_resume_kind = resume_stop; + child_thr->last_status.set_stopped (GDB_SIGNAL_0); + + /* If we're suspending all threads, leave this one suspended too. If the fork/clone parent is stepping over a breakpoint, all other threads have been suspended already. Leave the child suspended too. */ - if (stopping_threads == STOPPING_AND_SUSPENDING_THREADS - || event_lwp->bp_reinsert != 0) - { - threads_debug_printf ("leaving child suspended"); - child_lwp->suspended = 1; - } - - parent_proc = get_thread_process (event_thr); - child_proc->attached = parent_proc->attached; - - if (event_lwp->bp_reinsert != 0 - && supports_software_single_step () - && event == PTRACE_EVENT_VFORK) - { - /* If we leave single-step breakpoints there, child will + if (stopping_threads == STOPPING_AND_SUSPENDING_THREADS + || event_lwp->bp_reinsert != 0) + { + threads_debug_printf ("leaving child suspended"); + child_lwp->suspended = 1; + } + + parent_proc = get_thread_process (event_thr); + child_proc->attached = parent_proc->attached; + + if (event_lwp->bp_reinsert != 0 && supports_software_single_step () + && event == PTRACE_EVENT_VFORK) + { + /* If we leave single-step breakpoints there, child will hit it, so uninsert single-step breakpoints from parent (and child). Once vfork child is done, reinsert them back to parent. */ - uninsert_single_step_breakpoints (event_thr); - } + uninsert_single_step_breakpoints (event_thr); + } - clone_all_breakpoints (child_thr, event_thr); + clone_all_breakpoints (child_thr, event_thr); - target_desc_up tdesc = allocate_target_description (); - copy_target_description (tdesc.get (), parent_proc->tdesc); - child_proc->tdesc = tdesc.release (); + target_desc_up tdesc = allocate_target_description (); + copy_target_description (tdesc.get (), parent_proc->tdesc); + child_proc->tdesc = tdesc.release (); - /* Clone arch-specific process data. */ - low_new_fork (parent_proc, child_proc); + /* Clone arch-specific process data. */ + low_new_fork (parent_proc, child_proc); - /* Save fork info in the parent thread. */ - if (event == PTRACE_EVENT_FORK) - event_lwp->waitstatus.set_forked (ptid); - else if (event == PTRACE_EVENT_VFORK) - event_lwp->waitstatus.set_vforked (ptid); + /* Save fork info in the parent thread. */ + if (event == PTRACE_EVENT_FORK) + event_lwp->waitstatus.set_forked (ptid); + else if (event == PTRACE_EVENT_VFORK) + event_lwp->waitstatus.set_vforked (ptid); - /* The status_pending field contains bits denoting the + /* The status_pending field contains bits denoting the extended event, so when the pending event is handled, the handler will look at lwp->waitstatus. */ - event_lwp->status_pending_p = 1; - event_lwp->status_pending = wstat; + event_lwp->status_pending_p = 1; + event_lwp->status_pending = wstat; - /* Link the threads until the parent event is passed on to + /* Link the threads until the parent event is passed on to higher layers. */ - event_lwp->fork_relative = child_lwp; - child_lwp->fork_relative = event_lwp; + event_lwp->fork_relative = child_lwp; + child_lwp->fork_relative = event_lwp; - /* If the parent thread is doing step-over with single-step + /* If the parent thread is doing step-over with single-step breakpoints, the list of single-step breakpoints are cloned from the parent's. Remove them from the child process. In case of vfork, we'll reinsert them back once vforked child is done. */ - if (event_lwp->bp_reinsert != 0 - && supports_software_single_step ()) - { - /* The child process is forked and stopped, so it is safe + if (event_lwp->bp_reinsert != 0 && supports_software_single_step ()) + { + /* The child process is forked and stopped, so it is safe to access its memory without stopping all other threads from other processes. */ - delete_single_step_breakpoints (child_thr); + delete_single_step_breakpoints (child_thr); - gdb_assert (has_single_step_breakpoints (event_thr)); - gdb_assert (!has_single_step_breakpoints (child_thr)); - } + gdb_assert (has_single_step_breakpoints (event_thr)); + gdb_assert (!has_single_step_breakpoints (child_thr)); + } - /* Report the event. */ - return 0; - } + /* Report the event. */ + return 0; + } - threads_debug_printf - ("Got clone event from LWP %ld, new child is LWP %ld", - lwpid_of (event_thr), new_pid); + threads_debug_printf ( + "Got clone event from LWP %ld, new child is LWP %ld", + lwpid_of (event_thr), new_pid); ptid = ptid_t (pid_of (event_thr), new_pid); new_lwp = add_lwp (ptid); @@ -647,24 +638,24 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, all other threads have been suspended already. Leave the child suspended too. */ if (stopping_threads == STOPPING_AND_SUSPENDING_THREADS - || event_lwp->bp_reinsert != 0) - new_lwp->suspended = 1; + || event_lwp->bp_reinsert != 0) + new_lwp->suspended = 1; /* Normally we will get the pending SIGSTOP. But in some cases we might get another signal delivered to the group first. If we do get another signal, be sure not to lose it. */ if (WSTOPSIG (status) != SIGSTOP) - { - new_lwp->stop_expected = 1; - new_lwp->status_pending_p = 1; - new_lwp->status_pending = status; - } + { + new_lwp->stop_expected = 1; + new_lwp->status_pending_p = 1; + new_lwp->status_pending = status; + } else if (cs.report_thread_events) - { - new_lwp->waitstatus.set_thread_created (); - new_lwp->status_pending_p = 1; - new_lwp->status_pending = status; - } + { + new_lwp->waitstatus.set_thread_created (); + new_lwp->status_pending_p = 1; + new_lwp->status_pending = status; + } #ifdef USE_THREAD_DB thread_db_notice_clone (event_thr, ptid); @@ -678,11 +669,11 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, event_lwp->waitstatus.set_vfork_done (); if (event_lwp->bp_reinsert != 0 && supports_software_single_step ()) - { - reinsert_single_step_breakpoints (event_thr); + { + reinsert_single_step_breakpoints (event_thr); - gdb_assert (has_single_step_breakpoints (event_thr)); - } + gdb_assert (has_single_step_breakpoints (event_thr)); + } /* Report the event. */ return 0; @@ -695,7 +686,7 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, pid_t event_pid; threads_debug_printf ("Got exec event from LWP %ld", - lwpid_of (event_thr)); + lwpid_of (event_thr)); /* Get the event ptid. */ event_ptid = ptid_of (event_thr); @@ -717,9 +708,8 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, arch_setup_thread (event_thr); /* Set the event status. */ - event_lwp->waitstatus.set_execd - (make_unique_xstrdup - (linux_proc_pid_to_exec_file (lwpid_of (event_thr)))); + event_lwp->waitstatus.set_execd (make_unique_xstrdup ( + linux_proc_pid_to_exec_file (lwpid_of (event_thr)))); /* Mark the exec status as pending. */ event_lwp->stopped = 1; @@ -741,7 +731,7 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp, return 0; } - internal_error (_("unknown ptrace event %d"), event); + internal_error (_ ("unknown ptrace event %d"), event); } CORE_ADDR @@ -814,45 +804,46 @@ linux_process_target::save_stop_reason (lwp_info *lwp) #if USE_SIGTRAP_SIGINFO if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread), - (PTRACE_TYPE_ARG3) 0, &siginfo) == 0) + (PTRACE_TYPE_ARG3) 0, &siginfo) + == 0) { if (siginfo.si_signo == SIGTRAP) - { - if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code) - && GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) - { - /* The si_code is ambiguous on this arch -- check debug + { + if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code) + && GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) + { + /* The si_code is ambiguous on this arch -- check debug registers. */ - if (!check_stopped_by_watchpoint (lwp)) - lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; - } - else if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code)) - { - /* If we determine the LWP stopped for a SW breakpoint, + if (!check_stopped_by_watchpoint (lwp)) + lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; + } + else if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code)) + { + /* If we determine the LWP stopped for a SW breakpoint, trust it. Particularly don't check watchpoint registers, because at least on s390, we'd find stopped-by-watchpoint as long as there's a watchpoint set. */ - lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; - } - else if (GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) - { - /* This can indicate either a hardware breakpoint or + lwp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; + } + else if (GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) + { + /* This can indicate either a hardware breakpoint or hardware watchpoint. Check debug registers. */ - if (!check_stopped_by_watchpoint (lwp)) - lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT; - } - else if (siginfo.si_code == TRAP_TRACE) - { - /* We may have single stepped an instruction that + if (!check_stopped_by_watchpoint (lwp)) + lwp->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT; + } + else if (siginfo.si_code == TRAP_TRACE) + { + /* We may have single stepped an instruction that triggered a watchpoint. In that case, on some architectures (such as x86), instead of TRAP_HWBKPT, si_code indicates TRAP_TRACE, and we need to check the debug registers separately. */ - if (!check_stopped_by_watchpoint (lwp)) - lwp->stop_reason = TARGET_STOPPED_BY_SINGLE_STEP; - } - } + if (!check_stopped_by_watchpoint (lwp)) + lwp->stop_reason = TARGET_STOPPED_BY_SINGLE_STEP; + } + } } #else /* We may have just stepped a breakpoint instruction. E.g., in @@ -872,33 +863,32 @@ linux_process_target::save_stop_reason (lwp_info *lwp) if (lwp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT) { - threads_debug_printf - ("%s stopped by software breakpoint", - target_pid_to_str (ptid_of (get_lwp_thread (lwp))).c_str ()); + threads_debug_printf ("%s stopped by software breakpoint", + target_pid_to_str (ptid_of (get_lwp_thread (lwp))) + .c_str ()); /* Back up the PC if necessary. */ if (pc != sw_breakpoint_pc) - { - struct regcache *regcache - = get_thread_regcache (current_thread, 1); - low_set_pc (regcache, sw_breakpoint_pc); - } + { + struct regcache *regcache = get_thread_regcache (current_thread, 1); + low_set_pc (regcache, sw_breakpoint_pc); + } /* Update this so we record the correct stop PC below. */ pc = sw_breakpoint_pc; } else if (lwp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT) - threads_debug_printf - ("%s stopped by hardware breakpoint", - target_pid_to_str (ptid_of (get_lwp_thread (lwp))).c_str ()); + threads_debug_printf ("%s stopped by hardware breakpoint", + target_pid_to_str (ptid_of (get_lwp_thread (lwp))) + .c_str ()); else if (lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT) - threads_debug_printf - ("%s stopped by hardware watchpoint", - target_pid_to_str (ptid_of (get_lwp_thread (lwp))).c_str ()); + threads_debug_printf ("%s stopped by hardware watchpoint", + target_pid_to_str (ptid_of (get_lwp_thread (lwp))) + .c_str ()); else if (lwp->stop_reason == TARGET_STOPPED_BY_SINGLE_STEP) - threads_debug_printf - ("%s stopped by trace", - target_pid_to_str (ptid_of (get_lwp_thread (lwp))).c_str ()); + threads_debug_printf ("%s stopped by trace", + target_pid_to_str (ptid_of (get_lwp_thread (lwp))) + .c_str ()); lwp->stop_pc = pc; return true; @@ -928,8 +918,8 @@ linux_process_target::low_new_thread (lwp_info *info) static void linux_ptrace_fun () { - if (ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, - (PTRACE_TYPE_ARG4) 0) < 0) + if (ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0) + < 0) trace_start_error_with_name ("ptrace"); if (setpgid (0, 0) < 0) @@ -941,16 +931,17 @@ linux_ptrace_fun () if (remote_connection_is_stdio ()) { if (close (0) < 0) - trace_start_error_with_name ("close"); + trace_start_error_with_name ("close"); if (open ("/dev/null", O_RDONLY) < 0) - trace_start_error_with_name ("open"); + trace_start_error_with_name ("open"); if (dup2 (2, 1) < 0) - trace_start_error_with_name ("dup2"); + trace_start_error_with_name ("dup2"); if (write (2, "stdin/stdout redirected\n", - sizeof ("stdin/stdout redirected\n") - 1) < 0) - { - /* Errors ignored. */; - } + sizeof ("stdin/stdout redirected\n") - 1) + < 0) + { + /* Errors ignored. */; + } } } @@ -960,7 +951,7 @@ linux_ptrace_fun () int linux_process_target::create_inferior (const char *program, - const std::vector<char *> &program_args) + const std::vector<char *> &program_args) { client_state &cs = get_client_state (); struct lwp_info *new_lwp; @@ -968,14 +959,13 @@ linux_process_target::create_inferior (const char *program, ptid_t ptid; { - maybe_disable_address_space_randomization restore_personality - (cs.disable_randomization); + maybe_disable_address_space_randomization restore_personality ( + cs.disable_randomization); std::string str_program_args = construct_inferior_arguments (program_args); - pid = fork_inferior (program, - str_program_args.c_str (), - get_environ ()->envp (), linux_ptrace_fun, - NULL, NULL, NULL, NULL); + pid = fork_inferior (program, str_program_args.c_str (), + get_environ ()->envp (), linux_ptrace_fun, NULL, NULL, + NULL, NULL); } /* When spawning a new process, we can't open the mem file yet. We @@ -1118,18 +1108,17 @@ attach_proc_task_lwp_callback (ptid_t ptid) is returned if the thread's task still exists, and is marked as exited or zombie, as well as other conditions, so in that case, confirm the status in /proc/PID/status. */ - if (err == ESRCH - || (err == EPERM && linux_proc_pid_is_gone (lwpid))) - threads_debug_printf - ("Cannot attach to lwp %d: thread is gone (%d: %s)", - lwpid, err, safe_strerror (err)); + if (err == ESRCH || (err == EPERM && linux_proc_pid_is_gone (lwpid))) + threads_debug_printf ( + "Cannot attach to lwp %d: thread is gone (%d: %s)", lwpid, err, + safe_strerror (err)); else if (err != 0) - { - std::string reason - = linux_ptrace_attach_fail_reason_string (ptid, err); + { + std::string reason + = linux_ptrace_attach_fail_reason_string (ptid, err); - warning (_("Cannot attach to lwp %d: %s"), lwpid, reason.c_str ()); - } + warning (_ ("Cannot attach to lwp %d: %s"), lwpid, reason.c_str ()); + } return 1; } @@ -1200,10 +1189,10 @@ linux_process_target::attach (unsigned long pid) lwp = find_lwp_pid (ptid_t (lwpid)); if (!WIFSTOPPED (wstat) || WSTOPSIG (wstat) != SIGSTOP) - { - lwp->status_pending_p = 1; - lwp->status_pending = wstat; - } + { + lwp->status_pending_p = 1; + lwp->status_pending = wstat; + } initial_thread->last_resume_kind = resume_continue; @@ -1220,20 +1209,19 @@ last_thread_of_process_p (int pid) { bool seen_one = false; - thread_info *thread = find_thread (pid, [&] (thread_info *thr_arg) - { - if (!seen_one) - { - /* This is the first thread of this process we see. */ - seen_one = true; - return false; - } - else - { - /* This is the second thread of this process we see. */ - return true; - } - }); + thread_info *thread = find_thread (pid, [&] (thread_info *thr_arg) { + if (!seen_one) + { + /* This is the first thread of this process we see. */ + seen_one = true; + return false; + } + else + { + /* This is the second thread of this process we see. */ + return true; + } + }); return thread == NULL; } @@ -1266,8 +1254,8 @@ linux_kill_one_lwp (struct lwp_info *lwp) int save_errno = errno; threads_debug_printf ("kill_lwp (SIGKILL) %s, 0, 0 (%s)", - target_pid_to_str (ptid_of (thr)).c_str (), - save_errno ? safe_strerror (save_errno) : "OK"); + target_pid_to_str (ptid_of (thr)).c_str (), + save_errno ? safe_strerror (save_errno) : "OK"); } errno = 0; @@ -1277,8 +1265,8 @@ linux_kill_one_lwp (struct lwp_info *lwp) int save_errno = errno; threads_debug_printf ("PTRACE_KILL %s, 0, 0 (%s)", - target_pid_to_str (ptid_of (thr)).c_str (), - save_errno ? safe_strerror (save_errno) : "OK"); + target_pid_to_str (ptid_of (thr)).c_str (), + save_errno ? safe_strerror (save_errno) : "OK"); } } @@ -1315,8 +1303,9 @@ kill_wait_lwp (struct lwp_info *lwp) */ res = my_waitpid (lwpid, &wstat, 0); if (res == -1 && errno == ECHILD) - res = my_waitpid (lwpid, &wstat, __WCLONE); - } while (res > 0 && WIFSTOPPED (wstat)); + res = my_waitpid (lwpid, &wstat, __WCLONE); + } + while (res > 0 && WIFSTOPPED (wstat)); /* Even if it was stopped, the child may have already disappeared. E.g., if it was killed by SIGKILL. */ @@ -1340,7 +1329,7 @@ kill_one_lwp_callback (thread_info *thread, int pid) if (lwpid_of (thread) == pid) { threads_debug_printf ("is last of process %s", - target_pid_to_str (thread->id).c_str ()); + target_pid_to_str (thread->id).c_str ()); return; } @@ -1356,10 +1345,9 @@ linux_process_target::kill (process_info *process) first, as PTRACE_KILL will not work otherwise. */ stop_all_lwps (0, NULL); - for_each_thread (pid, [&] (thread_info *thread) - { - kill_one_lwp_callback (thread, pid); - }); + for_each_thread (pid, [&] (thread_info *thread) { + kill_one_lwp_callback (thread, pid); + }); /* See the comment in linux_kill_one_lwp. We did not kill the first thread in the list, so do so now. */ @@ -1398,8 +1386,8 @@ get_detach_signal (struct thread_info *thread) cleanly, then it'll have stopped with SIGSTOP. But we don't want to deliver that SIGSTOP. */ if (thread->last_status.kind () != TARGET_WAITKIND_STOPPED - || thread->last_status.sig () == GDB_SIGNAL_0) - return 0; + || thread->last_status.sig () == GDB_SIGNAL_0) + return 0; /* Otherwise, we may need to deliver the signal we intercepted. */ @@ -1409,7 +1397,7 @@ get_detach_signal (struct thread_info *thread) if (!WIFSTOPPED (status)) { threads_debug_printf ("lwp %s hasn't stopped: no pending signal", - target_pid_to_str (ptid_of (thread)).c_str ()); + target_pid_to_str (ptid_of (thread)).c_str ()); return 0; } @@ -1417,8 +1405,8 @@ get_detach_signal (struct thread_info *thread) if (WSTOPSIG (status) == SIGTRAP && linux_is_extended_waitstatus (status)) { threads_debug_printf ("lwp %s had stopped with extended " - "status: no pending signal", - target_pid_to_str (ptid_of (thread)).c_str ()); + "status: no pending signal", + target_pid_to_str (ptid_of (thread)).c_str ()); return 0; } @@ -1427,28 +1415,28 @@ get_detach_signal (struct thread_info *thread) if (cs.program_signals_p && !cs.program_signals[signo]) { threads_debug_printf ("lwp %s had signal %s, but it is in nopass state", - target_pid_to_str (ptid_of (thread)).c_str (), - gdb_signal_to_string (signo)); + target_pid_to_str (ptid_of (thread)).c_str (), + gdb_signal_to_string (signo)); return 0; } else if (!cs.program_signals_p - /* If we have no way to know which signals GDB does not + /* If we have no way to know which signals GDB does not want to have passed to the program, assume SIGTRAP/SIGINT, which is GDB's default. */ - && (signo == GDB_SIGNAL_TRAP || signo == GDB_SIGNAL_INT)) + && (signo == GDB_SIGNAL_TRAP || signo == GDB_SIGNAL_INT)) { threads_debug_printf ("lwp %s had signal %s, " - "but we don't know if we should pass it. " - "Default to not.", - target_pid_to_str (ptid_of (thread)).c_str (), - gdb_signal_to_string (signo)); + "but we don't know if we should pass it. " + "Default to not.", + target_pid_to_str (ptid_of (thread)).c_str (), + gdb_signal_to_string (signo)); return 0; } else { threads_debug_printf ("lwp %s has pending signal %s: delivering it", - target_pid_to_str (ptid_of (thread)).c_str (), - gdb_signal_to_string (signo)); + target_pid_to_str (ptid_of (thread)).c_str (), + gdb_signal_to_string (signo)); return WSTOPSIG (status); } @@ -1465,7 +1453,7 @@ linux_process_target::detach_one_lwp (lwp_info *lwp) if (lwp->stop_expected) { threads_debug_printf ("Sending SIGCONT to %s", - target_pid_to_str (ptid_of (thread)).c_str ()); + target_pid_to_str (ptid_of (thread)).c_str ()); kill_lwp (lwpid_of (thread), SIGCONT); lwp->stop_expected = 0; @@ -1488,12 +1476,13 @@ linux_process_target::detach_one_lwp (lwp_info *lwp) catch (const gdb_exception_error &ex) { if (!check_ptrace_stopped_lwp_gone (lwp)) - throw; + throw; } lwpid = lwpid_of (thread); if (ptrace (PTRACE_DETACH, lwpid, (PTRACE_TYPE_ARG3) 0, - (PTRACE_TYPE_ARG4) (long) sig) < 0) + (PTRACE_TYPE_ARG4) (long) sig) + < 0) { int save_errno = errno; @@ -1502,33 +1491,33 @@ linux_process_target::detach_one_lwp (lwp_info *lwp) threads exits the whole thread group. In that case we're still attached, and must reap the lwp. */ if (save_errno == ESRCH) - { - int ret, status; - - ret = my_waitpid (lwpid, &status, __WALL); - if (ret == -1) - { - warning (_("Couldn't reap LWP %d while detaching: %s"), - lwpid, safe_strerror (errno)); - } - else if (!WIFEXITED (status) && !WIFSIGNALED (status)) - { - warning (_("Reaping LWP %d while detaching " - "returned unexpected status 0x%x"), - lwpid, status); - } - } + { + int ret, status; + + ret = my_waitpid (lwpid, &status, __WALL); + if (ret == -1) + { + warning (_ ("Couldn't reap LWP %d while detaching: %s"), lwpid, + safe_strerror (errno)); + } + else if (!WIFEXITED (status) && !WIFSIGNALED (status)) + { + warning (_ ("Reaping LWP %d while detaching " + "returned unexpected status 0x%x"), + lwpid, status); + } + } else - { - error (_("Can't detach %s: %s"), - target_pid_to_str (ptid_of (thread)).c_str (), - safe_strerror (save_errno)); - } + { + error (_ ("Can't detach %s: %s"), + target_pid_to_str (ptid_of (thread)).c_str (), + safe_strerror (save_errno)); + } } else threads_debug_printf ("PTRACE_DETACH (%s, %s, 0) (OK)", - target_pid_to_str (ptid_of (thread)).c_str (), - strsignal (sig)); + target_pid_to_str (ptid_of (thread)).c_str (), + strsignal (sig)); delete_lwp (lwp); } @@ -1559,17 +1548,16 @@ linux_process_target::detach (process_info *process) /* Detach from the clone lwps first. If the thread group exits just while we're detaching, we must reap the clone lwps before we're able to reap the leader. */ - for_each_thread (process->pid, [this] (thread_info *thread) - { - /* We don't actually detach from the thread group leader just yet. + for_each_thread (process->pid, [this] (thread_info *thread) { + /* We don't actually detach from the thread group leader just yet. If the thread group exits, we must reap the zombie clone lwps before we're able to reap the leader. */ - if (thread->id.pid () == thread->id.lwp ()) - return; + if (thread->id.pid () == thread->id.lwp ()) + return; - lwp_info *lwp = get_thread_lwp (thread); - detach_one_lwp (lwp); - }); + lwp_info *lwp = get_thread_lwp (thread); + detach_one_lwp (lwp); + }); main_lwp = find_lwp_pid (ptid_t (process->pid)); detach_one_lwp (main_lwp); @@ -1591,10 +1579,9 @@ linux_process_target::mourn (process_info *process) thread_db_mourn (process); #endif - for_each_thread (process->pid, [this] (thread_info *thread) - { - delete_lwp (get_thread_lwp (thread)); - }); + for_each_thread (process->pid, [this] (thread_info *thread) { + delete_lwp (get_thread_lwp (thread)); + }); this->remove_linux_process (process); } @@ -1604,11 +1591,13 @@ linux_process_target::join (int pid) { int status, ret; - do { - ret = my_waitpid (pid, &status, 0); - if (WIFEXITED (status) || WIFSIGNALED (status)) - break; - } while (ret != -1 || errno != ECHILD); + do + { + ret = my_waitpid (pid, &status, 0); + if (WIFEXITED (status) || WIFSIGNALED (status)) + break; + } + while (ret != -1 || errno != ECHILD); } /* Return true if the given thread is still alive. */ @@ -1637,7 +1626,7 @@ linux_process_target::thread_still_has_status_pending (thread_info *thread) if (thread->last_resume_kind != resume_stop && (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT - || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT)) + || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT)) { CORE_ADDR pc; int discard = 0; @@ -1650,35 +1639,34 @@ linux_process_target::thread_still_has_status_pending (thread_info *thread) switch_to_thread (thread); if (pc != lp->stop_pc) - { - threads_debug_printf ("PC of %ld changed", - lwpid_of (thread)); - discard = 1; - } + { + threads_debug_printf ("PC of %ld changed", lwpid_of (thread)); + discard = 1; + } #if !USE_SIGTRAP_SIGINFO else if (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT - && !low_breakpoint_at (pc)) - { - threads_debug_printf ("previous SW breakpoint of %ld gone", - lwpid_of (thread)); - discard = 1; - } + && !low_breakpoint_at (pc)) + { + threads_debug_printf ("previous SW breakpoint of %ld gone", + lwpid_of (thread)); + discard = 1; + } else if (lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT - && !hardware_breakpoint_inserted_here (pc)) - { - threads_debug_printf ("previous HW breakpoint of %ld gone", - lwpid_of (thread)); - discard = 1; - } + && !hardware_breakpoint_inserted_here (pc)) + { + threads_debug_printf ("previous HW breakpoint of %ld gone", + lwpid_of (thread)); + discard = 1; + } #endif if (discard) - { - threads_debug_printf ("discarding pending breakpoint status"); - lp->status_pending_p = 0; - return 0; - } + { + threads_debug_printf ("discarding pending breakpoint status"); + lp->status_pending_p = 0; + return 0; + } } return 1; @@ -1706,7 +1694,7 @@ lwp_resumed (struct lwp_info *lwp) bool linux_process_target::status_pending_p_callback (thread_info *thread, - ptid_t ptid) + ptid_t ptid) { struct lwp_info *lp = get_thread_lwp (thread); @@ -1718,8 +1706,7 @@ linux_process_target::status_pending_p_callback (thread_info *thread, if (!lwp_resumed (lp)) return 0; - if (lp->status_pending_p - && !thread_still_has_status_pending (thread)) + if (lp->status_pending_p && !thread_still_has_status_pending (thread)) { resume_one_lwp (lp, lp->stepping, GDB_SIGNAL_0, NULL); return 0; @@ -1732,10 +1719,8 @@ struct lwp_info * find_lwp_pid (ptid_t ptid) { long lwp = ptid.lwp () != 0 ? ptid.lwp () : ptid.pid (); - thread_info *thread = find_thread ([lwp] (thread_info *thr_arg) - { - return thr_arg->id.lwp () == lwp; - }); + thread_info *thread = find_thread ( + [lwp] (thread_info *thr_arg) { return thr_arg->id.lwp () == lwp; }); if (thread == NULL) return NULL; @@ -1750,10 +1735,7 @@ num_lwps (int pid) { int count = 0; - for_each_thread (pid, [&] (thread_info *thread) - { - count++; - }); + for_each_thread (pid, [&] (thread_info *thread) { count++; }); return count; } @@ -1762,14 +1744,13 @@ num_lwps (int pid) struct lwp_info * iterate_over_lwps (ptid_t filter, - gdb::function_view<iterate_over_lwps_ftype> callback) + gdb::function_view<iterate_over_lwps_ftype> callback) { - thread_info *thread = find_thread (filter, [&] (thread_info *thr_arg) - { - lwp_info *lwp = get_thread_lwp (thr_arg); + thread_info *thread = find_thread (filter, [&] (thread_info *thr_arg) { + lwp_info *lwp = get_thread_lwp (thr_arg); - return callback (lwp); - }); + return callback (lwp); + }); if (thread == NULL) return NULL; @@ -1780,27 +1761,27 @@ iterate_over_lwps (ptid_t filter, void linux_process_target::check_zombie_leaders () { - for_each_process ([this] (process_info *proc) - { - pid_t leader_pid = pid_of (proc); - lwp_info *leader_lp = find_lwp_pid (ptid_t (leader_pid)); + for_each_process ([this] (process_info *proc) { + pid_t leader_pid = pid_of (proc); + lwp_info *leader_lp = find_lwp_pid (ptid_t (leader_pid)); - threads_debug_printf ("leader_pid=%d, leader_lp!=NULL=%d, " - "num_lwps=%d, zombie=%d", - leader_pid, leader_lp!= NULL, num_lwps (leader_pid), - linux_proc_pid_is_zombie (leader_pid)); + threads_debug_printf ("leader_pid=%d, leader_lp!=NULL=%d, " + "num_lwps=%d, zombie=%d", + leader_pid, leader_lp != NULL, num_lwps (leader_pid), + linux_proc_pid_is_zombie (leader_pid)); - if (leader_lp != NULL && !leader_lp->stopped - /* Check if there are other threads in the group, as we may + if (leader_lp != NULL + && !leader_lp->stopped + /* Check if there are other threads in the group, as we may have raced with the inferior simply exiting. Note this isn't a watertight check. If the inferior is multi-threaded and is exiting, it may be we see the leader as zombie before we reap all the non-leader threads. See comments below. */ - && !last_thread_of_process_p (leader_pid) - && linux_proc_pid_is_zombie (leader_pid)) - { - /* A zombie leader in a multi-threaded program can mean one + && !last_thread_of_process_p (leader_pid) + && linux_proc_pid_is_zombie (leader_pid)) + { + /* A zombie leader in a multi-threaded program can mean one of three things: #1 - Only the leader exited, not the whole program, e.g., @@ -1845,13 +1826,13 @@ linux_process_target::check_zombie_leaders () exit when we see the leader exiting, as opposed to when the last LWP in the LWP list exits, which can be a non-leader if we deleted the leader here. */ - threads_debug_printf ("Thread group leader %d zombie " - "(it exited, or another thread execd), " - "deleting it.", - leader_pid); - delete_lwp (leader_lp); - } - }); + threads_debug_printf ("Thread group leader %d zombie " + "(it exited, or another thread execd), " + "deleting it.", + leader_pid); + delete_lwp (leader_lp); + } + }); } /* Callback for `find_thread'. Returns the first LWP that is not @@ -1876,9 +1857,9 @@ lwp_suspended_inc (struct lwp_info *lwp) lwp->suspended++; if (lwp->suspended > 4) - threads_debug_printf - ("LWP %ld has a suspiciously high suspend count, suspended=%d", - lwpid_of (get_lwp_thread (lwp)), lwp->suspended); + threads_debug_printf ( + "LWP %ld has a suspiciously high suspend count, suspended=%d", + lwpid_of (get_lwp_thread (lwp)), lwp->suspended); } /* Decrement LWP's suspend count. */ @@ -1893,7 +1874,7 @@ lwp_suspended_decr (struct lwp_info *lwp) struct thread_info *thread = get_lwp_thread (lwp); internal_error ("unsuspend LWP %ld, suspended=%d\n", lwpid_of (thread), - lwp->suspended); + lwp->suspended); } } @@ -1934,8 +1915,8 @@ handle_tracepoints (struct lwp_info *lwp) gdb_assert (lwp->suspended == 0); gdb_assert (!stabilizing_threads - || (lwp->collecting_fast_tracepoint - != fast_tpoint_collect_result::not_collecting)); + || (lwp->collecting_fast_tracepoint + != fast_tpoint_collect_result::not_collecting)); if (tpoint_related_event) { @@ -1947,8 +1928,8 @@ handle_tracepoints (struct lwp_info *lwp) } fast_tpoint_collect_result -linux_process_target::linux_fast_tracepoint_collecting - (lwp_info *lwp, fast_tpoint_collect_status *status) +linux_process_target::linux_fast_tracepoint_collecting ( + lwp_info *lwp, fast_tpoint_collect_status *status) { CORE_ADDR thread_area; struct thread_info *thread = get_lwp_thread (lwp); @@ -1975,113 +1956,110 @@ linux_process_target::maybe_move_out_of_jump_pad (lwp_info *lwp, int *wstat) scoped_restore_current_thread restore_thread; switch_to_thread (get_lwp_thread (lwp)); - if ((wstat == NULL - || (WIFSTOPPED (*wstat) && WSTOPSIG (*wstat) != SIGTRAP)) - && supports_fast_tracepoints () - && agent_loaded_p ()) + if ((wstat == NULL || (WIFSTOPPED (*wstat) && WSTOPSIG (*wstat) != SIGTRAP)) + && supports_fast_tracepoints () && agent_loaded_p ()) { struct fast_tpoint_collect_status status; - threads_debug_printf - ("Checking whether LWP %ld needs to move out of the jump pad.", - lwpid_of (current_thread)); + threads_debug_printf ( + "Checking whether LWP %ld needs to move out of the jump pad.", + lwpid_of (current_thread)); fast_tpoint_collect_result r - = linux_fast_tracepoint_collecting (lwp, &status); + = linux_fast_tracepoint_collecting (lwp, &status); if (wstat == NULL - || (WSTOPSIG (*wstat) != SIGILL - && WSTOPSIG (*wstat) != SIGFPE - && WSTOPSIG (*wstat) != SIGSEGV - && WSTOPSIG (*wstat) != SIGBUS)) - { - lwp->collecting_fast_tracepoint = r; - - if (r != fast_tpoint_collect_result::not_collecting) - { - if (r == fast_tpoint_collect_result::before_insn - && lwp->exit_jump_pad_bkpt == NULL) - { - /* Haven't executed the original instruction yet. + || (WSTOPSIG (*wstat) != SIGILL && WSTOPSIG (*wstat) != SIGFPE + && WSTOPSIG (*wstat) != SIGSEGV && WSTOPSIG (*wstat) != SIGBUS)) + { + lwp->collecting_fast_tracepoint = r; + + if (r != fast_tpoint_collect_result::not_collecting) + { + if (r == fast_tpoint_collect_result::before_insn + && lwp->exit_jump_pad_bkpt == NULL) + { + /* Haven't executed the original instruction yet. Set breakpoint there, and wait till it's hit, then single-step until exiting the jump pad. */ - lwp->exit_jump_pad_bkpt - = set_breakpoint_at (status.adjusted_insn_addr, NULL); - } - - threads_debug_printf - ("Checking whether LWP %ld needs to move out of the jump pad..." - " it does", lwpid_of (current_thread)); - - return true; - } - } + lwp->exit_jump_pad_bkpt + = set_breakpoint_at (status.adjusted_insn_addr, NULL); + } + + threads_debug_printf ( + "Checking whether LWP %ld needs to move out of the jump pad..." + " it does", + lwpid_of (current_thread)); + + return true; + } + } else - { - /* If we get a synchronous signal while collecting, *and* + { + /* If we get a synchronous signal while collecting, *and* while executing the (relocated) original instruction, reset the PC to point at the tpoint address, before reporting to GDB. Otherwise, it's an IPA lib bug: just report the signal to GDB, and pray for the best. */ - lwp->collecting_fast_tracepoint - = fast_tpoint_collect_result::not_collecting; + lwp->collecting_fast_tracepoint + = fast_tpoint_collect_result::not_collecting; - if (r != fast_tpoint_collect_result::not_collecting - && (status.adjusted_insn_addr <= lwp->stop_pc - && lwp->stop_pc < status.adjusted_insn_addr_end)) - { - siginfo_t info; - struct regcache *regcache; + if (r != fast_tpoint_collect_result::not_collecting + && (status.adjusted_insn_addr <= lwp->stop_pc + && lwp->stop_pc < status.adjusted_insn_addr_end)) + { + siginfo_t info; + struct regcache *regcache; - /* The si_addr on a few signals references the address + /* The si_addr on a few signals references the address of the faulting instruction. Adjust that as well. */ - if ((WSTOPSIG (*wstat) == SIGILL - || WSTOPSIG (*wstat) == SIGFPE - || WSTOPSIG (*wstat) == SIGBUS - || WSTOPSIG (*wstat) == SIGSEGV) - && ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread), - (PTRACE_TYPE_ARG3) 0, &info) == 0 - /* Final check just to make sure we don't clobber + if ((WSTOPSIG (*wstat) == SIGILL || WSTOPSIG (*wstat) == SIGFPE + || WSTOPSIG (*wstat) == SIGBUS + || WSTOPSIG (*wstat) == SIGSEGV) + && ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread), + (PTRACE_TYPE_ARG3) 0, &info) + == 0 + /* Final check just to make sure we don't clobber the siginfo of non-kernel-sent signals. */ - && (uintptr_t) info.si_addr == lwp->stop_pc) - { - info.si_addr = (void *) (uintptr_t) status.tpoint_addr; - ptrace (PTRACE_SETSIGINFO, lwpid_of (current_thread), - (PTRACE_TYPE_ARG3) 0, &info); - } - - regcache = get_thread_regcache (current_thread, 1); - low_set_pc (regcache, status.tpoint_addr); - lwp->stop_pc = status.tpoint_addr; - - /* Cancel any fast tracepoint lock this thread was + && (uintptr_t) info.si_addr == lwp->stop_pc) + { + info.si_addr = (void *) (uintptr_t) status.tpoint_addr; + ptrace (PTRACE_SETSIGINFO, lwpid_of (current_thread), + (PTRACE_TYPE_ARG3) 0, &info); + } + + regcache = get_thread_regcache (current_thread, 1); + low_set_pc (regcache, status.tpoint_addr); + lwp->stop_pc = status.tpoint_addr; + + /* Cancel any fast tracepoint lock this thread was holding. */ - force_unlock_trace_buffer (); - } + force_unlock_trace_buffer (); + } - if (lwp->exit_jump_pad_bkpt != NULL) - { - threads_debug_printf - ("Cancelling fast exit-jump-pad: removing bkpt." - "stopping all threads momentarily."); + if (lwp->exit_jump_pad_bkpt != NULL) + { + threads_debug_printf ( + "Cancelling fast exit-jump-pad: removing bkpt." + "stopping all threads momentarily."); - stop_all_lwps (1, lwp); + stop_all_lwps (1, lwp); - delete_breakpoint (lwp->exit_jump_pad_bkpt); - lwp->exit_jump_pad_bkpt = NULL; + delete_breakpoint (lwp->exit_jump_pad_bkpt); + lwp->exit_jump_pad_bkpt = NULL; - unstop_all_lwps (1, lwp); + unstop_all_lwps (1, lwp); - gdb_assert (lwp->suspended >= 0); - } - } + gdb_assert (lwp->suspended >= 0); + } + } } - threads_debug_printf - ("Checking whether LWP %ld needs to move out of the jump pad... no", - lwpid_of (current_thread)); + threads_debug_printf ( + "Checking whether LWP %ld needs to move out of the jump pad... no", + lwpid_of (current_thread)); return false; } @@ -2094,13 +2072,13 @@ enqueue_one_deferred_signal (struct lwp_info *lwp, int *wstat) { struct thread_info *thread = get_lwp_thread (lwp); - threads_debug_printf ("Deferring signal %d for LWP %ld.", - WSTOPSIG (*wstat), lwpid_of (thread)); + threads_debug_printf ("Deferring signal %d for LWP %ld.", WSTOPSIG (*wstat), + lwpid_of (thread)); if (debug_threads) { for (const auto &sig : lwp->pending_signals_to_report) - threads_debug_printf (" Already queued %d", sig.signal); + threads_debug_printf (" Already queued %d", sig.signal); threads_debug_printf (" (no more currently queued signals)"); } @@ -2111,21 +2089,21 @@ enqueue_one_deferred_signal (struct lwp_info *lwp, int *wstat) if (WSTOPSIG (*wstat) < __SIGRTMIN) { for (const auto &sig : lwp->pending_signals_to_report) - { - if (sig.signal == WSTOPSIG (*wstat)) - { - threads_debug_printf - ("Not requeuing already queued non-RT signal %d for LWP %ld", - sig.signal, lwpid_of (thread)); - return; - } - } + { + if (sig.signal == WSTOPSIG (*wstat)) + { + threads_debug_printf ( + "Not requeuing already queued non-RT signal %d for LWP %ld", + sig.signal, lwpid_of (thread)); + return; + } + } } lwp->pending_signals_to_report.emplace_back (WSTOPSIG (*wstat)); ptrace (PTRACE_GETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, - &lwp->pending_signals_to_report.back ().info); + &lwp->pending_signals_to_report.back ().info); } /* Dequeue one signal from the "signals to report later when out of @@ -2142,21 +2120,21 @@ dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat) *wstat = W_STOPCODE (p_sig.signal); if (p_sig.info.si_signo != 0) - ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, - &p_sig.info); + ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, + &p_sig.info); lwp->pending_signals_to_report.pop_front (); threads_debug_printf ("Reporting deferred signal %d for LWP %ld.", - WSTOPSIG (*wstat), lwpid_of (thread)); + WSTOPSIG (*wstat), lwpid_of (thread)); if (debug_threads) - { - for (const auto &sig : lwp->pending_signals_to_report) - threads_debug_printf (" Still queued %d", sig.signal); + { + for (const auto &sig : lwp->pending_signals_to_report) + threads_debug_printf (" Still queued %d", sig.signal); - threads_debug_printf (" (no more queued signals)"); - } + threads_debug_printf (" (no more queued signals)"); + } return 1; } @@ -2230,60 +2208,57 @@ linux_process_target::filter_event (int lwpid, int wstat) if (child == nullptr) { if (WIFSTOPPED (wstat)) - { - if (WSTOPSIG (wstat) == SIGTRAP - && linux_ptrace_get_extended_event (wstat) == PTRACE_EVENT_EXEC) - { - /* A non-leader thread exec'ed after we've seen the + { + if (WSTOPSIG (wstat) == SIGTRAP + && linux_ptrace_get_extended_event (wstat) == PTRACE_EVENT_EXEC) + { + /* A non-leader thread exec'ed after we've seen the leader zombie, and removed it from our lists (in check_zombie_leaders). The non-leader thread changes its tid to the tgid. */ - threads_debug_printf - ("Re-adding thread group leader LWP %d after exec.", - lwpid); - - child = add_lwp (ptid_t (lwpid, lwpid)); - child->stopped = 1; - switch_to_thread (child->thread); - } - else - { - /* A process we are controlling has forked and the new + threads_debug_printf ( + "Re-adding thread group leader LWP %d after exec.", lwpid); + + child = add_lwp (ptid_t (lwpid, lwpid)); + child->stopped = 1; + switch_to_thread (child->thread); + } + else + { + /* A process we are controlling has forked and the new child's stop was reported to us by the kernel. Save its PID and go back to waiting for the fork event to be reported - the stopped process might be returned from waitpid before or after the fork event is. */ - threads_debug_printf - ("Saving LWP %d status %s in stopped_pids list", - lwpid, status_to_str (wstat).c_str ()); - add_to_pid_list (&stopped_pids, lwpid, wstat); - } - } + threads_debug_printf ( + "Saving LWP %d status %s in stopped_pids list", lwpid, + status_to_str (wstat).c_str ()); + add_to_pid_list (&stopped_pids, lwpid, wstat); + } + } else - { - /* Don't report an event for the exit of an LWP not in our + { + /* Don't report an event for the exit of an LWP not in our list, i.e. not part of any inferior we're debugging. This can happen if we detach from a program we originally forked and then it exits. However, note that we may have earlier deleted a leader of an inferior we're debugging, in check_zombie_leaders. Re-add it back here if so. */ - find_process ([&] (process_info *proc) - { - if (proc->pid == lwpid) - { - threads_debug_printf - ("Re-adding thread group leader LWP %d after exit.", - lwpid); - - child = add_lwp (ptid_t (lwpid, lwpid)); - return true; - } - return false; - }); - } + find_process ([&] (process_info *proc) { + if (proc->pid == lwpid) + { + threads_debug_printf ( + "Re-adding thread group leader LWP %d after exit.", lwpid); + + child = add_lwp (ptid_t (lwpid, lwpid)); + return true; + } + return false; + }); + } if (child == nullptr) - return; + return; } thread = get_lwp_thread (child); @@ -2298,27 +2273,27 @@ linux_process_target::filter_event (int lwpid, int wstat) threads_debug_printf ("%d exited", lwpid); if (finish_step_over (child)) - { - /* Unsuspend all other LWPs, and set them back running again. */ - unsuspend_all_lwps (child); - } + { + /* Unsuspend all other LWPs, and set them back running again. */ + unsuspend_all_lwps (child); + } /* If this is not the leader LWP, then the exit signal was not the end of the debugged application and should be ignored, unless GDB wants to hear about thread exits. */ if (cs.report_thread_events || is_leader (thread)) - { - /* Since events are serialized to GDB core, and we can't + { + /* Since events are serialized to GDB core, and we can't report this one right now. Leave the status pending for the next time we're able to report it. */ - mark_lwp_dead (child, wstat); - return; - } + mark_lwp_dead (child, wstat); + return; + } else - { - delete_lwp (child); - return; - } + { + delete_lwp (child); + return; + } } gdb_assert (WIFSTOPPED (wstat)); @@ -2330,24 +2305,24 @@ linux_process_target::filter_event (int lwpid, int wstat) /* Architecture-specific setup after inferior is running. */ proc = find_process_pid (pid_of (thread)); if (proc->tdesc == NULL) - { - if (proc->attached) - { - /* This needs to happen after we have attached to the + { + if (proc->attached) + { + /* This needs to happen after we have attached to the inferior and it is stopped for the first time, but before we access any inferior registers. */ - arch_setup_thread (thread); - } - else - { - /* The process is started, but GDBserver will do + arch_setup_thread (thread); + } + else + { + /* The process is started, but GDBserver will do architecture-specific setup after the program stops at the first instruction. */ - child->status_pending_p = 1; - child->status_pending = wstat; - return; - } - } + child->status_pending_p = 1; + child->status_pending = wstat; + return; + } + } } if (WIFSTOPPED (wstat) && child->must_set_ptrace_flags) @@ -2363,9 +2338,9 @@ linux_process_target::filter_event (int lwpid, int wstat) if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SYSCALL_SIGTRAP) { child->syscall_state - = (child->syscall_state == TARGET_WAITKIND_SYSCALL_ENTRY - ? TARGET_WAITKIND_SYSCALL_RETURN - : TARGET_WAITKIND_SYSCALL_ENTRY); + = (child->syscall_state == TARGET_WAITKIND_SYSCALL_ENTRY + ? TARGET_WAITKIND_SYSCALL_RETURN + : TARGET_WAITKIND_SYSCALL_ENTRY); } else { @@ -2381,17 +2356,17 @@ linux_process_target::filter_event (int lwpid, int wstat) { child->stop_pc = get_pc (child); if (handle_extended_wait (&child, wstat)) - { - /* The event has been handled, so just return without + { + /* The event has been handled, so just return without reporting it. */ - return; - } + return; + } } if (linux_wstatus_maybe_breakpoint (wstat)) { if (save_stop_reason (child)) - have_stop_pc = 1; + have_stop_pc = 1; } if (!have_stop_pc) @@ -2405,30 +2380,31 @@ linux_process_target::filter_event (int lwpid, int wstat) child->stop_expected = 0; if (thread->last_resume_kind == resume_stop) - { - /* We want to report the stop to the core. Treat the + { + /* We want to report the stop to the core. Treat the SIGSTOP as a normal event. */ - threads_debug_printf ("resume_stop SIGSTOP caught for %s.", - target_pid_to_str (ptid_of (thread)).c_str ()); - } + threads_debug_printf ("resume_stop SIGSTOP caught for %s.", + target_pid_to_str (ptid_of (thread)).c_str ()); + } else if (stopping_threads != NOT_STOPPING_THREADS) - { - /* Stopping threads. We don't want this SIGSTOP to end up + { + /* Stopping threads. We don't want this SIGSTOP to end up pending. */ - threads_debug_printf ("SIGSTOP caught for %s while stopping threads.", - target_pid_to_str (ptid_of (thread)).c_str ()); - return; - } + threads_debug_printf ( + "SIGSTOP caught for %s while stopping threads.", + target_pid_to_str (ptid_of (thread)).c_str ()); + return; + } else - { - /* This is a delayed SIGSTOP. Filter out the event. */ - threads_debug_printf ("%s %s, 0, 0 (discard delayed SIGSTOP)", - child->stepping ? "step" : "continue", - target_pid_to_str (ptid_of (thread)).c_str ()); + { + /* This is a delayed SIGSTOP. Filter out the event. */ + threads_debug_printf ("%s %s, 0, 0 (discard delayed SIGSTOP)", + child->stepping ? "step" : "continue", + target_pid_to_str (ptid_of (thread)).c_str ()); - resume_one_lwp (child, child->stepping, 0, NULL); - return; - } + resume_one_lwp (child, child->stepping, 0, NULL); + return; + } } child->status_pending_p = 1; @@ -2455,19 +2431,17 @@ linux_process_target::resume_stopped_resumed_lwps (thread_info *thread) { struct lwp_info *lp = get_thread_lwp (thread); - if (lp->stopped - && !lp->suspended - && !lp->status_pending_p + if (lp->stopped && !lp->suspended && !lp->status_pending_p && thread->last_status.kind () == TARGET_WAITKIND_IGNORE) { int step = 0; if (thread->last_resume_kind == resume_step) - step = maybe_hw_step (thread); + step = maybe_hw_step (thread); threads_debug_printf ("resuming stopped-resumed LWP %s at %s: step=%d", - target_pid_to_str (ptid_of (thread)).c_str (), - paddress (lp->stop_pc), step); + target_pid_to_str (ptid_of (thread)).c_str (), + paddress (lp->stop_pc), step); resume_one_lwp (lp, step, GDB_SIGNAL_0, NULL); } @@ -2475,14 +2449,14 @@ linux_process_target::resume_stopped_resumed_lwps (thread_info *thread) int linux_process_target::wait_for_event_filtered (ptid_t wait_ptid, - ptid_t filter_ptid, - int *wstatp, int options) + ptid_t filter_ptid, int *wstatp, + int options) { struct thread_info *event_thread; struct lwp_info *event_child, *requested_child; sigset_t block_mask, prev_mask; - retry: +retry: /* N.B. event_thread points to the thread_info struct that contains event_child. Keep them in sync. */ event_thread = NULL; @@ -2493,52 +2467,51 @@ linux_process_target::wait_for_event_filtered (ptid_t wait_ptid, if (filter_ptid == minus_one_ptid || filter_ptid.is_pid ()) { - event_thread = find_thread_in_random ([&] (thread_info *thread) - { - return status_pending_p_callback (thread, filter_ptid); - }); + event_thread = find_thread_in_random ([&] (thread_info *thread) { + return status_pending_p_callback (thread, filter_ptid); + }); if (event_thread != NULL) - { - event_child = get_thread_lwp (event_thread); - threads_debug_printf ("Got a pending child %ld", lwpid_of (event_thread)); - } + { + event_child = get_thread_lwp (event_thread); + threads_debug_printf ("Got a pending child %ld", + lwpid_of (event_thread)); + } } else if (filter_ptid != null_ptid) { requested_child = find_lwp_pid (filter_ptid); if (stopping_threads == NOT_STOPPING_THREADS - && requested_child->status_pending_p - && (requested_child->collecting_fast_tracepoint - != fast_tpoint_collect_result::not_collecting)) - { - enqueue_one_deferred_signal (requested_child, - &requested_child->status_pending); - requested_child->status_pending_p = 0; - requested_child->status_pending = 0; - resume_one_lwp (requested_child, 0, 0, NULL); - } - - if (requested_child->suspended - && requested_child->status_pending_p) - { - internal_error ("requesting an event out of a" - " suspended child?"); - } + && requested_child->status_pending_p + && (requested_child->collecting_fast_tracepoint + != fast_tpoint_collect_result::not_collecting)) + { + enqueue_one_deferred_signal (requested_child, + &requested_child->status_pending); + requested_child->status_pending_p = 0; + requested_child->status_pending = 0; + resume_one_lwp (requested_child, 0, 0, NULL); + } + + if (requested_child->suspended && requested_child->status_pending_p) + { + internal_error ("requesting an event out of a" + " suspended child?"); + } if (requested_child->status_pending_p) - { - event_child = requested_child; - event_thread = get_lwp_thread (event_child); - } + { + event_child = requested_child; + event_thread = get_lwp_thread (event_child); + } } if (event_child != NULL) { threads_debug_printf ("Got an event from pending child %ld (%04x)", - lwpid_of (event_thread), - event_child->status_pending); + lwpid_of (event_thread), + event_child->status_pending); *wstatp = event_child->status_pending; event_child->status_pending_p = 0; @@ -2581,55 +2554,52 @@ linux_process_target::wait_for_event_filtered (ptid_t wait_ptid, errno = 0; ret = my_waitpid (-1, wstatp, options | WNOHANG); - threads_debug_printf ("waitpid(-1, ...) returned %d, %s", - ret, errno ? safe_strerror (errno) : "ERRNO-OK"); + threads_debug_printf ("waitpid(-1, ...) returned %d, %s", ret, + errno ? safe_strerror (errno) : "ERRNO-OK"); if (ret > 0) - { - threads_debug_printf ("waitpid %ld received %s", - (long) ret, status_to_str (*wstatp).c_str ()); + { + threads_debug_printf ("waitpid %ld received %s", (long) ret, + status_to_str (*wstatp).c_str ()); - /* Filter all events. IOW, leave all events pending. We'll + /* Filter all events. IOW, leave all events pending. We'll randomly select an event LWP out of all that have events below. */ - filter_event (ret, *wstatp); - /* Retry until nothing comes out of waitpid. A single + filter_event (ret, *wstatp); + /* Retry until nothing comes out of waitpid. A single SIGCHLD can indicate more than one child stopped. */ - continue; - } + continue; + } /* Now that we've pulled all events out of the kernel, resume LWPs that don't have an interesting event to report. */ if (stopping_threads == NOT_STOPPING_THREADS) - for_each_thread ([this] (thread_info *thread) - { - resume_stopped_resumed_lwps (thread); - }); + for_each_thread ([this] (thread_info *thread) { + resume_stopped_resumed_lwps (thread); + }); /* ... and find an LWP with a status to report to the core, if any. */ - event_thread = find_thread_in_random ([&] (thread_info *thread) - { - return status_pending_p_callback (thread, filter_ptid); - }); + event_thread = find_thread_in_random ([&] (thread_info *thread) { + return status_pending_p_callback (thread, filter_ptid); + }); if (event_thread != NULL) - { - event_child = get_thread_lwp (event_thread); - *wstatp = event_child->status_pending; - event_child->status_pending_p = 0; - event_child->status_pending = 0; - break; - } + { + event_child = get_thread_lwp (event_thread); + *wstatp = event_child->status_pending; + event_child->status_pending_p = 0; + event_child->status_pending = 0; + break; + } /* Check for zombie thread group leaders. Those can't be reaped until all other threads in the thread group are. */ check_zombie_leaders (); - auto not_stopped = [&] (thread_info *thread) - { - return not_stopped_callback (thread, wait_ptid); - }; + auto not_stopped = [&] (thread_info *thread) { + return not_stopped_callback (thread, wait_ptid); + }; /* If there are no resumed children left in the set of LWPs we want to wait for, bail. We can't just block in @@ -2639,21 +2609,21 @@ linux_process_target::wait_for_event_filtered (ptid_t wait_ptid, them). Even if WNOHANG is set, this return code is preferred over 0 (below), as it is more detailed. */ if (find_thread (not_stopped) == NULL) - { - threads_debug_printf ("exit (no unwaited-for LWP)"); + { + threads_debug_printf ("exit (no unwaited-for LWP)"); - gdb_sigmask (SIG_SETMASK, &prev_mask, NULL); - return -1; - } + gdb_sigmask (SIG_SETMASK, &prev_mask, NULL); + return -1; + } /* No interesting event to report to the caller. */ if ((options & WNOHANG)) - { - threads_debug_printf ("WNOHANG set, no event found"); + { + threads_debug_printf ("WNOHANG set, no event found"); - gdb_sigmask (SIG_SETMASK, &prev_mask, NULL); - return 0; - } + gdb_sigmask (SIG_SETMASK, &prev_mask, NULL); + return 0; + } /* Block until we get an event reported with SIGCHLD. */ threads_debug_printf ("sigsuspend'ing"); @@ -2693,33 +2663,31 @@ select_event_lwp (struct lwp_info **orig_lp) would report it to the user as a random signal. */ if (!non_stop) { - event_thread = find_thread ([] (thread_info *thread) - { - lwp_info *lp = get_thread_lwp (thread); + event_thread = find_thread ([] (thread_info *thread) { + lwp_info *lp = get_thread_lwp (thread); - return (thread->last_status.kind () == TARGET_WAITKIND_IGNORE - && thread->last_resume_kind == resume_step - && lp->status_pending_p); - }); + return (thread->last_status.kind () == TARGET_WAITKIND_IGNORE + && thread->last_resume_kind == resume_step + && lp->status_pending_p); + }); if (event_thread != NULL) - threads_debug_printf - ("Select single-step %s", - target_pid_to_str (ptid_of (event_thread)).c_str ()); + threads_debug_printf ("Select single-step %s", + target_pid_to_str (ptid_of (event_thread)) + .c_str ()); } if (event_thread == NULL) { /* No single-stepping LWP. Select one at random, out of those which have had events. */ - event_thread = find_thread_in_random ([&] (thread_info *thread) - { - lwp_info *lp = get_thread_lwp (thread); + event_thread = find_thread_in_random ([&] (thread_info *thread) { + lwp_info *lp = get_thread_lwp (thread); - /* Only resumed LWPs that have an event pending. */ - return (thread->last_status.kind () == TARGET_WAITKIND_IGNORE - && lp->status_pending_p); - }); + /* Only resumed LWPs that have an event pending. */ + return (thread->last_status.kind () == TARGET_WAITKIND_IGNORE + && lp->status_pending_p); + }); } if (event_thread != NULL) @@ -2737,13 +2705,12 @@ select_event_lwp (struct lwp_info **orig_lp) static void unsuspend_all_lwps (struct lwp_info *except) { - for_each_thread ([&] (thread_info *thread) - { - lwp_info *lwp = get_thread_lwp (thread); + for_each_thread ([&] (thread_info *thread) { + lwp_info *lwp = get_thread_lwp (thread); - if (lwp != except) - lwp_suspended_decr (lwp); - }); + if (lwp != except) + lwp_suspended_decr (lwp); + }); } static bool lwp_running (thread_info *thread); @@ -2781,15 +2748,13 @@ static bool lwp_running (thread_info *thread); void linux_process_target::stabilize_threads () { - thread_info *thread_stuck = find_thread ([this] (thread_info *thread) - { - return stuck_in_jump_pad (thread); - }); + thread_info *thread_stuck = find_thread ( + [this] (thread_info *thread) { return stuck_in_jump_pad (thread); }); if (thread_stuck != NULL) { threads_debug_printf ("can't stabilize, LWP %ld is stuck in jump pad", - lwpid_of (thread_stuck)); + lwpid_of (thread_stuck)); return; } @@ -2798,10 +2763,8 @@ linux_process_target::stabilize_threads () stabilizing_threads = 1; /* Kick 'em all. */ - for_each_thread ([this] (thread_info *thread) - { - move_out_of_jump_pad (thread); - }); + for_each_thread ( + [this] (thread_info *thread) { move_out_of_jump_pad (thread); }); /* Loop until all are stopped out of the jump pads. */ while (find_thread (lwp_running) != NULL) @@ -2816,19 +2779,19 @@ linux_process_target::stabilize_threads () wait_1 (minus_one_ptid, &ourstatus, 0); if (ourstatus.kind () == TARGET_WAITKIND_STOPPED) - { - lwp = get_thread_lwp (current_thread); + { + lwp = get_thread_lwp (current_thread); - /* Lock it. */ - lwp_suspended_inc (lwp); + /* Lock it. */ + lwp_suspended_inc (lwp); - if (ourstatus.sig () != GDB_SIGNAL_0 - || current_thread->last_resume_kind == resume_stop) - { - wstat = W_STOPCODE (gdb_signal_to_host (ourstatus.sig ())); - enqueue_one_deferred_signal (lwp, &wstat); - } - } + if (ourstatus.sig () != GDB_SIGNAL_0 + || current_thread->last_resume_kind == resume_stop) + { + wstat = W_STOPCODE (gdb_signal_to_host (ourstatus.sig ())); + enqueue_one_deferred_signal (lwp, &wstat); + } + } } unsuspend_all_lwps (NULL); @@ -2837,15 +2800,13 @@ linux_process_target::stabilize_threads () if (debug_threads) { - thread_stuck = find_thread ([this] (thread_info *thread) - { - return stuck_in_jump_pad (thread); - }); + thread_stuck = find_thread ( + [this] (thread_info *thread) { return stuck_in_jump_pad (thread); }); if (thread_stuck != NULL) - threads_debug_printf - ("couldn't stabilize, LWP %ld got stuck in jump pad", - lwpid_of (thread_stuck)); + threads_debug_printf ( + "couldn't stabilize, LWP %ld got stuck in jump pad", + lwpid_of (thread_stuck)); } } @@ -2866,7 +2827,7 @@ ignore_event (struct target_waitstatus *ourstatus) ptid_t linux_process_target::filter_exit_event (lwp_info *event_child, - target_waitstatus *ourstatus) + target_waitstatus *ourstatus) { client_state &cs = get_client_state (); struct thread_info *thread = get_lwp_thread (event_child); @@ -2875,9 +2836,9 @@ linux_process_target::filter_exit_event (lwp_info *event_child, if (!is_leader (thread)) { if (cs.report_thread_events) - ourstatus->set_thread_exited (0); + ourstatus->set_thread_exited (0); else - ourstatus->set_ignore (); + ourstatus->set_ignore (); delete_lwp (event_child); } @@ -2919,7 +2880,7 @@ linux_process_target::gdb_catch_this_syscall (lwp_info *event_child) ptid_t linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, - target_wait_flags target_options) + target_wait_flags target_options) { THREADS_SCOPED_DEBUG_ENTER_EXIT; @@ -2948,15 +2909,13 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, in_step_range = 0; ourstatus->set_ignore (); - auto status_pending_p_any = [&] (thread_info *thread) - { - return status_pending_p_callback (thread, minus_one_ptid); - }; + auto status_pending_p_any = [&] (thread_info *thread) { + return status_pending_p_callback (thread, minus_one_ptid); + }; - auto not_stopped = [&] (thread_info *thread) - { - return not_stopped_callback (thread, minus_one_ptid); - }; + auto not_stopped = [&] (thread_info *thread) { + return not_stopped_callback (thread, minus_one_ptid); + }; /* Find a resumed LWP, if any. */ if (find_thread (status_pending_p_any) != NULL) @@ -2971,7 +2930,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, else { threads_debug_printf ("step_over_bkpt set [%s], doing a blocking wait", - target_pid_to_str (step_over_bkpt).c_str ()); + target_pid_to_str (step_over_bkpt).c_str ()); pid = wait_for_event (step_over_bkpt, &w, options & ~WNOHANG); } @@ -2999,26 +2958,26 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (WIFEXITED (w) || WIFSIGNALED (w)) { if (WIFEXITED (w)) - { - ourstatus->set_exited (WEXITSTATUS (w)); - - threads_debug_printf - ("ret = %s, exited with retcode %d", - target_pid_to_str (ptid_of (current_thread)).c_str (), - WEXITSTATUS (w)); - } + { + ourstatus->set_exited (WEXITSTATUS (w)); + + threads_debug_printf ("ret = %s, exited with retcode %d", + target_pid_to_str (ptid_of (current_thread)) + .c_str (), + WEXITSTATUS (w)); + } else - { - ourstatus->set_signalled (gdb_signal_from_host (WTERMSIG (w))); + { + ourstatus->set_signalled (gdb_signal_from_host (WTERMSIG (w))); - threads_debug_printf - ("ret = %s, terminated with signal %d", - target_pid_to_str (ptid_of (current_thread)).c_str (), - WTERMSIG (w)); - } + threads_debug_printf ("ret = %s, terminated with signal %d", + target_pid_to_str (ptid_of (current_thread)) + .c_str (), + WTERMSIG (w)); + } if (ourstatus->kind () == TARGET_WAITKIND_EXITED) - return filter_exit_event (event_child, ourstatus); + return filter_exit_event (event_child, ourstatus); return ptid_of (current_thread); } @@ -3037,7 +2996,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (step_over_bkpt != null_ptid && event_child->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT && (event_child->stepping - || !single_step_breakpoint_inserted_here (event_child->stop_pc))) + || !single_step_breakpoint_inserted_here (event_child->stop_pc))) { int increment_pc = 0; int breakpoint_kind = 0; @@ -3046,21 +3005,20 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, breakpoint_kind = breakpoint_kind_from_current_state (&stop_pc); sw_breakpoint_from_kind (breakpoint_kind, &increment_pc); - threads_debug_printf - ("step-over for %s executed software breakpoint", - target_pid_to_str (ptid_of (current_thread)).c_str ()); + threads_debug_printf ("step-over for %s executed software breakpoint", + target_pid_to_str (ptid_of (current_thread)) + .c_str ()); if (increment_pc != 0) - { - struct regcache *regcache - = get_thread_regcache (current_thread, 1); + { + struct regcache *regcache = get_thread_regcache (current_thread, 1); - event_child->stop_pc += increment_pc; - low_set_pc (regcache, event_child->stop_pc); + event_child->stop_pc += increment_pc; + low_set_pc (regcache, event_child->stop_pc); - if (!low_breakpoint_at (event_child->stop_pc)) - event_child->stop_reason = TARGET_STOPPED_BY_NO_REASON; - } + if (!low_breakpoint_at (event_child->stop_pc)) + event_child->stop_reason = TARGET_STOPPED_BY_NO_REASON; + } } /* If this event was not handled before, and is not a SIGTRAP, we @@ -3071,9 +3029,8 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, maybe_internal_trap = (low_supports_breakpoints () && (WSTOPSIG (w) == SIGTRAP - || ((WSTOPSIG (w) == SIGILL - || WSTOPSIG (w) == SIGSEGV) - && low_breakpoint_at (event_child->stop_pc)))); + || ((WSTOPSIG (w) == SIGILL || WSTOPSIG (w) == SIGSEGV) + && low_breakpoint_at (event_child->stop_pc)))); if (maybe_internal_trap) { @@ -3101,7 +3058,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, trace_event = handle_tracepoints (event_child); if (bp_explains_trap) - threads_debug_printf ("Hit a gdbserver breakpoint."); + threads_debug_printf ("Hit a gdbserver breakpoint."); } else { @@ -3117,108 +3074,105 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, move out of the jump pad before delivering a signal. See linux_stabilize_threads. */ - if (WIFSTOPPED (w) - && WSTOPSIG (w) != SIGTRAP - && supports_fast_tracepoints () + if (WIFSTOPPED (w) && WSTOPSIG (w) != SIGTRAP && supports_fast_tracepoints () && agent_loaded_p ()) { threads_debug_printf ("Got signal %d for LWP %ld. Check if we need " - "to defer or adjust it.", - WSTOPSIG (w), lwpid_of (current_thread)); + "to defer or adjust it.", + WSTOPSIG (w), lwpid_of (current_thread)); /* Allow debugging the jump pad itself. */ if (current_thread->last_resume_kind != resume_step - && maybe_move_out_of_jump_pad (event_child, &w)) - { - enqueue_one_deferred_signal (event_child, &w); + && maybe_move_out_of_jump_pad (event_child, &w)) + { + enqueue_one_deferred_signal (event_child, &w); - threads_debug_printf ("Signal %d for LWP %ld deferred (in jump pad)", - WSTOPSIG (w), lwpid_of (current_thread)); + threads_debug_printf ("Signal %d for LWP %ld deferred (in jump pad)", + WSTOPSIG (w), lwpid_of (current_thread)); - resume_one_lwp (event_child, 0, 0, NULL); + resume_one_lwp (event_child, 0, 0, NULL); - return ignore_event (ourstatus); - } + return ignore_event (ourstatus); + } } if (event_child->collecting_fast_tracepoint != fast_tpoint_collect_result::not_collecting) { - threads_debug_printf - ("LWP %ld was trying to move out of the jump pad (%d). " - "Check if we're already there.", - lwpid_of (current_thread), - (int) event_child->collecting_fast_tracepoint); + threads_debug_printf ( + "LWP %ld was trying to move out of the jump pad (%d). " + "Check if we're already there.", + lwpid_of (current_thread), + (int) event_child->collecting_fast_tracepoint); trace_event = 1; event_child->collecting_fast_tracepoint - = linux_fast_tracepoint_collecting (event_child, NULL); + = linux_fast_tracepoint_collecting (event_child, NULL); if (event_child->collecting_fast_tracepoint - != fast_tpoint_collect_result::before_insn) - { - /* No longer need this breakpoint. */ - if (event_child->exit_jump_pad_bkpt != NULL) - { - threads_debug_printf - ("No longer need exit-jump-pad bkpt; removing it." - "stopping all threads momentarily."); - - /* Other running threads could hit this breakpoint. + != fast_tpoint_collect_result::before_insn) + { + /* No longer need this breakpoint. */ + if (event_child->exit_jump_pad_bkpt != NULL) + { + threads_debug_printf ( + "No longer need exit-jump-pad bkpt; removing it." + "stopping all threads momentarily."); + + /* Other running threads could hit this breakpoint. We don't handle moribund locations like GDB does, instead we always pause all threads when removing breakpoints, so that any step-over or decr_pc_after_break adjustment is always taken care of while the breakpoint is still inserted. */ - stop_all_lwps (1, event_child); + stop_all_lwps (1, event_child); - delete_breakpoint (event_child->exit_jump_pad_bkpt); - event_child->exit_jump_pad_bkpt = NULL; + delete_breakpoint (event_child->exit_jump_pad_bkpt); + event_child->exit_jump_pad_bkpt = NULL; - unstop_all_lwps (1, event_child); + unstop_all_lwps (1, event_child); - gdb_assert (event_child->suspended >= 0); - } - } + gdb_assert (event_child->suspended >= 0); + } + } if (event_child->collecting_fast_tracepoint - == fast_tpoint_collect_result::not_collecting) - { - threads_debug_printf - ("fast tracepoint finished collecting successfully."); + == fast_tpoint_collect_result::not_collecting) + { + threads_debug_printf ( + "fast tracepoint finished collecting successfully."); - /* We may have a deferred signal to report. */ - if (dequeue_one_deferred_signal (event_child, &w)) - threads_debug_printf ("dequeued one signal."); - else - { - threads_debug_printf ("no deferred signals."); + /* We may have a deferred signal to report. */ + if (dequeue_one_deferred_signal (event_child, &w)) + threads_debug_printf ("dequeued one signal."); + else + { + threads_debug_printf ("no deferred signals."); - if (stabilizing_threads) - { - ourstatus->set_stopped (GDB_SIGNAL_0); + if (stabilizing_threads) + { + ourstatus->set_stopped (GDB_SIGNAL_0); - threads_debug_printf - ("ret = %s, stopped while stabilizing threads", - target_pid_to_str (ptid_of (current_thread)).c_str ()); + threads_debug_printf ( + "ret = %s, stopped while stabilizing threads", + target_pid_to_str (ptid_of (current_thread)).c_str ()); - return ptid_of (current_thread); - } - } - } + return ptid_of (current_thread); + } + } + } } /* Check whether GDB would be interested in this event. */ /* Check if GDB is interested in this syscall. */ - if (WIFSTOPPED (w) - && WSTOPSIG (w) == SYSCALL_SIGTRAP + if (WIFSTOPPED (w) && WSTOPSIG (w) == SYSCALL_SIGTRAP && !gdb_catch_this_syscall (event_child)) { threads_debug_printf ("Ignored syscall for LWP %ld.", - lwpid_of (current_thread)); + lwpid_of (current_thread)); resume_one_lwp (event_child, event_child->stepping, 0, NULL); @@ -3233,49 +3187,48 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, stepping - they may require special handling to skip the signal handler. Also never ignore signals that could be caused by a breakpoint. */ - if (WIFSTOPPED (w) - && current_thread->last_resume_kind != resume_step + if (WIFSTOPPED (w) && current_thread->last_resume_kind != resume_step && ( -#if defined (USE_THREAD_DB) && !defined (__ANDROID__) - (current_process ()->priv->thread_db != NULL - && (WSTOPSIG (w) == __SIGRTMIN - || WSTOPSIG (w) == __SIGRTMIN + 1)) - || +#if defined(USE_THREAD_DB) && !defined(__ANDROID__) + (current_process ()->priv->thread_db != NULL + && (WSTOPSIG (w) == __SIGRTMIN || WSTOPSIG (w) == __SIGRTMIN + 1)) + || #endif - (cs.pass_signals[gdb_signal_from_host (WSTOPSIG (w))] - && !(WSTOPSIG (w) == SIGSTOP - && current_thread->last_resume_kind == resume_stop) - && !linux_wstatus_maybe_breakpoint (w)))) + (cs.pass_signals[gdb_signal_from_host (WSTOPSIG (w))] + && !(WSTOPSIG (w) == SIGSTOP + && current_thread->last_resume_kind == resume_stop) + && !linux_wstatus_maybe_breakpoint (w)))) { siginfo_t info, *info_p; - threads_debug_printf ("Ignored signal %d for LWP %ld.", - WSTOPSIG (w), lwpid_of (current_thread)); + threads_debug_printf ("Ignored signal %d for LWP %ld.", WSTOPSIG (w), + lwpid_of (current_thread)); if (ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread), - (PTRACE_TYPE_ARG3) 0, &info) == 0) - info_p = &info; + (PTRACE_TYPE_ARG3) 0, &info) + == 0) + info_p = &info; else - info_p = NULL; + info_p = NULL; if (step_over_finished) - { - /* We cancelled this thread's step-over above. We still + { + /* We cancelled this thread's step-over above. We still need to unsuspend all other LWPs, and set them back running again while the signal handler runs. */ - unsuspend_all_lwps (event_child); + unsuspend_all_lwps (event_child); - /* Enqueue the pending signal info so that proceed_all_lwps + /* Enqueue the pending signal info so that proceed_all_lwps doesn't lose it. */ - enqueue_pending_signal (event_child, WSTOPSIG (w), info_p); + enqueue_pending_signal (event_child, WSTOPSIG (w), info_p); - proceed_all_lwps (); - } + proceed_all_lwps (); + } else - { - resume_one_lwp (event_child, event_child->stepping, - WSTOPSIG (w), info_p); - } + { + resume_one_lwp (event_child, event_child->stepping, WSTOPSIG (w), + info_p); + } return ignore_event (ourstatus); } @@ -3297,20 +3250,18 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, That indicates that we had previously finished a single-step but left the single-step pending -- see complete_ongoing_step_over. */ - report_to_gdb = (!maybe_internal_trap - || (current_thread->last_resume_kind == resume_step - && !in_step_range) - || event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT - || (!in_step_range - && !bp_explains_trap - && !trace_event - && !step_over_finished - && !(current_thread->last_resume_kind == resume_continue - && event_child->stop_reason == TARGET_STOPPED_BY_SINGLE_STEP)) - || (gdb_breakpoint_here (event_child->stop_pc) - && gdb_condition_true_at_breakpoint (event_child->stop_pc) - && gdb_no_commands_at_breakpoint (event_child->stop_pc)) - || event_child->waitstatus.kind () != TARGET_WAITKIND_IGNORE); + report_to_gdb + = (!maybe_internal_trap + || (current_thread->last_resume_kind == resume_step && !in_step_range) + || event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT + || (!in_step_range && !bp_explains_trap && !trace_event + && !step_over_finished + && !(current_thread->last_resume_kind == resume_continue + && event_child->stop_reason == TARGET_STOPPED_BY_SINGLE_STEP)) + || (gdb_breakpoint_here (event_child->stop_pc) + && gdb_condition_true_at_breakpoint (event_child->stop_pc) + && gdb_no_commands_at_breakpoint (event_child->stop_pc)) + || event_child->waitstatus.kind () != TARGET_WAITKIND_IGNORE); run_breakpoint_commands (event_child->stop_pc); @@ -3320,53 +3271,52 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (!report_to_gdb) { if (bp_explains_trap) - threads_debug_printf ("Hit a gdbserver breakpoint."); + threads_debug_printf ("Hit a gdbserver breakpoint."); if (step_over_finished) - threads_debug_printf ("Step-over finished."); + threads_debug_printf ("Step-over finished."); if (trace_event) - threads_debug_printf ("Tracepoint event."); + threads_debug_printf ("Tracepoint event."); if (lwp_in_step_range (event_child)) - threads_debug_printf ("Range stepping pc 0x%s [0x%s, 0x%s).", - paddress (event_child->stop_pc), - paddress (event_child->step_range_start), - paddress (event_child->step_range_end)); + threads_debug_printf ("Range stepping pc 0x%s [0x%s, 0x%s).", + paddress (event_child->stop_pc), + paddress (event_child->step_range_start), + paddress (event_child->step_range_end)); /* We're not reporting this breakpoint to GDB, so apply the decr_pc_after_break adjustment to the inferior's regcache ourselves. */ if (low_supports_breakpoints ()) - { - struct regcache *regcache - = get_thread_regcache (current_thread, 1); - low_set_pc (regcache, event_child->stop_pc); - } + { + struct regcache *regcache = get_thread_regcache (current_thread, 1); + low_set_pc (regcache, event_child->stop_pc); + } if (step_over_finished) - { - /* If we have finished stepping over a breakpoint, we've + { + /* If we have finished stepping over a breakpoint, we've stopped and suspended all LWPs momentarily except the stepping one. This is where we resume them all again. We're going to keep waiting, so use proceed, which handles stepping over the next breakpoint. */ - unsuspend_all_lwps (event_child); - } + unsuspend_all_lwps (event_child); + } else - { - /* Remove the single-step breakpoints if any. Note that + { + /* Remove the single-step breakpoints if any. Note that there isn't single-step breakpoint if we finished stepping over. */ - if (supports_software_single_step () - && has_single_step_breakpoints (current_thread)) - { - stop_all_lwps (0, event_child); - delete_single_step_breakpoints (current_thread); - unstop_all_lwps (0, event_child); - } - } + if (supports_software_single_step () + && has_single_step_breakpoints (current_thread)) + { + stop_all_lwps (0, event_child); + delete_single_step_breakpoints (current_thread); + unstop_all_lwps (0, event_child); + } + } threads_debug_printf ("proceeding all threads."); @@ -3375,29 +3325,29 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, return ignore_event (ourstatus); } - if (debug_threads) - { - if (event_child->waitstatus.kind () != TARGET_WAITKIND_IGNORE) - threads_debug_printf ("LWP %ld: extended event with waitstatus %s", - lwpid_of (get_lwp_thread (event_child)), - event_child->waitstatus.to_string ().c_str ()); - - if (current_thread->last_resume_kind == resume_step) - { - if (event_child->step_range_start == event_child->step_range_end) - threads_debug_printf - ("GDB wanted to single-step, reporting event."); - else if (!lwp_in_step_range (event_child)) - threads_debug_printf ("Out of step range, reporting event."); - } - - if (event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT) - threads_debug_printf ("Stopped by watchpoint."); - else if (gdb_breakpoint_here (event_child->stop_pc)) - threads_debug_printf ("Stopped by GDB breakpoint."); - } + if (debug_threads) + { + if (event_child->waitstatus.kind () != TARGET_WAITKIND_IGNORE) + threads_debug_printf ("LWP %ld: extended event with waitstatus %s", + lwpid_of (get_lwp_thread (event_child)), + event_child->waitstatus.to_string ().c_str ()); + + if (current_thread->last_resume_kind == resume_step) + { + if (event_child->step_range_start == event_child->step_range_end) + threads_debug_printf ( + "GDB wanted to single-step, reporting event."); + else if (!lwp_in_step_range (event_child)) + threads_debug_printf ("Out of step range, reporting event."); + } + + if (event_child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT) + threads_debug_printf ("Stopped by watchpoint."); + else if (gdb_breakpoint_here (event_child->stop_pc)) + threads_debug_printf ("Stopped by GDB breakpoint."); + } - threads_debug_printf ("Hit a non-gdbserver trap event."); + threads_debug_printf ("Hit a non-gdbserver trap event."); /* Alright, we're going to report a stop. */ @@ -3410,102 +3360,101 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, int remove_single_step_breakpoints_p = 0; if (non_stop) - { - remove_single_step_breakpoints_p - = has_single_step_breakpoints (current_thread); - } + { + remove_single_step_breakpoints_p + = has_single_step_breakpoints (current_thread); + } else - { - /* In all-stop, a stop reply cancels all previous resume + { + /* In all-stop, a stop reply cancels all previous resume requests. Delete all single-step breakpoints. */ - find_thread ([&] (thread_info *thread) { - if (has_single_step_breakpoints (thread)) - { - remove_single_step_breakpoints_p = 1; - return true; - } + find_thread ([&] (thread_info *thread) { + if (has_single_step_breakpoints (thread)) + { + remove_single_step_breakpoints_p = 1; + return true; + } - return false; - }); - } + return false; + }); + } if (remove_single_step_breakpoints_p) - { - /* If we remove single-step breakpoints from memory, stop all lwps, + { + /* If we remove single-step breakpoints from memory, stop all lwps, so that other threads won't hit the breakpoint in the staled memory. */ - stop_all_lwps (0, event_child); + stop_all_lwps (0, event_child); - if (non_stop) - { - gdb_assert (has_single_step_breakpoints (current_thread)); - delete_single_step_breakpoints (current_thread); - } - else - { - for_each_thread ([] (thread_info *thread){ - if (has_single_step_breakpoints (thread)) - delete_single_step_breakpoints (thread); - }); - } + if (non_stop) + { + gdb_assert (has_single_step_breakpoints (current_thread)); + delete_single_step_breakpoints (current_thread); + } + else + { + for_each_thread ([] (thread_info *thread) { + if (has_single_step_breakpoints (thread)) + delete_single_step_breakpoints (thread); + }); + } - unstop_all_lwps (0, event_child); - } + unstop_all_lwps (0, event_child); + } } if (!stabilizing_threads) { /* In all-stop, stop all threads. */ if (!non_stop) - stop_all_lwps (0, NULL); + stop_all_lwps (0, NULL); if (step_over_finished) - { - if (!non_stop) - { - /* If we were doing a step-over, all other threads but + { + if (!non_stop) + { + /* If we were doing a step-over, all other threads but the stepping one had been paused in start_step_over, with their suspend counts incremented. We don't want to do a full unstop/unpause, because we're in all-stop mode (so we want threads stopped), but we still need to unsuspend the other threads, to decrement their `suspended' count back. */ - unsuspend_all_lwps (event_child); - } - else - { - /* If we just finished a step-over, then all threads had + unsuspend_all_lwps (event_child); + } + else + { + /* If we just finished a step-over, then all threads had been momentarily paused. In all-stop, that's fine, we want threads stopped by now anyway. In non-stop, we need to re-resume threads that GDB wanted to be running. */ - unstop_all_lwps (1, event_child); - } - } + unstop_all_lwps (1, event_child); + } + } /* If we're not waiting for a specific LWP, choose an event LWP from among those that have had events. Giving equal priority to all LWPs that have had events helps prevent starvation. */ if (ptid == minus_one_ptid) - { - event_child->status_pending_p = 1; - event_child->status_pending = w; + { + event_child->status_pending_p = 1; + event_child->status_pending = w; - select_event_lwp (&event_child); + select_event_lwp (&event_child); - /* current_thread and event_child must stay in sync. */ - switch_to_thread (get_lwp_thread (event_child)); - - event_child->status_pending_p = 0; - w = event_child->status_pending; - } + /* current_thread and event_child must stay in sync. */ + switch_to_thread (get_lwp_thread (event_child)); + event_child->status_pending_p = 0; + w = event_child->status_pending; + } /* Stabilize threads (move out of jump pads). */ if (!non_stop) - target_stabilize_threads (); + target_stabilize_threads (); } else { @@ -3514,7 +3463,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, threads stopped by now anyway. In non-stop, we need to re-resume threads that GDB wanted to be running. */ if (step_over_finished) - unstop_all_lwps (1, event_child); + unstop_all_lwps (1, event_child); } /* At this point, we haven't set OURSTATUS. This is where we do it. */ @@ -3527,11 +3476,11 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, /* Break the unreported fork relationship chain. */ if (event_child->waitstatus.kind () == TARGET_WAITKIND_FORKED - || event_child->waitstatus.kind () == TARGET_WAITKIND_VFORKED) - { - event_child->fork_relative->fork_relative = NULL; - event_child->fork_relative = NULL; - } + || event_child->waitstatus.kind () == TARGET_WAITKIND_VFORKED) + { + event_child->fork_relative->fork_relative = NULL; + event_child->fork_relative = NULL; + } *ourstatus = event_child->waitstatus; /* Clear the event lwp's waitstatus since we handled it already. */ @@ -3543,27 +3492,28 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, event_chid->waitstatus wasn't filled in with the details, so look at the wait status W. */ if (WSTOPSIG (w) == SYSCALL_SIGTRAP) - { - int syscall_number; - - get_syscall_trapinfo (event_child, &syscall_number); - if (event_child->syscall_state == TARGET_WAITKIND_SYSCALL_ENTRY) - ourstatus->set_syscall_entry (syscall_number); - else if (event_child->syscall_state == TARGET_WAITKIND_SYSCALL_RETURN) - ourstatus->set_syscall_return (syscall_number); - else - gdb_assert_not_reached ("unexpected syscall state"); - } + { + int syscall_number; + + get_syscall_trapinfo (event_child, &syscall_number); + if (event_child->syscall_state == TARGET_WAITKIND_SYSCALL_ENTRY) + ourstatus->set_syscall_entry (syscall_number); + else if (event_child->syscall_state + == TARGET_WAITKIND_SYSCALL_RETURN) + ourstatus->set_syscall_return (syscall_number); + else + gdb_assert_not_reached ("unexpected syscall state"); + } else if (current_thread->last_resume_kind == resume_stop - && WSTOPSIG (w) == SIGSTOP) - { - /* A thread that has been requested to stop by GDB with vCont;t, + && WSTOPSIG (w) == SIGSTOP) + { + /* A thread that has been requested to stop by GDB with vCont;t, and it stopped cleanly, so report as SIG0. The use of SIGSTOP is an implementation detail. */ - ourstatus->set_stopped (GDB_SIGNAL_0); - } + ourstatus->set_stopped (GDB_SIGNAL_0); + } else - ourstatus->set_stopped (gdb_signal_from_host (WSTOPSIG (w))); + ourstatus->set_stopped (gdb_signal_from_host (WSTOPSIG (w))); } /* Now that we've selected our final event LWP, un-adjust its PC if @@ -3575,18 +3525,17 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, int decr_pc = low_decr_pc_after_break (); if (decr_pc != 0) - { - struct regcache *regcache - = get_thread_regcache (current_thread, 1); - low_set_pc (regcache, event_child->stop_pc + decr_pc); - } + { + struct regcache *regcache = get_thread_regcache (current_thread, 1); + low_set_pc (regcache, event_child->stop_pc + decr_pc); + } } gdb_assert (step_over_bkpt == null_ptid); threads_debug_printf ("ret = %s, %s", - target_pid_to_str (ptid_of (current_thread)).c_str (), - ourstatus->to_string ().c_str ()); + target_pid_to_str (ptid_of (current_thread)).c_str (), + ourstatus->to_string ().c_str ()); if (ourstatus->kind () == TARGET_WAITKIND_EXITED) return filter_exit_event (event_child, ourstatus); @@ -3609,9 +3558,8 @@ async_file_mark (void) } ptid_t -linux_process_target::wait (ptid_t ptid, - target_waitstatus *ourstatus, - target_wait_flags target_options) +linux_process_target::wait (ptid_t ptid, target_waitstatus *ourstatus, + target_wait_flags target_options) { ptid_t event_ptid; @@ -3623,14 +3571,12 @@ linux_process_target::wait (ptid_t ptid, { event_ptid = wait_1 (ptid, ourstatus, target_options); } - while ((target_options & TARGET_WNOHANG) == 0 - && event_ptid == null_ptid - && ourstatus->kind () == TARGET_WAITKIND_IGNORE); + while ((target_options & TARGET_WNOHANG) == 0 && event_ptid == null_ptid + && ourstatus->kind () == TARGET_WAITKIND_IGNORE); /* If at least one stop was reported, there may be more. A single SIGCHLD can signal more than one child stop. */ - if (target_is_async_p () - && (target_options & TARGET_WNOHANG) != 0 + if (target_is_async_p () && (target_options & TARGET_WNOHANG) != 0 && event_ptid != null_ptid) async_file_mark (); @@ -3741,9 +3687,9 @@ mark_lwp_dead (struct lwp_info *lwp, int wstat) static int lwp_is_marked_dead (struct lwp_info *lwp) { - return (lwp->status_pending_p - && (WIFEXITED (lwp->status_pending) - || WIFSIGNALED (lwp->status_pending))); + return ( + lwp->status_pending_p + && (WIFEXITED (lwp->status_pending) || WIFSIGNALED (lwp->status_pending))); } void @@ -3792,18 +3738,17 @@ linux_process_target::stuck_in_jump_pad (thread_info *thread) if (lwp->suspended != 0) { internal_error ("LWP %ld is suspended, suspended=%d\n", - lwpid_of (thread), lwp->suspended); + lwpid_of (thread), lwp->suspended); } gdb_assert (lwp->stopped); /* Allow debugging the jump pad, gdb_collect, etc.. */ - return (supports_fast_tracepoints () - && agent_loaded_p () - && (gdb_breakpoint_here (lwp->stop_pc) - || lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT - || thread->last_resume_kind == resume_step) - && (linux_fast_tracepoint_collecting (lwp, NULL) - != fast_tpoint_collect_result::not_collecting)); + return (supports_fast_tracepoints () && agent_loaded_p () + && (gdb_breakpoint_here (lwp->stop_pc) + || lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT + || thread->last_resume_kind == resume_step) + && (linux_fast_tracepoint_collecting (lwp, NULL) + != fast_tpoint_collect_result::not_collecting)); } void @@ -3815,7 +3760,7 @@ linux_process_target::move_out_of_jump_pad (thread_info *thread) if (lwp->suspended != 0) { internal_error ("LWP %ld is suspended, suspended=%d\n", - lwpid_of (thread), lwp->suspended); + lwpid_of (thread), lwp->suspended); } gdb_assert (lwp->stopped); @@ -3832,16 +3777,16 @@ linux_process_target::move_out_of_jump_pad (thread_info *thread) && maybe_move_out_of_jump_pad (lwp, wstat)) { threads_debug_printf ("LWP %ld needs stabilizing (in jump pad)", - lwpid_of (thread)); + lwpid_of (thread)); if (wstat) - { - lwp->status_pending_p = 0; - enqueue_one_deferred_signal (lwp, wstat); + { + lwp->status_pending_p = 0; + enqueue_one_deferred_signal (lwp, wstat); - threads_debug_printf ("Signal %d for LWP %ld deferred (in jump pad", - WSTOPSIG (*wstat), lwpid_of (thread)); - } + threads_debug_printf ("Signal %d for LWP %ld deferred (in jump pad", + WSTOPSIG (*wstat), lwpid_of (thread)); + } resume_one_lwp (lwp, 0, 0, NULL); } @@ -3868,26 +3813,22 @@ linux_process_target::stop_all_lwps (int suspend, lwp_info *except) THREADS_SCOPED_DEBUG_ENTER_EXIT; - threads_debug_printf - ("%s, except=%s", suspend ? "stop-and-suspend" : "stop", - (except != NULL - ? target_pid_to_str (ptid_of (get_lwp_thread (except))).c_str () - : "none")); + threads_debug_printf ( + "%s, except=%s", suspend ? "stop-and-suspend" : "stop", + (except != NULL + ? target_pid_to_str (ptid_of (get_lwp_thread (except))).c_str () + : "none")); - stopping_threads = (suspend - ? STOPPING_AND_SUSPENDING_THREADS - : STOPPING_THREADS); + stopping_threads + = (suspend ? STOPPING_AND_SUSPENDING_THREADS : STOPPING_THREADS); if (suspend) - for_each_thread ([&] (thread_info *thread) - { - suspend_and_send_sigstop (thread, except); - }); + for_each_thread ([&] (thread_info *thread) { + suspend_and_send_sigstop (thread, except); + }); else - for_each_thread ([&] (thread_info *thread) - { - send_sigstop (thread, except); - }); + for_each_thread ( + [&] (thread_info *thread) { send_sigstop (thread, except); }); wait_for_sigstop (); stopping_threads = NOT_STOPPING_THREADS; @@ -3924,7 +3865,7 @@ linux_process_target::install_software_single_step_breakpoints (lwp_info *lwp) } int -linux_process_target::single_step (lwp_info* lwp) +linux_process_target::single_step (lwp_info *lwp) { int step = 0; @@ -3953,12 +3894,12 @@ static int lwp_signal_can_be_delivered (struct lwp_info *lwp) { return (lwp->collecting_fast_tracepoint - == fast_tpoint_collect_result::not_collecting); + == fast_tpoint_collect_result::not_collecting); } void linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, - int signal, siginfo_t *info) + int signal, siginfo_t *info) { struct thread_info *thread = get_lwp_thread (lwp); int ptrace_request; @@ -3979,9 +3920,9 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, fast_tpoint_collect_result fast_tp_collecting = lwp->collecting_fast_tracepoint; - gdb_assert (!stabilizing_threads - || (fast_tp_collecting - != fast_tpoint_collect_result::not_collecting)); + gdb_assert ( + !stabilizing_threads + || (fast_tp_collecting != fast_tpoint_collect_result::not_collecting)); /* Cancel actions that rely on GDB not changing the PC (e.g., the user used the "jump" command, or "set $pc = foo"). */ @@ -3996,9 +3937,8 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, signal. Also enqueue the signal if it can't be delivered to the inferior right now. */ if (signal != 0 - && (lwp->status_pending_p - || !lwp->pending_signals.empty () - || !lwp_signal_can_be_delivered (lwp))) + && (lwp->status_pending_p || !lwp->pending_signals.empty () + || !lwp_signal_can_be_delivered (lwp))) { enqueue_pending_signal (lwp, signal, info); @@ -4008,10 +3948,10 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, if (lwp->status_pending_p) { - threads_debug_printf - ("Not resuming lwp %ld (%s, stop %s); has pending status", - lwpid_of (thread), step ? "step" : "continue", - lwp->stop_expected ? "expected" : "not expected"); + threads_debug_printf ( + "Not resuming lwp %ld (%s, stop %s); has pending status", + lwpid_of (thread), step ? "step" : "continue", + lwp->stop_expected ? "expected" : "not expected"); return; } @@ -4031,41 +3971,42 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, if (lwp->bp_reinsert != 0) { threads_debug_printf (" pending reinsert at 0x%s", - paddress (lwp->bp_reinsert)); + paddress (lwp->bp_reinsert)); if (supports_hardware_single_step ()) - { - if (fast_tp_collecting == fast_tpoint_collect_result::not_collecting) - { - if (step == 0) - warning ("BAD - reinserting but not stepping."); - if (lwp->suspended) - warning ("BAD - reinserting and suspended(%d).", - lwp->suspended); - } - } + { + if (fast_tp_collecting == fast_tpoint_collect_result::not_collecting) + { + if (step == 0) + warning ("BAD - reinserting but not stepping."); + if (lwp->suspended) + warning ("BAD - reinserting and suspended(%d).", + lwp->suspended); + } + } step = maybe_hw_step (thread); } if (fast_tp_collecting == fast_tpoint_collect_result::before_insn) - threads_debug_printf - ("lwp %ld wants to get out of fast tracepoint jump pad " - "(exit-jump-pad-bkpt)", lwpid_of (thread)); + threads_debug_printf ( + "lwp %ld wants to get out of fast tracepoint jump pad " + "(exit-jump-pad-bkpt)", + lwpid_of (thread)); else if (fast_tp_collecting == fast_tpoint_collect_result::at_insn) { - threads_debug_printf - ("lwp %ld wants to get out of fast tracepoint jump pad single-stepping", - lwpid_of (thread)); + threads_debug_printf ( + "lwp %ld wants to get out of fast tracepoint jump pad single-stepping", + lwpid_of (thread)); if (supports_hardware_single_step ()) - step = 1; + step = 1; else - { - internal_error ("moving out of jump pad single-stepping" - " not implemented on this target"); - } + { + internal_error ("moving out of jump pad single-stepping" + " not implemented on this target"); + } } /* If we have while-stepping actions in this thread set it stepping. @@ -4078,9 +4019,9 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, enhancement. */ if (thread->while_stepping != NULL) { - threads_debug_printf - ("lwp %ld has a while-stepping action -> forcing step.", - lwpid_of (thread)); + threads_debug_printf ( + "lwp %ld has a while-stepping action -> forcing step.", + lwpid_of (thread)); step = single_step (lwp); } @@ -4092,7 +4033,7 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, lwp->stop_pc = low_get_pc (regcache); threads_debug_printf (" %s from pc 0x%lx", step ? "step" : "continue", - (long) lwp->stop_pc); + (long) lwp->stop_pc); } /* If we have pending signals, consume one if it can be delivered to @@ -4103,15 +4044,15 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, signal = p_sig.signal; if (p_sig.info.si_signo != 0) - ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, - &p_sig.info); + ptrace (PTRACE_SETSIGINFO, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, + &p_sig.info); lwp->pending_signals.pop_front (); } threads_debug_printf ("Resuming lwp %ld (%s, signal %d, stop %s)", - lwpid_of (thread), step ? "step" : "continue", signal, - lwp->stop_expected ? "expected" : "not expected"); + lwpid_of (thread), step ? "step" : "continue", signal, + lwp->stop_expected ? "expected" : "not expected"); low_prepare_to_resume (lwp); @@ -4124,19 +4065,17 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, ptrace_request = PTRACE_SYSCALL; else ptrace_request = PTRACE_CONT; - ptrace (ptrace_request, - lwpid_of (thread), - (PTRACE_TYPE_ARG3) 0, - /* Coerce to a uintptr_t first to avoid potential gcc warning + ptrace (ptrace_request, lwpid_of (thread), (PTRACE_TYPE_ARG3) 0, + /* Coerce to a uintptr_t first to avoid potential gcc warning of coercing an 8 byte integer to a 4 byte pointer. */ - (PTRACE_TYPE_ARG4) (uintptr_t) signal); + (PTRACE_TYPE_ARG4) (uintptr_t) signal); if (errno) { int saved_errno = errno; - threads_debug_printf ("ptrace errno = %d (%s)", - saved_errno, strerror (saved_errno)); + threads_debug_printf ("ptrace errno = %d (%s)", saved_errno, + strerror (saved_errno)); errno = saved_errno; perror_with_name ("resuming thread"); @@ -4193,7 +4132,7 @@ check_ptrace_stopped_lwp_gone (struct lwp_info *lp) void linux_process_target::resume_one_lwp (lwp_info *lwp, int step, int signal, - siginfo_t *info) + siginfo_t *info) { try { @@ -4202,15 +4141,15 @@ linux_process_target::resume_one_lwp (lwp_info *lwp, int step, int signal, catch (const gdb_exception_error &ex) { if (check_ptrace_stopped_lwp_gone (lwp)) - { - /* This could because we tried to resume an LWP after its leader + { + /* This could because we tried to resume an LWP after its leader exited. Mark it as resumed, so we can collect an exit event from it. */ - lwp->stopped = 0; - lwp->stop_reason = TARGET_STOPPED_BY_NO_REASON; - } + lwp->stopped = 0; + lwp->stop_reason = TARGET_STOPPED_BY_NO_REASON; + } else - throw; + throw; } } @@ -4231,91 +4170,89 @@ linux_set_resume_request (thread_info *thread, thread_resume *resume, size_t n) { ptid_t ptid = resume[ndx].thread; if (ptid == minus_one_ptid - || ptid == thread->id - /* Handle both 'pPID' and 'pPID.-1' as meaning 'all threads + || ptid == thread->id + /* Handle both 'pPID' and 'pPID.-1' as meaning 'all threads of PID'. */ - || (ptid.pid () == pid_of (thread) - && (ptid.is_pid () - || ptid.lwp () == -1))) - { - if (resume[ndx].kind == resume_stop - && thread->last_resume_kind == resume_stop) - { - threads_debug_printf - ("already %s LWP %ld at GDB's request", - (thread->last_status.kind () == TARGET_WAITKIND_STOPPED - ? "stopped" : "stopping"), - lwpid_of (thread)); - - continue; - } - - /* Ignore (wildcard) resume requests for already-resumed + || (ptid.pid () == pid_of (thread) + && (ptid.is_pid () || ptid.lwp () == -1))) + { + if (resume[ndx].kind == resume_stop + && thread->last_resume_kind == resume_stop) + { + threads_debug_printf ("already %s LWP %ld at GDB's request", + (thread->last_status.kind () + == TARGET_WAITKIND_STOPPED + ? "stopped" + : "stopping"), + lwpid_of (thread)); + + continue; + } + + /* Ignore (wildcard) resume requests for already-resumed threads. */ - if (resume[ndx].kind != resume_stop - && thread->last_resume_kind != resume_stop) - { - threads_debug_printf - ("already %s LWP %ld at GDB's request", - (thread->last_resume_kind == resume_step - ? "stepping" : "continuing"), - lwpid_of (thread)); - continue; - } - - /* Don't let wildcard resumes resume fork children that GDB + if (resume[ndx].kind != resume_stop + && thread->last_resume_kind != resume_stop) + { + threads_debug_printf ("already %s LWP %ld at GDB's request", + (thread->last_resume_kind == resume_step + ? "stepping" + : "continuing"), + lwpid_of (thread)); + continue; + } + + /* Don't let wildcard resumes resume fork children that GDB does not yet know are new fork children. */ - if (lwp->fork_relative != NULL) - { - struct lwp_info *rel = lwp->fork_relative; - - if (rel->status_pending_p - && (rel->waitstatus.kind () == TARGET_WAITKIND_FORKED - || rel->waitstatus.kind () == TARGET_WAITKIND_VFORKED)) - { - threads_debug_printf - ("not resuming LWP %ld: has queued stop reply", - lwpid_of (thread)); - continue; - } - } - - /* If the thread has a pending event that has already been + if (lwp->fork_relative != NULL) + { + struct lwp_info *rel = lwp->fork_relative; + + if (rel->status_pending_p + && (rel->waitstatus.kind () == TARGET_WAITKIND_FORKED + || rel->waitstatus.kind () == TARGET_WAITKIND_VFORKED)) + { + threads_debug_printf ( + "not resuming LWP %ld: has queued stop reply", + lwpid_of (thread)); + continue; + } + } + + /* If the thread has a pending event that has already been reported to GDBserver core, but GDB has not pulled the event out of the vStopped queue yet, likewise, ignore the (wildcard) resume request. */ - if (in_queued_stop_replies (thread->id)) - { - threads_debug_printf - ("not resuming LWP %ld: has queued stop reply", - lwpid_of (thread)); - continue; - } + if (in_queued_stop_replies (thread->id)) + { + threads_debug_printf ( + "not resuming LWP %ld: has queued stop reply", + lwpid_of (thread)); + continue; + } - lwp->resume = &resume[ndx]; - thread->last_resume_kind = lwp->resume->kind; + lwp->resume = &resume[ndx]; + thread->last_resume_kind = lwp->resume->kind; - lwp->step_range_start = lwp->resume->step_range_start; - lwp->step_range_end = lwp->resume->step_range_end; + lwp->step_range_start = lwp->resume->step_range_start; + lwp->step_range_end = lwp->resume->step_range_end; - /* If we had a deferred signal to report, dequeue one now. + /* If we had a deferred signal to report, dequeue one now. This can happen if LWP gets more than one signal while trying to get out of a jump pad. */ - if (lwp->stopped - && !lwp->status_pending_p - && dequeue_one_deferred_signal (lwp, &lwp->status_pending)) - { - lwp->status_pending_p = 1; + if (lwp->stopped && !lwp->status_pending_p + && dequeue_one_deferred_signal (lwp, &lwp->status_pending)) + { + lwp->status_pending_p = 1; - threads_debug_printf - ("Dequeueing deferred signal %d for LWP %ld, " - "leaving status pending.", - WSTOPSIG (lwp->status_pending), - lwpid_of (thread)); - } + threads_debug_printf ( + "Dequeueing deferred signal %d for LWP %ld, " + "leaving status pending.", + WSTOPSIG (lwp->status_pending), lwpid_of (thread)); + } - return; - } + return; + } } /* No resume action for this thread. */ @@ -4353,15 +4290,15 @@ linux_process_target::thread_needs_step_over (thread_info *thread) if (!lwp->stopped) { threads_debug_printf ("Need step over [LWP %ld]? Ignoring, not stopped", - lwpid_of (thread)); + lwpid_of (thread)); return false; } if (thread->last_resume_kind == resume_stop) { - threads_debug_printf - ("Need step over [LWP %ld]? Ignoring, should remain stopped", - lwpid_of (thread)); + threads_debug_printf ( + "Need step over [LWP %ld]? Ignoring, should remain stopped", + lwpid_of (thread)); return false; } @@ -4370,15 +4307,15 @@ linux_process_target::thread_needs_step_over (thread_info *thread) if (lwp->suspended) { threads_debug_printf ("Need step over [LWP %ld]? Ignoring, suspended", - lwpid_of (thread)); + lwpid_of (thread)); return false; } if (lwp->status_pending_p) { - threads_debug_printf - ("Need step over [LWP %ld]? Ignoring, has pending status.", - lwpid_of (thread)); + threads_debug_printf ( + "Need step over [LWP %ld]? Ignoring, has pending status.", + lwpid_of (thread)); return false; } @@ -4393,22 +4330,21 @@ linux_process_target::thread_needs_step_over (thread_info *thread) command, or poked thread's registers herself. */ if (pc != lwp->stop_pc) { - threads_debug_printf - ("Need step over [LWP %ld]? Cancelling, PC was changed. " - "Old stop_pc was 0x%s, PC is now 0x%s", lwpid_of (thread), - paddress (lwp->stop_pc), paddress (pc)); + threads_debug_printf ( + "Need step over [LWP %ld]? Cancelling, PC was changed. " + "Old stop_pc was 0x%s, PC is now 0x%s", + lwpid_of (thread), paddress (lwp->stop_pc), paddress (pc)); return false; } /* On software single step target, resume the inferior with signal rather than stepping over. */ - if (supports_software_single_step () - && !lwp->pending_signals.empty () + if (supports_software_single_step () && !lwp->pending_signals.empty () && lwp_signal_can_be_delivered (lwp)) { - threads_debug_printf - ("Need step over [LWP %ld]? Ignoring, has pending signals.", - lwpid_of (thread)); + threads_debug_printf ( + "Need step over [LWP %ld]? Ignoring, has pending signals.", + lwpid_of (thread)); return false; } @@ -4422,31 +4358,30 @@ linux_process_target::thread_needs_step_over (thread_info *thread) /* Don't step over a breakpoint that GDB expects to hit though. If the condition is being evaluated on the target's side and it evaluate to false, step over this breakpoint as well. */ - if (gdb_breakpoint_here (pc) - && gdb_condition_true_at_breakpoint (pc) - && gdb_no_commands_at_breakpoint (pc)) - { - threads_debug_printf ("Need step over [LWP %ld]? yes, but found" - " GDB breakpoint at 0x%s; skipping step over", - lwpid_of (thread), paddress (pc)); - - return false; - } + if (gdb_breakpoint_here (pc) && gdb_condition_true_at_breakpoint (pc) + && gdb_no_commands_at_breakpoint (pc)) + { + threads_debug_printf ("Need step over [LWP %ld]? yes, but found" + " GDB breakpoint at 0x%s; skipping step over", + lwpid_of (thread), paddress (pc)); + + return false; + } else - { - threads_debug_printf ("Need step over [LWP %ld]? yes, " - "found breakpoint at 0x%s", - lwpid_of (thread), paddress (pc)); + { + threads_debug_printf ("Need step over [LWP %ld]? yes, " + "found breakpoint at 0x%s", + lwpid_of (thread), paddress (pc)); - /* We've found an lwp that needs stepping over --- return 1 so + /* We've found an lwp that needs stepping over --- return 1 so that find_thread stops looking. */ - return true; - } + return true; + } } - threads_debug_printf - ("Need step over [LWP %ld]? No, no breakpoint found at 0x%s", - lwpid_of (thread), paddress (pc)); + threads_debug_printf ( + "Need step over [LWP %ld]? No, no breakpoint found at 0x%s", + lwpid_of (thread), paddress (pc)); return false; } @@ -4458,14 +4393,14 @@ linux_process_target::start_step_over (lwp_info *lwp) CORE_ADDR pc; threads_debug_printf ("Starting step-over on LWP %ld. Stopping all threads", - lwpid_of (thread)); + lwpid_of (thread)); stop_all_lwps (1, lwp); if (lwp->suspended != 0) { internal_error ("LWP %ld suspended=%d\n", lwpid_of (thread), - lwp->suspended); + lwp->suspended); } threads_debug_printf ("Done stopping all threads for step-over."); @@ -4518,10 +4453,10 @@ linux_process_target::finish_step_over (lwp_info *lwp) stepping over a breakpoint, and we hold all threads but LWP stopped while doing that. */ if (!supports_hardware_single_step ()) - { - gdb_assert (has_single_step_breakpoints (current_thread)); - delete_single_step_breakpoints (current_thread); - } + { + gdb_assert (has_single_step_breakpoints (current_thread)); + delete_single_step_breakpoints (current_thread); + } step_over_bkpt = null_ptid; return true; @@ -4544,36 +4479,36 @@ linux_process_target::complete_ongoing_step_over () /* Passing NULL_PTID as filter indicates we want all events to be left pending. Eventually this returns when there are no unwaited-for children left. */ - ret = wait_for_event_filtered (minus_one_ptid, null_ptid, &wstat, - __WALL); + ret + = wait_for_event_filtered (minus_one_ptid, null_ptid, &wstat, __WALL); gdb_assert (ret == -1); lwp = find_lwp_pid (step_over_bkpt); if (lwp != NULL) - { - finish_step_over (lwp); + { + finish_step_over (lwp); - /* If we got our step SIGTRAP, don't leave it pending, + /* If we got our step SIGTRAP, don't leave it pending, otherwise we would report it to GDB as a spurious SIGTRAP. */ - gdb_assert (lwp->status_pending_p); - if (WIFSTOPPED (lwp->status_pending) - && WSTOPSIG (lwp->status_pending) == SIGTRAP) - { - thread_info *thread = get_lwp_thread (lwp); - if (thread->last_resume_kind != resume_step) - { - threads_debug_printf ("detach: discard step-over SIGTRAP"); - - lwp->status_pending_p = 0; - lwp->status_pending = 0; - resume_one_lwp (lwp, lwp->stepping, 0, NULL); - } - else - threads_debug_printf - ("detach: resume_step, not discarding step-over SIGTRAP"); - } - } + gdb_assert (lwp->status_pending_p); + if (WIFSTOPPED (lwp->status_pending) + && WSTOPSIG (lwp->status_pending) == SIGTRAP) + { + thread_info *thread = get_lwp_thread (lwp); + if (thread->last_resume_kind != resume_step) + { + threads_debug_printf ("detach: discard step-over SIGTRAP"); + + lwp->status_pending_p = 0; + lwp->status_pending = 0; + resume_one_lwp (lwp, lwp->stepping, 0, NULL); + } + else + threads_debug_printf ( + "detach: resume_step, not discarding step-over SIGTRAP"); + } + } step_over_bkpt = null_ptid; unsuspend_all_lwps (lwp); } @@ -4581,7 +4516,7 @@ linux_process_target::complete_ongoing_step_over () void linux_process_target::resume_one_thread (thread_info *thread, - bool leave_all_stopped) + bool leave_all_stopped) { struct lwp_info *lwp = get_thread_lwp (thread); int leave_pending; @@ -4592,26 +4527,26 @@ linux_process_target::resume_one_thread (thread_info *thread, if (lwp->resume->kind == resume_stop) { threads_debug_printf ("resume_stop request for LWP %ld", - lwpid_of (thread)); + lwpid_of (thread)); if (!lwp->stopped) - { - threads_debug_printf ("stopping LWP %ld", lwpid_of (thread)); + { + threads_debug_printf ("stopping LWP %ld", lwpid_of (thread)); - /* Stop the thread, and wait for the event asynchronously, + /* Stop the thread, and wait for the event asynchronously, through the event loop. */ - send_sigstop (lwp); - } + send_sigstop (lwp); + } else - { - threads_debug_printf ("already stopped LWP %ld", lwpid_of (thread)); + { + threads_debug_printf ("already stopped LWP %ld", lwpid_of (thread)); - /* The LWP may have been stopped in an internal event that + /* The LWP may have been stopped in an internal event that was not meant to be notified back to GDB (e.g., gdbserver breakpoint), so we should be reporting a stop event in this case too. */ - /* If the thread already has a pending SIGSTOP, this is a + /* If the thread already has a pending SIGSTOP, this is a no-op. Otherwise, something later will presumably resume the thread and this will cause it to cancel any pending operation, due to last_resume_kind == resume_stop. If @@ -4619,14 +4554,14 @@ linux_process_target::resume_one_thread (thread_info *thread, will still report it the next time we wait - see status_pending_p_callback. */ - /* If we already have a pending signal to report, then + /* If we already have a pending signal to report, then there's no need to queue a SIGSTOP, as this means we're midway through moving the LWP out of the jumppad, and we will report the pending signal as soon as that is finished. */ - if (lwp->pending_signals_to_report.empty ()) - send_sigstop (lwp); - } + if (lwp->pending_signals_to_report.empty ()) + send_sigstop (lwp); + } /* For stop requests, we're done. */ lwp->resume = NULL; @@ -4642,9 +4577,8 @@ linux_process_target::resume_one_thread (thread_info *thread, based on if *any* thread has a pending status. If there's a thread that needs the step-over-breakpoint dance, then don't resume any other thread but that particular one. */ - leave_pending = (lwp->suspended - || lwp->status_pending_p - || leave_all_stopped); + leave_pending + = (lwp->suspended || lwp->status_pending_p || leave_all_stopped); /* If we have a new signal, enqueue the signal. */ if (lwp->resume->sig != 0) @@ -4654,12 +4588,13 @@ linux_process_target::resume_one_thread (thread_info *thread, /* If this is the same signal we were previously stopped by, make sure to queue its siginfo. */ if (WIFSTOPPED (lwp->last_status) - && WSTOPSIG (lwp->last_status) == lwp->resume->sig - && ptrace (PTRACE_GETSIGINFO, lwpid_of (thread), - (PTRACE_TYPE_ARG3) 0, &info) == 0) - info_p = &info; + && WSTOPSIG (lwp->last_status) == lwp->resume->sig + && ptrace (PTRACE_GETSIGINFO, lwpid_of (thread), + (PTRACE_TYPE_ARG3) 0, &info) + == 0) + info_p = &info; else - info_p = NULL; + info_p = NULL; enqueue_pending_signal (lwp, lwp->resume->sig, info_p); } @@ -4682,12 +4617,11 @@ linux_process_target::resume (thread_resume *resume_info, size_t n) { struct thread_info *need_step_over = NULL; - THREADS_SCOPED_DEBUG_ENTER_EXIT; + THREADS_SCOPED_DEBUG_ENTER_EXIT; - for_each_thread ([&] (thread_info *thread) - { - linux_set_resume_request (thread, resume_info, n); - }); + for_each_thread ([&] (thread_info *thread) { + linux_set_resume_request (thread, resume_info, n); + }); /* If there is a thread which would otherwise be resumed, which has a pending status, then don't resume any threads - we can just @@ -4697,10 +4631,10 @@ linux_process_target::resume (thread_resume *resume_info, size_t n) before considering to start a step-over (in all-stop). */ bool any_pending = false; if (!non_stop) - any_pending = find_thread ([this] (thread_info *thread) - { - return resume_status_pending (thread); - }) != nullptr; + any_pending = find_thread ([this] (thread_info *thread) { + return resume_status_pending (thread); + }) + != nullptr; /* If there is a thread which would otherwise be resumed, which is stopped at a breakpoint that needs stepping over, then don't @@ -4709,10 +4643,9 @@ linux_process_target::resume (thread_resume *resume_info, size_t n) to queue any signals that would otherwise be delivered or queued. */ if (!any_pending && low_supports_breakpoints ()) - need_step_over = find_thread ([this] (thread_info *thread) - { - return thread_needs_step_over (thread); - }); + need_step_over = find_thread ([this] (thread_info *thread) { + return thread_needs_step_over (thread); + }); bool leave_all_stopped = (need_step_over != NULL || any_pending); @@ -4720,16 +4653,15 @@ linux_process_target::resume (thread_resume *resume_info, size_t n) threads_debug_printf ("Not resuming all, need step over"); else if (any_pending) threads_debug_printf ("Not resuming, all-stop and found " - "an LWP with pending status"); + "an LWP with pending status"); else threads_debug_printf ("Resuming, no pending status or step over needed"); /* Even if we're leaving threads stopped, queue all signals we'd otherwise deliver. */ - for_each_thread ([&] (thread_info *thread) - { - resume_one_thread (thread, leave_all_stopped); - }); + for_each_thread ([&] (thread_info *thread) { + resume_one_thread (thread, leave_all_stopped); + }); if (need_step_over) start_step_over (get_thread_lwp (need_step_over)); @@ -4761,14 +4693,14 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except) && thread->last_status.kind () != TARGET_WAITKIND_IGNORE) { threads_debug_printf (" client wants LWP to remain %ld stopped", - lwpid_of (thread)); + lwpid_of (thread)); return; } if (lwp->status_pending_p) { threads_debug_printf (" LWP %ld has pending status, leaving stopped", - lwpid_of (thread)); + lwpid_of (thread)); return; } @@ -4783,7 +4715,7 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except) if (thread->last_resume_kind == resume_stop && lwp->pending_signals_to_report.empty () && (lwp->collecting_fast_tracepoint - == fast_tpoint_collect_result::not_collecting)) + == fast_tpoint_collect_result::not_collecting)) { /* We haven't reported this LWP as stopped yet (otherwise, the last_status.kind check above would catch it, and we wouldn't @@ -4795,9 +4727,9 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except) another one here. Note that if the LWP already has a SIGSTOP pending, this is a no-op. */ - threads_debug_printf - ("Client wants LWP %ld to stop. Making sure it has a SIGSTOP pending", - lwpid_of (thread)); + threads_debug_printf ( + "Client wants LWP %ld to stop. Making sure it has a SIGSTOP pending", + lwpid_of (thread)); send_sigstop (lwp); } @@ -4805,21 +4737,21 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except) if (thread->last_resume_kind == resume_step) { threads_debug_printf (" stepping LWP %ld, client wants it stepping", - lwpid_of (thread)); + lwpid_of (thread)); /* If resume_step is requested by GDB, install single-step breakpoints when the thread is about to be actually resumed if the single-step breakpoints weren't removed. */ if (supports_software_single_step () - && !has_single_step_breakpoints (thread)) - install_software_single_step_breakpoints (lwp); + && !has_single_step_breakpoints (thread)) + install_software_single_step_breakpoints (lwp); step = maybe_hw_step (thread); } else if (lwp->bp_reinsert != 0) { threads_debug_printf (" stepping LWP %ld, reinsert set", - lwpid_of (thread)); + lwpid_of (thread)); step = maybe_hw_step (thread); } @@ -4831,7 +4763,7 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except) void linux_process_target::unsuspend_and_proceed_one_lwp (thread_info *thread, - lwp_info *except) + lwp_info *except) { struct lwp_info *lwp = get_thread_lwp (thread); @@ -4855,27 +4787,24 @@ linux_process_target::proceed_all_lwps () if (low_supports_breakpoints ()) { - need_step_over = find_thread ([this] (thread_info *thread) - { - return thread_needs_step_over (thread); - }); + need_step_over = find_thread ([this] (thread_info *thread) { + return thread_needs_step_over (thread); + }); if (need_step_over != NULL) - { - threads_debug_printf ("found thread %ld needing a step-over", - lwpid_of (need_step_over)); + { + threads_debug_printf ("found thread %ld needing a step-over", + lwpid_of (need_step_over)); - start_step_over (get_thread_lwp (need_step_over)); - return; - } + start_step_over (get_thread_lwp (need_step_over)); + return; + } } threads_debug_printf ("Proceeding, no step-over needed"); - for_each_thread ([this] (thread_info *thread) - { - proceed_one_lwp (thread, NULL); - }); + for_each_thread ( + [this] (thread_info *thread) { proceed_one_lwp (thread, NULL); }); } void @@ -4885,23 +4814,19 @@ linux_process_target::unstop_all_lwps (int unsuspend, lwp_info *except) if (except) threads_debug_printf ("except=(LWP %ld)", - lwpid_of (get_lwp_thread (except))); + lwpid_of (get_lwp_thread (except))); else threads_debug_printf ("except=nullptr"); if (unsuspend) - for_each_thread ([&] (thread_info *thread) - { - unsuspend_and_proceed_one_lwp (thread, except); - }); + for_each_thread ([&] (thread_info *thread) { + unsuspend_and_proceed_one_lwp (thread, except); + }); else - for_each_thread ([&] (thread_info *thread) - { - proceed_one_lwp (thread, except); - }); + for_each_thread ( + [&] (thread_info *thread) { proceed_one_lwp (thread, except); }); } - #ifdef HAVE_LINUX_REGSETS #define use_linux_regsets 1 @@ -4912,7 +4837,7 @@ static int regset_disabled (struct regsets_info *info, struct regset_info *regset) { return (info->disabled_regsets != NULL - && info->disabled_regsets[regset - info->regsets]); + && info->disabled_regsets[regset - info->regsets]); } /* Disable REGSET. */ @@ -4930,7 +4855,7 @@ disable_regset (struct regsets_info *info, struct regset_info *regset) static int regsets_fetch_inferior_registers (struct regsets_info *regsets_info, - struct regcache *regcache) + struct regcache *regcache) { struct regset_info *regset; int saw_general_regs = 0; @@ -4944,61 +4869,61 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info, int nt_type, res; if (regset->size == 0 || regset_disabled (regsets_info, regset)) - continue; + continue; buf = xmalloc (regset->size); nt_type = regset->nt_type; if (nt_type) - { - iov.iov_base = buf; - iov.iov_len = regset->size; - data = (void *) &iov; - } + { + iov.iov_base = buf; + iov.iov_len = regset->size; + data = (void *) &iov; + } else - data = buf; + data = buf; #ifndef __sparc__ res = ptrace (regset->get_request, pid, - (PTRACE_TYPE_ARG3) (long) nt_type, data); + (PTRACE_TYPE_ARG3) (long) nt_type, data); #else res = ptrace (regset->get_request, pid, data, nt_type); #endif if (res < 0) - { - if (errno == EIO - || (errno == EINVAL && regset->type == OPTIONAL_REGS)) - { - /* If we get EIO on a regset, or an EINVAL and the regset is + { + if (errno == EIO + || (errno == EINVAL && regset->type == OPTIONAL_REGS)) + { + /* If we get EIO on a regset, or an EINVAL and the regset is optional, do not try it again for this process mode. */ - disable_regset (regsets_info, regset); - } - else if (errno == ENODATA) - { - /* ENODATA may be returned if the regset is currently + disable_regset (regsets_info, regset); + } + else if (errno == ENODATA) + { + /* ENODATA may be returned if the regset is currently not "active". This can happen in normal operation, so suppress the warning in this case. */ - } - else if (errno == ESRCH) - { - /* At this point, ESRCH should mean the process is + } + else if (errno == ESRCH) + { + /* At this point, ESRCH should mean the process is already gone, in which case we simply ignore attempts to read its registers. */ - } - else - { - char s[256]; - sprintf (s, "ptrace(regsets_fetch_inferior_registers) PID=%d", - pid); - perror (s); - } - } + } + else + { + char s[256]; + sprintf (s, "ptrace(regsets_fetch_inferior_registers) PID=%d", + pid); + perror (s); + } + } else - { - if (regset->type == GENERAL_REGS) - saw_general_regs = 1; - regset->store_function (regcache, buf); - } + { + if (regset->type == GENERAL_REGS) + saw_general_regs = 1; + regset->store_function (regcache, buf); + } free (buf); } if (saw_general_regs) @@ -5009,7 +4934,7 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info, static int regsets_store_inferior_registers (struct regsets_info *regsets_info, - struct regcache *regcache) + struct regcache *regcache) { struct regset_info *regset; int saw_general_regs = 0; @@ -5023,8 +4948,8 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info, int nt_type, res; if (regset->size == 0 || regset_disabled (regsets_info, regset) - || regset->fill_function == NULL) - continue; + || regset->fill_function == NULL) + continue; buf = xmalloc (regset->size); @@ -5034,60 +4959,60 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info, nt_type = regset->nt_type; if (nt_type) - { - iov.iov_base = buf; - iov.iov_len = regset->size; - data = (void *) &iov; - } + { + iov.iov_base = buf; + iov.iov_len = regset->size; + data = (void *) &iov; + } else - data = buf; + data = buf; #ifndef __sparc__ res = ptrace (regset->get_request, pid, - (PTRACE_TYPE_ARG3) (long) nt_type, data); + (PTRACE_TYPE_ARG3) (long) nt_type, data); #else res = ptrace (regset->get_request, pid, data, nt_type); #endif if (res == 0) - { - /* Then overlay our cached registers on that. */ - regset->fill_function (regcache, buf); + { + /* Then overlay our cached registers on that. */ + regset->fill_function (regcache, buf); - /* Only now do we write the register set. */ + /* Only now do we write the register set. */ #ifndef __sparc__ - res = ptrace (regset->set_request, pid, - (PTRACE_TYPE_ARG3) (long) nt_type, data); + res = ptrace (regset->set_request, pid, + (PTRACE_TYPE_ARG3) (long) nt_type, data); #else - res = ptrace (regset->set_request, pid, data, nt_type); + res = ptrace (regset->set_request, pid, data, nt_type); #endif - } + } if (res < 0) - { - if (errno == EIO - || (errno == EINVAL && regset->type == OPTIONAL_REGS)) - { - /* If we get EIO on a regset, or an EINVAL and the regset is + { + if (errno == EIO + || (errno == EINVAL && regset->type == OPTIONAL_REGS)) + { + /* If we get EIO on a regset, or an EINVAL and the regset is optional, do not try it again for this process mode. */ - disable_regset (regsets_info, regset); - } - else if (errno == ESRCH) - { - /* At this point, ESRCH should mean the process is + disable_regset (regsets_info, regset); + } + else if (errno == ESRCH) + { + /* At this point, ESRCH should mean the process is already gone, in which case we simply ignore attempts to change its registers. See also the related comment in resume_one_lwp. */ - free (buf); - return 0; - } - else - { - perror ("Warning: ptrace(regsets_store_inferior_registers)"); - } - } + free (buf); + return 0; + } + else + { + perror ("Warning: ptrace(regsets_store_inferior_registers)"); + } + } else if (regset->type == GENERAL_REGS) - saw_general_regs = 1; + saw_general_regs = 1; free (buf); } if (saw_general_regs) @@ -5114,8 +5039,8 @@ linux_register_in_regsets (const struct regs_info *regs_info, int regno) size_t index = regno / 8; return (use_linux_regsets - && (regs_info->regset_bitmap == NULL - || (regs_info->regset_bitmap[index] & mask) != 0)); + && (regs_info->regset_bitmap == NULL + || (regs_info->regset_bitmap[index] & mask) != 0)); } #ifdef HAVE_LINUX_USRREGS @@ -5133,10 +5058,9 @@ register_addr (const struct usrregs_info *usrregs, int regnum) return addr; } - void linux_process_target::fetch_register (const usrregs_info *usrregs, - regcache *regcache, int regno) + regcache *regcache, int regno) { CORE_ADDR regaddr; int i, size; @@ -5152,27 +5076,28 @@ linux_process_target::fetch_register (const usrregs_info *usrregs, if (regaddr == -1) return; - size = ((register_size (regcache->tdesc, regno) - + sizeof (PTRACE_XFER_TYPE) - 1) - & -sizeof (PTRACE_XFER_TYPE)); + size + = ((register_size (regcache->tdesc, regno) + sizeof (PTRACE_XFER_TYPE) - 1) + & -sizeof (PTRACE_XFER_TYPE)); buf = (char *) alloca (size); pid = lwpid_of (current_thread); for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE)) { errno = 0; - *(PTRACE_XFER_TYPE *) (buf + i) = - ptrace (PTRACE_PEEKUSER, pid, - /* Coerce to a uintptr_t first to avoid potential gcc warning + *(PTRACE_XFER_TYPE *) (buf + i) + = ptrace (PTRACE_PEEKUSER, pid, + /* Coerce to a uintptr_t first to avoid potential gcc warning of coercing an 8 byte integer to a 4 byte pointer. */ - (PTRACE_TYPE_ARG3) (uintptr_t) regaddr, (PTRACE_TYPE_ARG4) 0); + (PTRACE_TYPE_ARG3) (uintptr_t) regaddr, + (PTRACE_TYPE_ARG4) 0); regaddr += sizeof (PTRACE_XFER_TYPE); if (errno != 0) - { - /* Mark register REGNO unavailable. */ - supply_register (regcache, regno, NULL); - return; - } + { + /* Mark register REGNO unavailable. */ + supply_register (regcache, regno, NULL); + return; + } } low_supply_ptrace_register (regcache, regno, buf); @@ -5180,7 +5105,7 @@ linux_process_target::fetch_register (const usrregs_info *usrregs, void linux_process_target::store_register (const usrregs_info *usrregs, - regcache *regcache, int regno) + regcache *regcache, int regno) { CORE_ADDR regaddr; int i, size; @@ -5196,9 +5121,9 @@ linux_process_target::store_register (const usrregs_info *usrregs, if (regaddr == -1) return; - size = ((register_size (regcache->tdesc, regno) - + sizeof (PTRACE_XFER_TYPE) - 1) - & -sizeof (PTRACE_XFER_TYPE)); + size + = ((register_size (regcache->tdesc, regno) + sizeof (PTRACE_XFER_TYPE) - 1) + & -sizeof (PTRACE_XFER_TYPE)); buf = (char *) alloca (size); memset (buf, 0, size); @@ -5209,23 +5134,22 @@ linux_process_target::store_register (const usrregs_info *usrregs, { errno = 0; ptrace (PTRACE_POKEUSER, pid, - /* Coerce to a uintptr_t first to avoid potential gcc warning + /* Coerce to a uintptr_t first to avoid potential gcc warning about coercing an 8 byte integer to a 4 byte pointer. */ - (PTRACE_TYPE_ARG3) (uintptr_t) regaddr, - (PTRACE_TYPE_ARG4) *(PTRACE_XFER_TYPE *) (buf + i)); + (PTRACE_TYPE_ARG3) (uintptr_t) regaddr, + (PTRACE_TYPE_ARG4) * (PTRACE_XFER_TYPE *) (buf + i)); if (errno != 0) - { - /* At this point, ESRCH should mean the process is + { + /* At this point, ESRCH should mean the process is already gone, in which case we simply ignore attempts to change its registers. See also the related comment in resume_one_lwp. */ - if (errno == ESRCH) - return; - + if (errno == ESRCH) + return; - if (!low_cannot_store_register (regno)) - error ("writing register %d: %s", regno, safe_strerror (errno)); - } + if (!low_cannot_store_register (regno)) + error ("writing register %d: %s", regno, safe_strerror (errno)); + } regaddr += sizeof (PTRACE_XFER_TYPE); } } @@ -5233,22 +5157,22 @@ linux_process_target::store_register (const usrregs_info *usrregs, void linux_process_target::low_collect_ptrace_register (regcache *regcache, - int regno, char *buf) + int regno, char *buf) { collect_register (regcache, regno, buf); } void linux_process_target::low_supply_ptrace_register (regcache *regcache, - int regno, const char *buf) + int regno, const char *buf) { supply_register (regcache, regno, buf); } void linux_process_target::usr_fetch_inferior_registers (const regs_info *regs_info, - regcache *regcache, - int regno, int all) + regcache *regcache, + int regno, int all) { #ifdef HAVE_LINUX_USRREGS struct usrregs_info *usr = regs_info->usrregs; @@ -5256,8 +5180,8 @@ linux_process_target::usr_fetch_inferior_registers (const regs_info *regs_info, if (regno == -1) { for (regno = 0; regno < usr->num_regs; regno++) - if (all || !linux_register_in_regsets (regs_info, regno)) - fetch_register (usr, regcache, regno); + if (all || !linux_register_in_regsets (regs_info, regno)) + fetch_register (usr, regcache, regno); } else fetch_register (usr, regcache, regno); @@ -5266,8 +5190,8 @@ linux_process_target::usr_fetch_inferior_registers (const regs_info *regs_info, void linux_process_target::usr_store_inferior_registers (const regs_info *regs_info, - regcache *regcache, - int regno, int all) + regcache *regcache, + int regno, int all) { #ifdef HAVE_LINUX_USRREGS struct usrregs_info *usr = regs_info->usrregs; @@ -5275,8 +5199,8 @@ linux_process_target::usr_store_inferior_registers (const regs_info *regs_info, if (regno == -1) { for (regno = 0; regno < usr->num_regs; regno++) - if (all || !linux_register_in_regsets (regs_info, regno)) - store_register (usr, regcache, regno); + if (all || !linux_register_in_regsets (regs_info, regno)) + store_register (usr, regcache, regno); } else store_register (usr, regcache, regno); @@ -5293,24 +5217,25 @@ linux_process_target::fetch_registers (regcache *regcache, int regno) if (regno == -1) { if (regs_info->usrregs != NULL) - for (regno = 0; regno < regs_info->usrregs->num_regs; regno++) - low_fetch_register (regcache, regno); + for (regno = 0; regno < regs_info->usrregs->num_regs; regno++) + low_fetch_register (regcache, regno); - all = regsets_fetch_inferior_registers (regs_info->regsets_info, regcache); + all + = regsets_fetch_inferior_registers (regs_info->regsets_info, regcache); if (regs_info->usrregs != NULL) - usr_fetch_inferior_registers (regs_info, regcache, -1, all); + usr_fetch_inferior_registers (regs_info, regcache, -1, all); } else { if (low_fetch_register (regcache, regno)) - return; + return; use_regsets = linux_register_in_regsets (regs_info, regno); if (use_regsets) - all = regsets_fetch_inferior_registers (regs_info->regsets_info, - regcache); + all = regsets_fetch_inferior_registers (regs_info->regsets_info, + regcache); if ((!use_regsets || all) && regs_info->usrregs != NULL) - usr_fetch_inferior_registers (regs_info, regcache, regno, 1); + usr_fetch_inferior_registers (regs_info, regcache, regno, 1); } } @@ -5323,19 +5248,19 @@ linux_process_target::store_registers (regcache *regcache, int regno) if (regno == -1) { - all = regsets_store_inferior_registers (regs_info->regsets_info, - regcache); + all + = regsets_store_inferior_registers (regs_info->regsets_info, regcache); if (regs_info->usrregs != NULL) - usr_store_inferior_registers (regs_info, regcache, regno, all); + usr_store_inferior_registers (regs_info, regcache, regno, all); } else { use_regsets = linux_register_in_regsets (regs_info, regno); if (use_regsets) - all = regsets_store_inferior_registers (regs_info->regsets_info, - regcache); + all = regsets_store_inferior_registers (regs_info->regsets_info, + regcache); if ((!use_regsets || all) && regs_info->usrregs != NULL) - usr_store_inferior_registers (regs_info, regcache, regno, 1); + usr_store_inferior_registers (regs_info, regcache, regno, 1); } } @@ -5353,7 +5278,6 @@ linux_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len) return the_target->read_memory (memaddr, myaddr, len); } - /* Helper for read_memory/write_memory using /proc/PID/mem. Because we can use a single read/write call, this can be much more efficient than banging away at PTRACE_PEEKTEXT. Also, unlike @@ -5363,7 +5287,7 @@ linux_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len) static int proc_xfer_memory (CORE_ADDR memaddr, unsigned char *readbuf, - const gdb_byte *writebuf, int len) + const gdb_byte *writebuf, int len) { gdb_assert ((readbuf == nullptr) != (writebuf == nullptr)); @@ -5382,31 +5306,30 @@ proc_xfer_memory (CORE_ADDR memaddr, unsigned char *readbuf, 32-bit platforms (for instance, SPARC debugging a SPARC64 application). */ #ifdef HAVE_PREAD64 - bytes = (readbuf != nullptr - ? pread64 (fd, readbuf, len, memaddr) - : pwrite64 (fd, writebuf, len, memaddr)); + bytes = (readbuf != nullptr ? pread64 (fd, readbuf, len, memaddr) + : pwrite64 (fd, writebuf, len, memaddr)); #else bytes = -1; if (lseek (fd, memaddr, SEEK_SET) != -1) - bytes = (readbuf != nullptr + bytes = (readbuf != nullptr ? read (fd, readbuf, len) ? write (fd, writebuf, len)); #endif if (bytes < 0) - return errno; + return errno; else if (bytes == 0) - { - /* EOF means the address space is gone, the whole process + { + /* EOF means the address space is gone, the whole process exited or execed. */ - return EIO; - } + return EIO; + } memaddr += bytes; if (readbuf != nullptr) - readbuf += bytes; + readbuf += bytes; else - writebuf += bytes; + writebuf += bytes; len -= bytes; } @@ -5414,8 +5337,8 @@ proc_xfer_memory (CORE_ADDR memaddr, unsigned char *readbuf, } int -linux_process_target::read_memory (CORE_ADDR memaddr, - unsigned char *myaddr, int len) +linux_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr, + int len) { return proc_xfer_memory (memaddr, myaddr, nullptr, len); } @@ -5426,7 +5349,7 @@ linux_process_target::read_memory (CORE_ADDR memaddr, int linux_process_target::write_memory (CORE_ADDR memaddr, - const unsigned char *myaddr, int len) + const unsigned char *myaddr, int len) { if (debug_threads) { @@ -5436,14 +5359,14 @@ linux_process_target::write_memory (CORE_ADDR memaddr, int dump = len < 4 ? len : 4; for (int i = 0; i < dump; i++) - { - sprintf (p, "%02x", myaddr[i]); - p += 2; - } + { + sprintf (p, "%02x", myaddr[i]); + p += 2; + } *p = '\0'; - threads_debug_printf ("Writing %s to 0x%08lx in process %d", - str, (long) memaddr, current_process ()->pid); + threads_debug_printf ("Writing %s to 0x%08lx in process %d", str, + (long) memaddr, current_process ()->pid); } return proc_xfer_memory (memaddr, nullptr, myaddr, len); @@ -5469,8 +5392,8 @@ linux_process_target::request_interrupt () typed a ^C on the controlling terminal. */ int res = ::kill (-signal_pid, SIGINT); if (res == -1) - warning (_("Sending SIGINT to process group of pid %ld failed: %s"), - signal_pid, safe_strerror (errno)); + warning (_ ("Sending SIGINT to process group of pid %ld failed: %s"), + signal_pid, safe_strerror (errno)); } bool @@ -5484,7 +5407,7 @@ linux_process_target::supports_read_auxv () int linux_process_target::read_auxv (int pid, CORE_ADDR offset, - unsigned char *myaddr, unsigned int len) + unsigned char *myaddr, unsigned int len) { char filename[PATH_MAX]; int fd, n; @@ -5508,7 +5431,7 @@ linux_process_target::read_auxv (int pid, CORE_ADDR offset, int linux_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) + int size, raw_breakpoint *bp) { if (type == raw_bkpt_type_sw) return insert_memory_breakpoint (bp); @@ -5518,7 +5441,7 @@ linux_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr, int linux_process_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) + int size, raw_breakpoint *bp) { /* Unsupported (see target.h). */ return 1; @@ -5526,7 +5449,7 @@ linux_process_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr, int linux_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) + int size, raw_breakpoint *bp) { if (type == raw_bkpt_type_sw) return remove_memory_breakpoint (bp); @@ -5536,7 +5459,7 @@ linux_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr, int linux_process_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) + int size, raw_breakpoint *bp) { /* Unsupported (see target.h). */ return 1; @@ -5634,11 +5557,11 @@ linux_process_target::read_offsets (CORE_ADDR *text_p, CORE_ADDR *data_p) errno = 0; text = ptrace (PTRACE_PEEKUSER, pid, (PTRACE_TYPE_ARG3) PT_TEXT_ADDR, - (PTRACE_TYPE_ARG4) 0); + (PTRACE_TYPE_ARG4) 0); text_end = ptrace (PTRACE_PEEKUSER, pid, (PTRACE_TYPE_ARG3) PT_TEXT_END_ADDR, - (PTRACE_TYPE_ARG4) 0); + (PTRACE_TYPE_ARG4) 0); data = ptrace (PTRACE_PEEKUSER, pid, (PTRACE_TYPE_ARG3) PT_DATA_ADDR, - (PTRACE_TYPE_ARG4) 0); + (PTRACE_TYPE_ARG4) 0); if (errno == 0) { @@ -5673,10 +5596,9 @@ linux_process_target::supports_get_tls_address () } int -linux_process_target::get_tls_address (thread_info *thread, - CORE_ADDR offset, - CORE_ADDR load_module, - CORE_ADDR *address) +linux_process_target::get_tls_address (thread_info *thread, CORE_ADDR offset, + CORE_ADDR load_module, + CORE_ADDR *address) { #ifdef USE_THREAD_DB return thread_db_get_tls_address (thread, offset, load_module, address); @@ -5692,17 +5614,16 @@ linux_process_target::supports_qxfer_osdata () } int -linux_process_target::qxfer_osdata (const char *annex, - unsigned char *readbuf, - unsigned const char *writebuf, - CORE_ADDR offset, int len) +linux_process_target::qxfer_osdata (const char *annex, unsigned char *readbuf, + unsigned const char *writebuf, + CORE_ADDR offset, int len) { return linux_common_xfer_osdata (annex, readbuf, offset, len); } void -linux_process_target::siginfo_fixup (siginfo_t *siginfo, - gdb_byte *inf_siginfo, int direction) +linux_process_target::siginfo_fixup (siginfo_t *siginfo, gdb_byte *inf_siginfo, + int direction) { bool done = low_siginfo_fixup (siginfo, inf_siginfo, direction); @@ -5711,15 +5632,15 @@ linux_process_target::siginfo_fixup (siginfo_t *siginfo, if (!done) { if (direction == 1) - memcpy (siginfo, inf_siginfo, sizeof (siginfo_t)); + memcpy (siginfo, inf_siginfo, sizeof (siginfo_t)); else - memcpy (inf_siginfo, siginfo, sizeof (siginfo_t)); + memcpy (inf_siginfo, siginfo, sizeof (siginfo_t)); } } bool linux_process_target::low_siginfo_fixup (siginfo_t *native, gdb_byte *inf, - int direction) + int direction) { return false; } @@ -5731,10 +5652,9 @@ linux_process_target::supports_qxfer_siginfo () } int -linux_process_target::qxfer_siginfo (const char *annex, - unsigned char *readbuf, - unsigned const char *writebuf, - CORE_ADDR offset, int len) +linux_process_target::qxfer_siginfo (const char *annex, unsigned char *readbuf, + unsigned const char *writebuf, + CORE_ADDR offset, int len) { int pid; siginfo_t siginfo; @@ -5746,8 +5666,7 @@ linux_process_target::qxfer_siginfo (const char *annex, pid = lwpid_of (current_thread); threads_debug_printf ("%s siginfo for lwp %d.", - readbuf != NULL ? "Reading" : "Writing", - pid); + readbuf != NULL ? "Reading" : "Writing", pid); if (offset >= sizeof (siginfo)) return -1; @@ -5774,7 +5693,7 @@ linux_process_target::qxfer_siginfo (const char *annex, siginfo_fixup (&siginfo, inf_siginfo, 1); if (ptrace (PTRACE_SETSIGINFO, pid, (PTRACE_TYPE_ARG3) 0, &siginfo) != 0) - return -1; + return -1; } return len; @@ -5792,12 +5711,14 @@ sigchld_handler (int signo) if (debug_threads) { do - { - /* Use the async signal safe debug function. */ - if (debug_write ("sigchld_handler\n", - sizeof ("sigchld_handler\n") - 1) < 0) - break; /* just ignore */ - } while (0); + { + /* Use the async signal safe debug function. */ + if (debug_write ("sigchld_handler\n", + sizeof ("sigchld_handler\n") - 1) + < 0) + break; /* just ignore */ + } + while (0); } if (target_is_async_p ()) @@ -5817,8 +5738,7 @@ linux_process_target::async (bool enable) { bool previous = target_is_async_p (); - threads_debug_printf ("async (%d), previous=%d", - enable, previous); + threads_debug_printf ("async (%d), previous=%d", enable, previous); if (previous != enable) { @@ -5829,29 +5749,28 @@ linux_process_target::async (bool enable) gdb_sigmask (SIG_BLOCK, &mask, NULL); if (enable) - { - if (!linux_event_pipe.open_pipe ()) - { - gdb_sigmask (SIG_UNBLOCK, &mask, NULL); - - warning ("creating event pipe failed."); - return previous; - } - - /* Register the event loop handler. */ - add_file_handler (linux_event_pipe.event_fd (), - handle_target_event, NULL, - "linux-low"); - - /* Always trigger a linux_wait. */ - async_file_mark (); - } + { + if (!linux_event_pipe.open_pipe ()) + { + gdb_sigmask (SIG_UNBLOCK, &mask, NULL); + + warning ("creating event pipe failed."); + return previous; + } + + /* Register the event loop handler. */ + add_file_handler (linux_event_pipe.event_fd (), handle_target_event, + NULL, "linux-low"); + + /* Always trigger a linux_wait. */ + async_file_mark (); + } else - { - delete_file_handler (linux_event_pipe.event_fd ()); + { + delete_file_handler (linux_event_pipe.event_fd ()); - linux_event_pipe.close_pipe (); - } + linux_event_pipe.close_pipe (); + } gdb_sigmask (SIG_UNBLOCK, &mask, NULL); } @@ -5909,26 +5828,25 @@ void linux_process_target::handle_new_gdb_connection () { /* Request that all the lwps reset their ptrace options. */ - for_each_thread ([] (thread_info *thread) - { - struct lwp_info *lwp = get_thread_lwp (thread); + for_each_thread ([] (thread_info *thread) { + struct lwp_info *lwp = get_thread_lwp (thread); - if (!lwp->stopped) - { - /* Stop the lwp so we can modify its ptrace options. */ - lwp->must_set_ptrace_flags = 1; - linux_stop_lwp (lwp); - } - else - { - /* Already stopped; go ahead and set the ptrace options. */ - struct process_info *proc = find_process_pid (pid_of (thread)); - int options = linux_low_ptrace_options (proc->attached); - - linux_enable_event_reporting (lwpid_of (thread), options); - lwp->must_set_ptrace_flags = 0; - } - }); + if (!lwp->stopped) + { + /* Stop the lwp so we can modify its ptrace options. */ + lwp->must_set_ptrace_flags = 1; + linux_stop_lwp (lwp); + } + else + { + /* Already stopped; go ahead and set the ptrace options. */ + struct process_info *proc = find_process_pid (pid_of (thread)); + int options = linux_low_ptrace_options (proc->attached); + + linux_enable_event_reporting (lwpid_of (thread), options); + lwp->must_set_ptrace_flags = 0; + } + }); } int @@ -5993,8 +5911,8 @@ linux_process_target::supports_multifs () } int -linux_process_target::multifs_open (int pid, const char *filename, - int flags, mode_t mode) +linux_process_target::multifs_open (int pid, const char *filename, int flags, + mode_t mode) { return linux_mntns_open_cloexec (pid, filename, flags, mode); } @@ -6007,7 +5925,7 @@ linux_process_target::multifs_unlink (int pid, const char *filename) ssize_t linux_process_target::multifs_readlink (int pid, const char *filename, - char *buf, size_t bufsiz) + char *buf, size_t bufsiz) { return linux_mntns_readlink (pid, filename, buf, bufsiz); } @@ -6023,7 +5941,7 @@ struct target_loadseg Elf32_Word p_memsz; }; -# if defined PT_GETDSBT +#if defined PT_GETDSBT struct target_loadmap { /* Protocol version number, must be zero. */ @@ -6036,10 +5954,10 @@ struct target_loadmap /* The actual memory map. */ struct target_loadseg segs[/*nsegs*/]; }; -# define LINUX_LOADMAP PT_GETDSBT -# define LINUX_LOADMAP_EXEC PTRACE_GETDSBT_EXEC -# define LINUX_LOADMAP_INTERP PTRACE_GETDSBT_INTERP -# else +#define LINUX_LOADMAP PT_GETDSBT +#define LINUX_LOADMAP_EXEC PTRACE_GETDSBT_EXEC +#define LINUX_LOADMAP_INTERP PTRACE_GETDSBT_INTERP +#else struct target_loadmap { /* Protocol version number, must be zero. */ @@ -6049,10 +5967,10 @@ struct target_loadmap /* The actual memory map. */ struct target_loadseg segs[/*nsegs*/]; }; -# define LINUX_LOADMAP PTRACE_GETFDPIC -# define LINUX_LOADMAP_EXEC PTRACE_GETFDPIC_EXEC -# define LINUX_LOADMAP_INTERP PTRACE_GETFDPIC_INTERP -# endif +#define LINUX_LOADMAP PTRACE_GETFDPIC +#define LINUX_LOADMAP_EXEC PTRACE_GETFDPIC_EXEC +#define LINUX_LOADMAP_INTERP PTRACE_GETFDPIC_INTERP +#endif bool linux_process_target::supports_read_loadmap () @@ -6062,7 +5980,7 @@ linux_process_target::supports_read_loadmap () int linux_process_target::read_loadmap (const char *annex, CORE_ADDR offset, - unsigned char *myaddr, unsigned int len) + unsigned char *myaddr, unsigned int len) { int pid = lwpid_of (current_thread); int addr = -1; @@ -6083,7 +6001,7 @@ linux_process_target::read_loadmap (const char *annex, CORE_ADDR offset, return -1; actual_length = sizeof (struct target_loadmap) - + sizeof (struct target_loadseg) * data->nsegs; + + sizeof (struct target_loadseg) * data->nsegs; if (offset < 0 || offset > actual_length) return -1; @@ -6156,13 +6074,13 @@ linux_process_target::unpause_all (bool unfreeze) static int get_phdr_phnum_from_proc_auxv (const int pid, const int is_elf64, - CORE_ADDR *phdr_memaddr, int *num_phdr) + CORE_ADDR *phdr_memaddr, int *num_phdr) { char filename[PATH_MAX]; int fd; - const int auxv_size = is_elf64 - ? sizeof (Elf64_auxv_t) : sizeof (Elf32_auxv_t); - char buf[sizeof (Elf64_auxv_t)]; /* The larger of the two. */ + const int auxv_size + = is_elf64 ? sizeof (Elf64_auxv_t) : sizeof (Elf32_auxv_t); + char buf[sizeof (Elf64_auxv_t)]; /* The larger of the two. */ xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid); @@ -6173,36 +6091,36 @@ get_phdr_phnum_from_proc_auxv (const int pid, const int is_elf64, *phdr_memaddr = 0; *num_phdr = 0; while (read (fd, buf, auxv_size) == auxv_size - && (*phdr_memaddr == 0 || *num_phdr == 0)) + && (*phdr_memaddr == 0 || *num_phdr == 0)) { if (is_elf64) - { - Elf64_auxv_t *const aux = (Elf64_auxv_t *) buf; - - switch (aux->a_type) - { - case AT_PHDR: - *phdr_memaddr = aux->a_un.a_val; - break; - case AT_PHNUM: - *num_phdr = aux->a_un.a_val; - break; - } - } + { + Elf64_auxv_t *const aux = (Elf64_auxv_t *) buf; + + switch (aux->a_type) + { + case AT_PHDR: + *phdr_memaddr = aux->a_un.a_val; + break; + case AT_PHNUM: + *num_phdr = aux->a_un.a_val; + break; + } + } else - { - Elf32_auxv_t *const aux = (Elf32_auxv_t *) buf; + { + Elf32_auxv_t *const aux = (Elf32_auxv_t *) buf; - switch (aux->a_type) - { - case AT_PHDR: - *phdr_memaddr = aux->a_un.a_val; - break; - case AT_PHNUM: - *num_phdr = aux->a_un.a_val; - break; - } - } + switch (aux->a_type) + { + case AT_PHDR: + *phdr_memaddr = aux->a_un.a_val; + break; + case AT_PHNUM: + *num_phdr = aux->a_un.a_val; + break; + } + } } close (fd); @@ -6210,8 +6128,8 @@ get_phdr_phnum_from_proc_auxv (const int pid, const int is_elf64, if (*phdr_memaddr == 0 || *num_phdr == 0) { warning ("Unexpected missing AT_PHDR and/or AT_PHNUM: " - "phdr_memaddr = %ld, phdr_num = %d", - (long) *phdr_memaddr, *num_phdr); + "phdr_memaddr = %ld, phdr_num = %d", + (long) *phdr_memaddr, *num_phdr); return 2; } @@ -6231,7 +6149,7 @@ get_dynamic (const int pid, const int is_elf64) if (get_phdr_phnum_from_proc_auxv (pid, is_elf64, &phdr_memaddr, &num_phdr)) return 0; - gdb_assert (num_phdr < 100); /* Basic sanity check. */ + gdb_assert (num_phdr < 100); /* Basic sanity check. */ phdr_buf = (unsigned char *) alloca (num_phdr * phdr_size); if (linux_read_memory (phdr_memaddr, phdr_buf, num_phdr * phdr_size)) @@ -6243,17 +6161,17 @@ get_dynamic (const int pid, const int is_elf64) for (i = 0; relocation == -1 && i < num_phdr; i++) if (is_elf64) { - Elf64_Phdr *const p = (Elf64_Phdr *) (phdr_buf + i * phdr_size); + Elf64_Phdr *const p = (Elf64_Phdr *) (phdr_buf + i * phdr_size); - if (p->p_type == PT_PHDR) - relocation = phdr_memaddr - p->p_vaddr; + if (p->p_type == PT_PHDR) + relocation = phdr_memaddr - p->p_vaddr; } else { - Elf32_Phdr *const p = (Elf32_Phdr *) (phdr_buf + i * phdr_size); + Elf32_Phdr *const p = (Elf32_Phdr *) (phdr_buf + i * phdr_size); - if (p->p_type == PT_PHDR) - relocation = phdr_memaddr - p->p_vaddr; + if (p->p_type == PT_PHDR) + relocation = phdr_memaddr - p->p_vaddr; } if (relocation == -1) @@ -6274,19 +6192,19 @@ get_dynamic (const int pid, const int is_elf64) for (i = 0; i < num_phdr; i++) { if (is_elf64) - { - Elf64_Phdr *const p = (Elf64_Phdr *) (phdr_buf + i * phdr_size); + { + Elf64_Phdr *const p = (Elf64_Phdr *) (phdr_buf + i * phdr_size); - if (p->p_type == PT_DYNAMIC) - return p->p_vaddr + relocation; - } + if (p->p_type == PT_DYNAMIC) + return p->p_vaddr + relocation; + } else - { - Elf32_Phdr *const p = (Elf32_Phdr *) (phdr_buf + i * phdr_size); + { + Elf32_Phdr *const p = (Elf32_Phdr *) (phdr_buf + i * phdr_size); - if (p->p_type == PT_DYNAMIC) - return p->p_vaddr + relocation; - } + if (p->p_type == PT_DYNAMIC) + return p->p_vaddr + relocation; + } } return 0; @@ -6302,7 +6220,7 @@ get_r_debug (const int pid, const int is_elf64) { CORE_ADDR dynamic_memaddr; const int dyn_size = is_elf64 ? sizeof (Elf64_Dyn) : sizeof (Elf32_Dyn); - unsigned char buf[sizeof (Elf64_Dyn)]; /* The larger of the two. */ + unsigned char buf[sizeof (Elf64_Dyn)]; /* The larger of the two. */ CORE_ADDR map = -1; dynamic_memaddr = get_dynamic (pid, is_elf64); @@ -6312,81 +6230,83 @@ get_r_debug (const int pid, const int is_elf64) while (linux_read_memory (dynamic_memaddr, buf, dyn_size) == 0) { if (is_elf64) - { - Elf64_Dyn *const dyn = (Elf64_Dyn *) buf; + { + Elf64_Dyn *const dyn = (Elf64_Dyn *) buf; #if defined DT_MIPS_RLD_MAP || defined DT_MIPS_RLD_MAP_REL - union - { - Elf64_Xword map; - unsigned char buf[sizeof (Elf64_Xword)]; - } - rld_map; + union + { + Elf64_Xword map; + unsigned char buf[sizeof (Elf64_Xword)]; + } rld_map; #endif #ifdef DT_MIPS_RLD_MAP - if (dyn->d_tag == DT_MIPS_RLD_MAP) - { - if (linux_read_memory (dyn->d_un.d_val, - rld_map.buf, sizeof (rld_map.buf)) == 0) - return rld_map.map; - else - break; - } -#endif /* DT_MIPS_RLD_MAP */ + if (dyn->d_tag == DT_MIPS_RLD_MAP) + { + if (linux_read_memory (dyn->d_un.d_val, rld_map.buf, + sizeof (rld_map.buf)) + == 0) + return rld_map.map; + else + break; + } +#endif /* DT_MIPS_RLD_MAP */ #ifdef DT_MIPS_RLD_MAP_REL - if (dyn->d_tag == DT_MIPS_RLD_MAP_REL) - { - if (linux_read_memory (dyn->d_un.d_val + dynamic_memaddr, - rld_map.buf, sizeof (rld_map.buf)) == 0) - return rld_map.map; - else - break; - } -#endif /* DT_MIPS_RLD_MAP_REL */ - - if (dyn->d_tag == DT_DEBUG && map == -1) - map = dyn->d_un.d_val; - - if (dyn->d_tag == DT_NULL) - break; - } + if (dyn->d_tag == DT_MIPS_RLD_MAP_REL) + { + if (linux_read_memory (dyn->d_un.d_val + dynamic_memaddr, + rld_map.buf, sizeof (rld_map.buf)) + == 0) + return rld_map.map; + else + break; + } +#endif /* DT_MIPS_RLD_MAP_REL */ + + if (dyn->d_tag == DT_DEBUG && map == -1) + map = dyn->d_un.d_val; + + if (dyn->d_tag == DT_NULL) + break; + } else - { - Elf32_Dyn *const dyn = (Elf32_Dyn *) buf; + { + Elf32_Dyn *const dyn = (Elf32_Dyn *) buf; #if defined DT_MIPS_RLD_MAP || defined DT_MIPS_RLD_MAP_REL - union - { - Elf32_Word map; - unsigned char buf[sizeof (Elf32_Word)]; - } - rld_map; + union + { + Elf32_Word map; + unsigned char buf[sizeof (Elf32_Word)]; + } rld_map; #endif #ifdef DT_MIPS_RLD_MAP - if (dyn->d_tag == DT_MIPS_RLD_MAP) - { - if (linux_read_memory (dyn->d_un.d_val, - rld_map.buf, sizeof (rld_map.buf)) == 0) - return rld_map.map; - else - break; - } -#endif /* DT_MIPS_RLD_MAP */ + if (dyn->d_tag == DT_MIPS_RLD_MAP) + { + if (linux_read_memory (dyn->d_un.d_val, rld_map.buf, + sizeof (rld_map.buf)) + == 0) + return rld_map.map; + else + break; + } +#endif /* DT_MIPS_RLD_MAP */ #ifdef DT_MIPS_RLD_MAP_REL - if (dyn->d_tag == DT_MIPS_RLD_MAP_REL) - { - if (linux_read_memory (dyn->d_un.d_val + dynamic_memaddr, - rld_map.buf, sizeof (rld_map.buf)) == 0) - return rld_map.map; - else - break; - } -#endif /* DT_MIPS_RLD_MAP_REL */ - - if (dyn->d_tag == DT_DEBUG && map == -1) - map = dyn->d_un.d_val; - - if (dyn->d_tag == DT_NULL) - break; - } + if (dyn->d_tag == DT_MIPS_RLD_MAP_REL) + { + if (linux_read_memory (dyn->d_un.d_val + dynamic_memaddr, + rld_map.buf, sizeof (rld_map.buf)) + == 0) + return rld_map.map; + else + break; + } +#endif /* DT_MIPS_RLD_MAP_REL */ + + if (dyn->d_tag == DT_DEBUG && map == -1) + map = dyn->d_un.d_val; + + if (dyn->d_tag == DT_NULL) + break; + } dynamic_memaddr += dyn_size; } @@ -6416,11 +6336,11 @@ read_one_ptr (CORE_ADDR memaddr, CORE_ADDR *ptr, int ptr_size) if (ret == 0) { if (ptr_size == sizeof (CORE_ADDR)) - *ptr = addr.core_addr; + *ptr = addr.core_addr; else if (ptr_size == sizeof (unsigned int)) - *ptr = addr.ui; + *ptr = addr.ui; else - gdb_assert_not_reached ("unhandled pointer size"); + gdb_assert_not_reached ("unhandled pointer size"); } return ret; } @@ -6432,84 +6352,78 @@ linux_process_target::supports_qxfer_libraries_svr4 () } struct link_map_offsets - { - /* Offset and size of r_debug.r_version. */ - int r_version_offset; +{ + /* Offset and size of r_debug.r_version. */ + int r_version_offset; - /* Offset and size of r_debug.r_map. */ - int r_map_offset; + /* Offset and size of r_debug.r_map. */ + int r_map_offset; - /* Offset of r_debug_extended.r_next. */ - int r_next_offset; + /* Offset of r_debug_extended.r_next. */ + int r_next_offset; - /* Offset to l_addr field in struct link_map. */ - int l_addr_offset; + /* Offset to l_addr field in struct link_map. */ + int l_addr_offset; - /* Offset to l_name field in struct link_map. */ - int l_name_offset; + /* Offset to l_name field in struct link_map. */ + int l_name_offset; - /* Offset to l_ld field in struct link_map. */ - int l_ld_offset; + /* Offset to l_ld field in struct link_map. */ + int l_ld_offset; - /* Offset to l_next field in struct link_map. */ - int l_next_offset; + /* Offset to l_next field in struct link_map. */ + int l_next_offset; - /* Offset to l_prev field in struct link_map. */ - int l_prev_offset; - }; + /* Offset to l_prev field in struct link_map. */ + int l_prev_offset; +}; -static const link_map_offsets lmo_32bit_offsets = - { - 0, /* r_version offset. */ - 4, /* r_debug.r_map offset. */ - 20, /* r_debug_extended.r_next. */ - 0, /* l_addr offset in link_map. */ - 4, /* l_name offset in link_map. */ - 8, /* l_ld offset in link_map. */ - 12, /* l_next offset in link_map. */ - 16 /* l_prev offset in link_map. */ - }; +static const link_map_offsets lmo_32bit_offsets = { + 0, /* r_version offset. */ + 4, /* r_debug.r_map offset. */ + 20, /* r_debug_extended.r_next. */ + 0, /* l_addr offset in link_map. */ + 4, /* l_name offset in link_map. */ + 8, /* l_ld offset in link_map. */ + 12, /* l_next offset in link_map. */ + 16 /* l_prev offset in link_map. */ +}; -static const link_map_offsets lmo_64bit_offsets = - { - 0, /* r_version offset. */ - 8, /* r_debug.r_map offset. */ - 40, /* r_debug_extended.r_next. */ - 0, /* l_addr offset in link_map. */ - 8, /* l_name offset in link_map. */ - 16, /* l_ld offset in link_map. */ - 24, /* l_next offset in link_map. */ - 32 /* l_prev offset in link_map. */ - }; +static const link_map_offsets lmo_64bit_offsets = { + 0, /* r_version offset. */ + 8, /* r_debug.r_map offset. */ + 40, /* r_debug_extended.r_next. */ + 0, /* l_addr offset in link_map. */ + 8, /* l_name offset in link_map. */ + 16, /* l_ld offset in link_map. */ + 24, /* l_next offset in link_map. */ + 32 /* l_prev offset in link_map. */ +}; /* Get the loaded shared libraries from one namespace. */ static void read_link_map (std::string &document, CORE_ADDR lmid, CORE_ADDR lm_addr, - CORE_ADDR lm_prev, int ptr_size, const link_map_offsets *lmo) + CORE_ADDR lm_prev, int ptr_size, const link_map_offsets *lmo) { CORE_ADDR l_name, l_addr, l_ld, l_next, l_prev; while (lm_addr - && read_one_ptr (lm_addr + lmo->l_name_offset, - &l_name, ptr_size) == 0 - && read_one_ptr (lm_addr + lmo->l_addr_offset, - &l_addr, ptr_size) == 0 - && read_one_ptr (lm_addr + lmo->l_ld_offset, - &l_ld, ptr_size) == 0 - && read_one_ptr (lm_addr + lmo->l_prev_offset, - &l_prev, ptr_size) == 0 - && read_one_ptr (lm_addr + lmo->l_next_offset, - &l_next, ptr_size) == 0) + && read_one_ptr (lm_addr + lmo->l_name_offset, &l_name, ptr_size) == 0 + && read_one_ptr (lm_addr + lmo->l_addr_offset, &l_addr, ptr_size) == 0 + && read_one_ptr (lm_addr + lmo->l_ld_offset, &l_ld, ptr_size) == 0 + && read_one_ptr (lm_addr + lmo->l_prev_offset, &l_prev, ptr_size) == 0 + && read_one_ptr (lm_addr + lmo->l_next_offset, &l_next, ptr_size) + == 0) { unsigned char libname[PATH_MAX]; if (lm_prev != l_prev) - { - warning ("Corrupted shared library list: 0x%s != 0x%s", - paddress (lm_prev), paddress (l_prev)); - break; - } + { + warning ("Corrupted shared library list: 0x%s != 0x%s", + paddress (lm_prev), paddress (l_prev)); + break; + } /* Not checking for error because reading may stop before we've got PATH_MAX worth of characters. */ @@ -6517,14 +6431,15 @@ read_link_map (std::string &document, CORE_ADDR lmid, CORE_ADDR lm_addr, linux_read_memory (l_name, libname, sizeof (libname) - 1); libname[sizeof (libname) - 1] = '\0'; if (libname[0] != '\0') - { - string_appendf (document, "<library name=\""); - xml_escape_text_append (document, (char *) libname); - string_appendf (document, "\" lm=\"0x%s\" l_addr=\"0x%s\" " - "l_ld=\"0x%s\" lmid=\"0x%s\"/>", - paddress (lm_addr), paddress (l_addr), - paddress (l_ld), paddress (lmid)); - } + { + string_appendf (document, "<library name=\""); + xml_escape_text_append (document, (char *) libname); + string_appendf (document, + "\" lm=\"0x%s\" l_addr=\"0x%s\" " + "l_ld=\"0x%s\" lmid=\"0x%s\"/>", + paddress (lm_addr), paddress (l_addr), + paddress (l_ld), paddress (lmid)); + } lm_prev = lm_addr; lm_addr = l_next; @@ -6535,9 +6450,9 @@ read_link_map (std::string &document, CORE_ADDR lmid, CORE_ADDR lm_addr, int linux_process_target::qxfer_libraries_svr4 (const char *annex, - unsigned char *readbuf, - unsigned const char *writebuf, - CORE_ADDR offset, int len) + unsigned char *readbuf, + unsigned const char *writebuf, + CORE_ADDR offset, int len) { struct process_info_private *const priv = current_process ()->priv; char filename[PATH_MAX]; @@ -6574,23 +6489,23 @@ linux_process_target::qxfer_libraries_svr4 (const char *annex, sep = strchr (annex, '='); if (sep == NULL) - break; + break; name_len = sep - annex; if (name_len == 4 && startswith (annex, "lmid")) - addrp = &lmid; + addrp = &lmid; else if (name_len == 5 && startswith (annex, "start")) - addrp = &lm_addr; + addrp = &lm_addr; else if (name_len == 4 && startswith (annex, "prev")) - addrp = &lm_prev; + addrp = &lm_prev; else - { - annex = strchr (sep, ';'); - if (annex == NULL) - break; - annex++; - continue; - } + { + annex = strchr (sep, ';'); + if (annex == NULL) + break; + annex++; + continue; + } annex = decode_address_to_semicolon (addrp, sep + 1); } @@ -6609,92 +6524,94 @@ linux_process_target::qxfer_libraries_svr4 (const char *annex, else { if (lm_prev != 0) - warning ("ignoring prev=0x%s without start", paddress (lm_prev)); + warning ("ignoring prev=0x%s without start", paddress (lm_prev)); /* We could interpret LMID as 'provide only the libraries for this namespace' but GDB is currently only providing lmid, start, and prev, or nothing. */ if (lmid != 0) - warning ("ignoring lmid=0x%s without start", paddress (lmid)); + warning ("ignoring lmid=0x%s without start", paddress (lmid)); CORE_ADDR r_debug = priv->r_debug; if (r_debug == 0) - r_debug = priv->r_debug = get_r_debug (pid, is_elf64); + r_debug = priv->r_debug = get_r_debug (pid, is_elf64); /* We failed to find DT_DEBUG. Such situation will not change for this inferior - do not retry it. Report it to GDB as E01, see for the reasons at the GDB solib-svr4.c side. */ if (r_debug == (CORE_ADDR) -1) - return -1; + return -1; /* Terminate the header if we end up with an empty list. */ if (r_debug == 0) - document += ">"; + document += ">"; while (r_debug != 0) - { - int r_version = 0; - if (linux_read_memory (r_debug + lmo->r_version_offset, - (unsigned char *) &r_version, - sizeof (r_version)) != 0) - { - warning ("unable to read r_version from 0x%s", - paddress (r_debug + lmo->r_version_offset)); - break; - } - - if (r_version < 1) - { - warning ("unexpected r_debug version %d", r_version); - break; - } - - if (read_one_ptr (r_debug + lmo->r_map_offset, &lm_addr, - ptr_size) != 0) - { - warning ("unable to read r_map from 0x%s", - paddress (r_debug + lmo->r_map_offset)); - break; - } - - /* We read the entire namespace. */ - lm_prev = 0; - - /* The first entry corresponds to the main executable unless the + { + int r_version = 0; + if (linux_read_memory (r_debug + lmo->r_version_offset, + (unsigned char *) &r_version, + sizeof (r_version)) + != 0) + { + warning ("unable to read r_version from 0x%s", + paddress (r_debug + lmo->r_version_offset)); + break; + } + + if (r_version < 1) + { + warning ("unexpected r_debug version %d", r_version); + break; + } + + if (read_one_ptr (r_debug + lmo->r_map_offset, &lm_addr, ptr_size) + != 0) + { + warning ("unable to read r_map from 0x%s", + paddress (r_debug + lmo->r_map_offset)); + break; + } + + /* We read the entire namespace. */ + lm_prev = 0; + + /* The first entry corresponds to the main executable unless the dynamic loader was loaded late by a static executable. But in such case the main executable does not have PT_DYNAMIC present and we would not have gotten here. */ - if (r_debug == priv->r_debug) - { - if (lm_addr != 0) - string_appendf (document, " main-lm=\"0x%s\">", - paddress (lm_addr)); - else - document += ">"; - - lm_prev = lm_addr; - if (read_one_ptr (lm_addr + lmo->l_next_offset, - &lm_addr, ptr_size) != 0) - { - warning ("unable to read l_next from 0x%s", - paddress (lm_addr + lmo->l_next_offset)); - break; - } - } - - read_link_map (document, r_debug, lm_addr, lm_prev, ptr_size, lmo); - - if (r_version < 2) - break; - - if (read_one_ptr (r_debug + lmo->r_next_offset, &r_debug, - ptr_size) != 0) - { - warning ("unable to read r_next from 0x%s", - paddress (r_debug + lmo->r_next_offset)); - break; - } - } + if (r_debug == priv->r_debug) + { + if (lm_addr != 0) + string_appendf (document, " main-lm=\"0x%s\">", + paddress (lm_addr)); + else + document += ">"; + + lm_prev = lm_addr; + if (read_one_ptr (lm_addr + lmo->l_next_offset, &lm_addr, + ptr_size) + != 0) + { + warning ("unable to read l_next from 0x%s", + paddress (lm_addr + lmo->l_next_offset)); + break; + } + } + + read_link_map (document, r_debug, lm_addr, lm_prev, ptr_size, lmo); + + if (r_version < 2) + break; + + if (read_one_ptr (r_debug + lmo->r_next_offset, &r_debug, ptr_size) + != 0) + { + warning ("unable to read r_next from 0x%s", + paddress (r_debug + lmo->r_next_offset)); + break; + } + } } document += "</library-list-svr4>"; @@ -6722,7 +6639,7 @@ linux_process_target::supports_btrace () btrace_target_info * linux_process_target::enable_btrace (thread_info *tp, - const btrace_config *conf) + const btrace_config *conf) { return linux_enable_btrace (tp->id, conf); } @@ -6742,17 +6659,18 @@ linux_process_target::disable_btrace (btrace_target_info *tinfo) static void linux_low_encode_pt_config (struct buffer *buffer, - const struct btrace_data_pt_config *config) + const struct btrace_data_pt_config *config) { buffer_grow_str (buffer, "<pt-config>\n"); switch (config->cpu.vendor) { case CV_INTEL: - buffer_xml_printf (buffer, "<cpu vendor=\"GenuineIntel\" family=\"%u\" " - "model=\"%u\" stepping=\"%u\"/>\n", - config->cpu.family, config->cpu.model, - config->cpu.stepping); + buffer_xml_printf (buffer, + "<cpu vendor=\"GenuineIntel\" family=\"%u\" " + "model=\"%u\" stepping=\"%u\"/>\n", + config->cpu.family, config->cpu.model, + config->cpu.stepping); break; default: @@ -6766,7 +6684,7 @@ linux_low_encode_pt_config (struct buffer *buffer, static void linux_low_encode_raw (struct buffer *buffer, const gdb_byte *data, - unsigned int size) + unsigned int size) { if (size == 0) return; @@ -6790,9 +6708,8 @@ linux_low_encode_raw (struct buffer *buffer, const gdb_byte *data, /* See to_read_btrace target method. */ int -linux_process_target::read_btrace (btrace_target_info *tinfo, - buffer *buffer, - enum btrace_read_type type) +linux_process_target::read_btrace (btrace_target_info *tinfo, buffer *buffer, + enum btrace_read_type type) { struct btrace_data btrace; enum btrace_error err; @@ -6801,9 +6718,9 @@ linux_process_target::read_btrace (btrace_target_info *tinfo, if (err != BTRACE_ERR_NONE) { if (err == BTRACE_ERR_OVERFLOW) - buffer_grow_str0 (buffer, "E.Overflow."); + buffer_grow_str0 (buffer, "E.Overflow."); else - buffer_grow_str0 (buffer, "E.Generic Error."); + buffer_grow_str0 (buffer, "E.Generic Error."); return -1; } @@ -6819,8 +6736,8 @@ linux_process_target::read_btrace (btrace_target_info *tinfo, buffer_grow_str (buffer, "<btrace version=\"1.0\">\n"); for (const btrace_block &block : *btrace.variant.bts.blocks) - buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n", - paddress (block.begin), paddress (block.end)); + buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n", + paddress (block.begin), paddress (block.end)); buffer_grow_str0 (buffer, "</btrace>\n"); break; @@ -6833,7 +6750,7 @@ linux_process_target::read_btrace (btrace_target_info *tinfo, linux_low_encode_pt_config (buffer, &btrace.variant.pt.config); linux_low_encode_raw (buffer, btrace.variant.pt.data, - btrace.variant.pt.size); + btrace.variant.pt.size); buffer_grow_str (buffer, "</pt>\n"); buffer_grow_str0 (buffer, "</btrace>\n"); @@ -6851,33 +6768,34 @@ linux_process_target::read_btrace (btrace_target_info *tinfo, int linux_process_target::read_btrace_conf (const btrace_target_info *tinfo, - buffer *buffer) + buffer *buffer) { const struct btrace_config *conf; - buffer_grow_str (buffer, "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n"); + buffer_grow_str (buffer, + "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n"); buffer_grow_str (buffer, "<btrace-conf version=\"1.0\">\n"); conf = linux_btrace_conf (tinfo); if (conf != NULL) { switch (conf->format) - { - case BTRACE_FORMAT_NONE: - break; + { + case BTRACE_FORMAT_NONE: + break; - case BTRACE_FORMAT_BTS: - buffer_xml_printf (buffer, "<bts"); - buffer_xml_printf (buffer, " size=\"0x%x\"", conf->bts.size); - buffer_xml_printf (buffer, " />\n"); - break; + case BTRACE_FORMAT_BTS: + buffer_xml_printf (buffer, "<bts"); + buffer_xml_printf (buffer, " size=\"0x%x\"", conf->bts.size); + buffer_xml_printf (buffer, " />\n"); + break; - case BTRACE_FORMAT_PT: - buffer_xml_printf (buffer, "<pt"); - buffer_xml_printf (buffer, " size=\"0x%x\"", conf->pt.size); - buffer_xml_printf (buffer, "/>\n"); - break; - } + case BTRACE_FORMAT_PT: + buffer_xml_printf (buffer, "<pt"); + buffer_xml_printf (buffer, " size=\"0x%x\"", conf->pt.size); + buffer_xml_printf (buffer, "/>\n"); + break; + } } buffer_grow_str0 (buffer, "</btrace-conf>\n"); @@ -6902,7 +6820,7 @@ linux_process_target::thread_name (ptid_t thread) #if USE_THREAD_DB bool linux_process_target::thread_handle (ptid_t ptid, gdb_byte **handle, - int *handle_len) + int *handle_len) { return thread_db_thread_handle (ptid, handle, handle_len); } @@ -6989,26 +6907,26 @@ linux_get_auxv (int pid, int wordsize, CORE_ADDR match, CORE_ADDR *valp) gdb_assert (wordsize == 4 || wordsize == 8); while (the_target->read_auxv (pid, offset, data, 2 * wordsize) - == 2 * wordsize) + == 2 * wordsize) { if (wordsize == 4) - { - uint32_t *data_p = (uint32_t *) data; - if (data_p[0] == match) - { - *valp = data_p[1]; - return 1; - } - } + { + uint32_t *data_p = (uint32_t *) data; + if (data_p[0] == match) + { + *valp = data_p[1]; + return 1; + } + } else - { - uint64_t *data_p = (uint64_t *) data; - if (data_p[0] == match) - { - *valp = data_p[1]; - return 1; - } - } + { + uint64_t *data_p = (uint64_t *) data; + if (data_p[0] == match) + { + *valp = data_p[1]; + return 1; + } + } offset += 2 * wordsize; } @@ -7040,8 +6958,7 @@ linux_get_hwcap2 (int pid, int wordsize) void initialize_regsets_info (struct regsets_info *info) { - for (info->num_regsets = 0; - info->regsets[info->num_regsets].size >= 0; + for (info->num_regsets = 0; info->regsets[info->num_regsets].size >= 0; info->num_regsets++) ; } |