diff options
author | Andrew Burgess <aburgess@redhat.com> | 2025-08-27 11:49:24 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2025-09-04 16:43:19 +0100 |
commit | a45b16f16e8eb4b24d55b1d83a24524cd4b042f1 (patch) | |
tree | 7d5c0b908aa518518d9ed56961e942a538e2c3b0 | |
parent | a839a42bcd865707b25a3b787858d019a41b8b8e (diff) | |
download | binutils-a45b16f16e8eb4b24d55b1d83a24524cd4b042f1.zip binutils-a45b16f16e8eb4b24d55b1d83a24524cd4b042f1.tar.gz binutils-a45b16f16e8eb4b24d55b1d83a24524cd4b042f1.tar.bz2 |
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>
-rw-r--r-- | gdb/corelow.c | 6 | ||||
-rw-r--r-- | gdb/fbsd-tdep.c | 11 | ||||
-rw-r--r-- | gdb/gdbarch-gen.c | 4 | ||||
-rw-r--r-- | gdb/gdbarch-gen.h | 6 | ||||
-rw-r--r-- | gdb/gdbarch_components.py | 9 | ||||
-rw-r--r-- | gdb/linux-tdep.c | 13 |
6 files changed, 26 insertions, 23 deletions
diff --git a/gdb/corelow.c b/gdb/corelow.c index 02d13a8..b91f490 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -1671,8 +1671,10 @@ core_target::xfer_partial (enum target_object object, const char *annex, if (m_core_gdbarch != nullptr && gdbarch_core_xfer_siginfo_p (m_core_gdbarch)) { - LONGEST l = gdbarch_core_xfer_siginfo (m_core_gdbarch, readbuf, - offset, len); + struct bfd *cbfd = current_program_space->core_bfd (); + gdb_assert (cbfd != nullptr); + LONGEST l = gdbarch_core_xfer_siginfo (m_core_gdbarch, *cbfd, + readbuf, offset, len); if (l >= 0) { diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c index 171dbce..a8f5e63 100644 --- a/gdb/fbsd-tdep.c +++ b/gdb/fbsd-tdep.c @@ -594,8 +594,8 @@ fbsd_core_thread_name (struct gdbarch *gdbarch, struct thread_info *thr) /* Implement the "core_xfer_siginfo" gdbarch method. */ static LONGEST -fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, - ULONGEST offset, ULONGEST len) +fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd, + gdb_byte *readbuf, ULONGEST offset, ULONGEST len) { size_t siginfo_size; @@ -607,13 +607,12 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, return -1; 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) return -1; 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)) return -1; @@ -630,7 +629,7 @@ fbsd_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, else 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)) return -1; diff --git a/gdb/gdbarch-gen.c b/gdb/gdbarch-gen.c index 09bb480..025e566 100644 --- a/gdb/gdbarch-gen.c +++ b/gdb/gdbarch-gen.c @@ -4066,13 +4066,13 @@ gdbarch_core_xfer_siginfo_p (struct gdbarch *gdbarch) } 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->core_xfer_siginfo != NULL); if (gdbarch_debug >= 2) 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 diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 7171c42..2870e7c 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -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); /* 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). */ 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); -extern LONGEST gdbarch_core_xfer_siginfo (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, 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); /* Read x86 XSAVE layout information from core file into XSAVE_LAYOUT. diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py index f933a09..5287451 100644 --- a/gdb/gdbarch_components.py +++ b/gdb/gdbarch_components.py @@ -1777,12 +1777,17 @@ How the core target extracts the name of a thread from a core file. Method( comment=""" 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). """, type="LONGEST", 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, ) diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index 4ec689c..f07f987 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -1307,18 +1307,15 @@ linux_core_info_proc (struct gdbarch *gdbarch, struct bfd *cbfd, interface. */ static LONGEST -linux_core_xfer_siginfo (struct gdbarch *gdbarch, gdb_byte *readbuf, - ULONGEST offset, ULONGEST len) +linux_core_xfer_siginfo (struct gdbarch *gdbarch, struct bfd &cbfd, + gdb_byte *readbuf, ULONGEST offset, ULONGEST len) { thread_section_name section_name (".note.linuxcore.siginfo", inferior_ptid); - asection *section - = bfd_get_section_by_name (current_program_space->core_bfd (), - section_name.c_str ()); - if (section == NULL) + asection *section = bfd_get_section_by_name (&cbfd, section_name.c_str ()); + if (section == nullptr) return -1; - if (!bfd_get_section_contents (current_program_space->core_bfd (), section, - readbuf, offset, len)) + if (!bfd_get_section_contents (&cbfd, section, readbuf, offset, len)) return -1; return len; |