mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
200fd2874d
While working on a later patch that required me to understand how GDB starts up inferiors, I was confused by the target_ops::post_startup_inferior method. The post_startup_inferior target function is only called from inf_ptrace_target::create_inferior. Part of the target class hierarchy looks like this: inf_child_target | '-- inf_ptrace_target | |-- linux_nat_target | |-- fbsd_nat_target | |-- nbsd_nat_target | |-- obsd_nat_target | '-- rs6000_nat_target Every sub-class of inf_ptrace_target, except rs6000_nat_target, implements ::post_startup_inferior. The rs6000_nat_target picks up the implementation of ::post_startup_inferior not from inf_ptrace_target, but from inf_child_target. No descendent of inf_child_target, outside the inf_ptrace_target sub-tree, implements ::post_startup_inferior, which isn't really surprising, as they would never see the method called (remember, the method is only called from inf_ptrace_target::create_inferior). What I find confusing is the role inf_child_target plays in implementing, what is really a helper function for just one of its descendents. In this commit I propose that we formally make ::post_startup_inferior a helper function of inf_ptrace_target. To do this I will remove the ::post_startup_inferior from the target_ops API, and instead make this a protected, pure virtual function on inf_ptrace_target. I'll remove the empty implementation of ::post_startup_inferior from the inf_child_target class, and add a new empty implementation to the rs6000_nat_target class. All the other descendents of inf_ptrace_target already provide an implementation of this method and so don't need to change beyond making the method protected within their class declarations. To me, this makes much more sense now. The helper function, which is only called from within the inf_ptrace_target class, is now a part of the inf_ptrace_target class. The only way in which this change is visible to a user is if the user turns on 'set debug target 1'. With this debug flag on, prior to this patch the user would see something like: -> native->post_startup_inferior (...) <- native->post_startup_inferior (2588939) After this patch these lines are no longer present, as the post_startup_inferior is no longer a top level target method. For me, this is an acceptable change.
89 lines
3.1 KiB
C++
89 lines
3.1 KiB
C++
/* Native-dependent code for GNU/Linux x86 (i386 and x86-64).
|
||
|
||
Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
||
|
||
This file is part of GDB.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||
|
||
#ifndef X86_LINUX_NAT_H
|
||
#define X86_LINUX_NAT_H 1
|
||
|
||
#include "gdb_proc_service.h" /* For ps_err_e. */
|
||
#include "linux-nat.h"
|
||
#include "x86-nat.h"
|
||
#include "nat/x86-linux.h"
|
||
|
||
struct x86_linux_nat_target : public x86_nat_target<linux_nat_target>
|
||
{
|
||
virtual ~x86_linux_nat_target () override = 0;
|
||
|
||
/* Add the description reader. */
|
||
const struct target_desc *read_description () override;
|
||
|
||
struct btrace_target_info *enable_btrace (ptid_t ptid,
|
||
const struct btrace_config *conf) override;
|
||
void disable_btrace (struct btrace_target_info *tinfo) override;
|
||
void teardown_btrace (struct btrace_target_info *tinfo) override;
|
||
enum btrace_error read_btrace (struct btrace_data *data,
|
||
struct btrace_target_info *btinfo,
|
||
enum btrace_read_type type) override;
|
||
const struct btrace_config *btrace_conf (const struct btrace_target_info *) override;
|
||
|
||
/* These two are rewired to low_ versions. linux-nat.c queries
|
||
stopped-by-watchpoint info as soon as an lwp stops (via the low_
|
||
methods) and caches the result, to be returned via the normal
|
||
non-low methods. */
|
||
bool stopped_by_watchpoint () override
|
||
{ return linux_nat_target::stopped_by_watchpoint (); }
|
||
|
||
bool stopped_data_address (CORE_ADDR *addr_p) override
|
||
{ return linux_nat_target::stopped_data_address (addr_p); }
|
||
|
||
bool low_stopped_by_watchpoint () override
|
||
{ return x86_nat_target::stopped_by_watchpoint (); }
|
||
|
||
bool low_stopped_data_address (CORE_ADDR *addr_p) override
|
||
{ return x86_nat_target::stopped_data_address (addr_p); }
|
||
|
||
void low_new_fork (struct lwp_info *parent, pid_t child_pid) override;
|
||
|
||
void low_forget_process (pid_t pid) override
|
||
{ x86_forget_process (pid); }
|
||
|
||
void low_prepare_to_resume (struct lwp_info *lwp) override
|
||
{ x86_linux_prepare_to_resume (lwp); }
|
||
|
||
void low_new_thread (struct lwp_info *lwp) override
|
||
{ x86_linux_new_thread (lwp); }
|
||
|
||
void low_delete_thread (struct arch_lwp_info *lwp) override
|
||
{ x86_linux_delete_thread (lwp); }
|
||
|
||
protected:
|
||
/* Override the GNU/Linux inferior startup hook. */
|
||
void post_startup_inferior (ptid_t) override;
|
||
};
|
||
|
||
|
||
|
||
/* Helper for ps_get_thread_area. Sets BASE_ADDR to a pointer to
|
||
the thread local storage (or its descriptor) and returns PS_OK
|
||
on success. Returns PS_ERR on failure. */
|
||
|
||
extern ps_err_e x86_linux_get_thread_area (pid_t pid, void *addr,
|
||
unsigned int *base_addr);
|
||
|
||
#endif
|