mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
gdb: pass core file to gdbarch_core_xfer_siginfo
Another patch that aims to remove 'current_program_space->core_bfd ()' from GDB. This time I'm passing the core file BFD as an argument to the gdbarch method gdbarch_core_xfer_siginfo. In corelow.c the core file is being passed, this does introduce a new instance of 'current_program_space->core_bfd ()', but this is OK. My long term plan is to move the core bfd into core_target, in which case the call to gdbarch_core_xfer_siginfo will have access to the core bfd as a member variable. For now though, this patch moves the accesses via global state up the call stack, and consolidates the two calls from fbsd-tdep.c and linux-tdep.c into the one call in corelow.c. There should be no user visible changes after this commit. Approved-By: Simon Marchi <simon.marchi@efficios.com>
This commit is contained in:
@@ -1671,8 +1671,10 @@ core_target::xfer_partial (enum target_object object, const char *annex,
|
|||||||
if (m_core_gdbarch != nullptr
|
if (m_core_gdbarch != nullptr
|
||||||
&& gdbarch_core_xfer_siginfo_p (m_core_gdbarch))
|
&& gdbarch_core_xfer_siginfo_p (m_core_gdbarch))
|
||||||
{
|
{
|
||||||
LONGEST l = gdbarch_core_xfer_siginfo (m_core_gdbarch, readbuf,
|
struct bfd *cbfd = current_program_space->core_bfd ();
|
||||||
offset, len);
|
gdb_assert (cbfd != nullptr);
|
||||||
|
LONGEST l = gdbarch_core_xfer_siginfo (m_core_gdbarch, *cbfd,
|
||||||
|
readbuf, offset, len);
|
||||||
|
|
||||||
if (l >= 0)
|
if (l >= 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -594,8 +594,8 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr)
|
|||||||
/* Implement the "core_xfer_siginfo" gdbarch method. */
|
/* Implement the "core_xfer_siginfo" gdbarch method. */
|
||||||
|
|
||||||
static LONGEST
|
static LONGEST
|
||||||
fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
|
fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd,
|
||||||
ULONGEST offset, ULONGEST len)
|
gdb_byte *readbuf, ULONGEST offset, ULONGEST len)
|
||||||
{
|
{
|
||||||
size_t siginfo_size;
|
size_t siginfo_size;
|
||||||
|
|
||||||
@@ -607,13 +607,12 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
thread_section_name section_name (".note.freebsdcore.lwpinfo", inferior_ptid);
|
thread_section_name section_name (".note.freebsdcore.lwpinfo", inferior_ptid);
|
||||||
bfd *cbfd = current_program_space->core_bfd ();
|
asection *section = bfd_get_section_by_name (&cbfd, section_name.c_str ());
|
||||||
asection *section = bfd_get_section_by_name (cbfd, section_name.c_str ());
|
|
||||||
if (section == NULL)
|
if (section == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
gdb_byte buf[4];
|
gdb_byte buf[4];
|
||||||
if (!bfd_get_section_contents (cbfd, section, buf,
|
if (!bfd_get_section_contents (&cbfd, section, buf,
|
||||||
LWPINFO_OFFSET + LWPINFO_PL_FLAGS, 4))
|
LWPINFO_OFFSET + LWPINFO_PL_FLAGS, 4))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@@ -630,7 +629,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
|
|||||||
else
|
else
|
||||||
siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO;
|
siginfo_offset = LWPINFO_OFFSET + LWPINFO64_PL_SIGINFO;
|
||||||
|
|
||||||
if (!bfd_get_section_contents (cbfd, section, readbuf,
|
if (!bfd_get_section_contents (&cbfd, section, readbuf,
|
||||||
siginfo_offset + offset, len))
|
siginfo_offset + offset, len))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|||||||
@@ -4066,13 +4066,13 @@ gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LONGEST
|
LONGEST
|
||||||
gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len)
|
gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd, gdb_byte *readbuf, ULONGEST offset, ULONGEST len)
|
||||||
{
|
{
|
||||||
gdb_assert (gdbarch != NULL);
|
gdb_assert (gdbarch != NULL);
|
||||||
gdb_assert (gdbarch->core_xfer_siginfo != NULL);
|
gdb_assert (gdbarch->core_xfer_siginfo != NULL);
|
||||||
if (gdbarch_debug >= 2)
|
if (gdbarch_debug >= 2)
|
||||||
gdb_printf (gdb_stdlog, "gdbarch_core_xfer_siginfo called\n");
|
gdb_printf (gdb_stdlog, "gdbarch_core_xfer_siginfo called\n");
|
||||||
return gdbarch->core_xfer_siginfo (gdbarch, readbuf, offset, len);
|
return gdbarch->core_xfer_siginfo (gdbarch, cbfd, readbuf, offset, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -1060,13 +1060,13 @@ extern const char * gdbarch_core_thread_name (struct gdbarch *gdbarch, struct th
|
|||||||
extern void set_gdbarch_core_thread_name (struct gdbarch *gdbarch, gdbarch_core_thread_name_ftype *core_thread_name);
|
extern void set_gdbarch_core_thread_name (struct gdbarch *gdbarch, gdbarch_core_thread_name_ftype *core_thread_name);
|
||||||
|
|
||||||
/* Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information
|
/* Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information
|
||||||
from core file into buffer READBUF with length LEN. Return the number
|
from core file CBFD into buffer READBUF with length LEN. Return the number
|
||||||
of bytes read (zero indicates EOF, a negative value indicates failure). */
|
of bytes read (zero indicates EOF, a negative value indicates failure). */
|
||||||
|
|
||||||
extern bool gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch);
|
extern bool gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch);
|
||||||
|
|
||||||
typedef LONGEST (gdbarch_core_xfer_siginfo_ftype) (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len);
|
typedef LONGEST (gdbarch_core_xfer_siginfo_ftype) (struct gdbarch *gdbarch, struct bfd &cbfd, gdb_byte *readbuf, ULONGEST offset, ULONGEST len);
|
||||||
extern LONGEST gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len);
|
extern LONGEST gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd, gdb_byte *readbuf, ULONGEST offset, ULONGEST len);
|
||||||
extern void set_gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdbarch_core_xfer_siginfo_ftype *core_xfer_siginfo);
|
extern void set_gdbarch_core_xfer_siginfo (struct gdbarch *gdbarch, gdbarch_core_xfer_siginfo_ftype *core_xfer_siginfo);
|
||||||
|
|
||||||
/* Read x86 XSAVE layout information from core file into XSAVE_LAYOUT.
|
/* Read x86 XSAVE layout information from core file into XSAVE_LAYOUT.
|
||||||
|
|||||||
@@ -1777,12 +1777,17 @@ How the core target extracts the name of a thread from a core file.
|
|||||||
Method(
|
Method(
|
||||||
comment="""
|
comment="""
|
||||||
Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information
|
Read offset OFFSET of TARGET_OBJECT_SIGNAL_INFO signal information
|
||||||
from core file into buffer READBUF with length LEN. Return the number
|
from core file CBFD into buffer READBUF with length LEN. Return the number
|
||||||
of bytes read (zero indicates EOF, a negative value indicates failure).
|
of bytes read (zero indicates EOF, a negative value indicates failure).
|
||||||
""",
|
""",
|
||||||
type="LONGEST",
|
type="LONGEST",
|
||||||
name="core_xfer_siginfo",
|
name="core_xfer_siginfo",
|
||||||
params=[("gdb_byte *", "readbuf"), ("ULONGEST", "offset"), ("ULONGEST", "len")],
|
params=[
|
||||||
|
("struct bfd &", "cbfd"),
|
||||||
|
("gdb_byte *", "readbuf"),
|
||||||
|
("ULONGEST", "offset"),
|
||||||
|
("ULONGEST", "len")
|
||||||
|
],
|
||||||
predicate=True,
|
predicate=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1307,18 +1307,15 @@ linux_core_info_proc (struct gdbarch *gdbarch, struct bfd *cbfd,
|
|||||||
interface. */
|
interface. */
|
||||||
|
|
||||||
static LONGEST
|
static LONGEST
|
||||||
linux_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf,
|
linux_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd,
|
||||||
ULONGEST offset, ULONGEST len)
|
gdb_byte *readbuf, ULONGEST offset, ULONGEST len)
|
||||||
{
|
{
|
||||||
thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid);
|
thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid);
|
||||||
asection *section
|
asection *section = bfd_get_section_by_name (&cbfd, section_name.c_str ());
|
||||||
= bfd_get_section_by_name (current_program_space->core_bfd (),
|
if (section == nullptr)
|
||||||
section_name.c_str ());
|
|
||||||
if (section == NULL)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!bfd_get_section_contents (current_program_space->core_bfd (), section,
|
if (!bfd_get_section_contents (&cbfd, section, readbuf, offset, len))
|
||||||
readbuf, offset, len))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|||||||
Reference in New Issue
Block a user