From: Andrew Burgess <aburgess@redhat.com>
To: gdb-patches@sourceware.org
Cc: Andrew Burgess <aburgess@redhat.com>
Subject: [PATCHv8 4/4] gdb: cache program space entry point information
Date: Mon, 20 Jul 2026 10:52:20 +0100 [thread overview]
Message-ID: <f885b4bd23787f67111266cfd80786c1f68f7d31.1784541057.git.aburgess@redhat.com> (raw)
In-Reply-To: <cover.1784541057.git.aburgess@redhat.com>
After the previous two patches, there are now two places where we
check if a frame is an entry point frame, these are in get_prev_frame
and frame_unwind_caller_frame. Both of these locations call
inside_entry_func, which then calls program_space::get_entry_point_info.
The calls to program_space::get_entry_point_info are not crazy
expensive, but they are not free either, there are reads from target
memory to read the auxv vector and the entry address offset, so on
remote targets this could introduce a small delay.
However, the result from program_space::get_entry_point_info is not
expected to change from one call to the next. This information should
be a property of the executable and libraries, so we really only need
to figure it out once.
This commit caches the entry point information within program_space,
clearing it whenever an inferior starts or exits, or whenever the
executable is updated. After clearing GDB will compute, and cache the
updated information the next time it is needed, which will be whenever
GDB needs to unwind a frame.
It will be possible to observe this change by, for example, monitoring
the remote target packets, but as far as the normal GDB output is
concerned, there should be no user visible changes after this commit.
---
gdb/progspace.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
gdb/progspace.h | 9 ++++++++-
2 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/gdb/progspace.c b/gdb/progspace.c
index 4de32bc522f..b1e313f97ff 100644
--- a/gdb/progspace.c
+++ b/gdb/progspace.c
@@ -289,9 +289,12 @@ program_space::exec_entry_point_address () const
/* See progspace.h. */
-entry_point_info
+const entry_point_info &
program_space::get_entry_point_info () const
{
+ if (m_entry_point_info.has_value ())
+ return m_entry_point_info.value ();
+
std::optional<CORE_ADDR> exec_entry_address
= this->exec_entry_point_address_if_available ();
@@ -299,8 +302,9 @@ program_space::get_entry_point_info () const
if (m_solib_ops != nullptr)
inferior_entry_address = m_solib_ops->inferior_entry_point_address ();
- return entry_point_info (std::move (inferior_entry_address),
- std::move (exec_entry_address));
+ m_entry_point_info.emplace (std::move (inferior_entry_address),
+ std::move (exec_entry_address));
+ return m_entry_point_info.value ();
}
/* Implement the 'maint info entry-address' command. */
@@ -538,11 +542,46 @@ program_space::clear_solib_cache ()
deleted_solibs.clear ();
}
+/* Clear cached entry point information in the program space of INF. */
+
+static void
+clear_cached_entry_point_info_for_inferior (inferior *inf)
+{
+ inf->pspace->clear_cached_entry_point_info ();
+}
+
+/* Clear cached entry point information in the program space PSPACE. */
+
+static void
+clear_cached_entry_point_info_for_pspace (program_space *pspace,
+ bool /* reload */)
+{
+ pspace->clear_cached_entry_point_info ();
+}
+
+/* Clear cached entry point information in the program space of EXEC_INF. */
+
+static void
+clear_cached_entry_point_info_after_exec (inferior *exec_inf,
+ inferior */* follow_inf */)
+{
+ exec_inf->pspace->clear_cached_entry_point_info ();
+}
+
/* See progspace.h. */
void
initialize_progspace ()
{
+ gdb::observers::inferior_created.attach
+ (clear_cached_entry_point_info_for_inferior, "program-space");
+ gdb::observers::inferior_exit.attach
+ (clear_cached_entry_point_info_for_inferior, "program-space");
+ gdb::observers::executable_changed.attach
+ (clear_cached_entry_point_info_for_pspace, "program-space");
+ gdb::observers::inferior_execd.attach
+ (clear_cached_entry_point_info_after_exec, "program-space");
+
add_cmd ("program-spaces", class_maintenance,
maintenance_info_program_spaces_command,
_("Info about currently known program spaces."),
diff --git a/gdb/progspace.h b/gdb/progspace.h
index be2d3f7e88c..bfe0e5ec36f 100644
--- a/gdb/progspace.h
+++ b/gdb/progspace.h
@@ -370,7 +370,11 @@ struct program_space
/* Return information about the entry point in the main executable, and
the entry point for the inferior, which might be different from the
main executable. */
- entry_point_info get_entry_point_info () const;
+ const entry_point_info &get_entry_point_info () const;
+
+ /* Clear any cached entry point information. */
+ void clear_cached_entry_point_info ()
+ { m_entry_point_info.reset (); }
/* If there is a valid and known entry point in the main executable of
this program space, return it. Otherwise return an empty optional. */
@@ -463,6 +467,9 @@ struct program_space
/* See `exec_filename`. */
gdb::unique_xmalloc_ptr<char> m_exec_filename;
+
+ /* Cached entry point information. See get_entry_point_info. */
+ mutable std::optional<entry_point_info> m_entry_point_info;
};
/* The list of all program spaces. There's always at least one. */
--
2.25.4
prev parent reply other threads:[~2026-07-20 9:54 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-08 18:14 [PATCH] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-11 19:24 ` Guinevere Larsen
2026-06-11 20:40 ` Andrew Burgess
2026-06-12 12:49 ` Guinevere Larsen
2026-06-11 21:59 ` [PATCHv2 0/3] " Andrew Burgess
2026-06-11 21:59 ` [PATCHv2 1/3] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-06-12 15:41 ` Pedro Alves
2026-06-11 21:59 ` [PATCHv2 2/3] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-06-12 6:07 ` Eli Zaretskii
2026-06-15 10:14 ` Andrew Burgess
2026-06-15 12:01 ` Eli Zaretskii
2026-06-12 15:41 ` Pedro Alves
2026-06-15 10:29 ` Andrew Burgess
2026-06-16 18:36 ` Pedro Alves
2026-06-23 9:46 ` Andrew Burgess
2026-06-23 10:20 ` Pedro Alves
2026-06-11 21:59 ` [PATCHv2 3/3] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-12 15:57 ` Pedro Alves
2026-06-16 19:47 ` [PATCHv3 0/4] " Andrew Burgess
2026-06-16 19:47 ` [PATCHv3 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-06-16 19:47 ` [PATCHv3 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-06-17 11:52 ` Eli Zaretskii
2026-06-16 19:47 ` [PATCHv3 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-16 19:47 ` [PATCHv3 4/4] gdb: cache program space entry point information Andrew Burgess
2026-06-23 10:47 ` [PATCHv4 0/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-23 10:47 ` [PATCHv4 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-06-23 10:47 ` [PATCHv4 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-06-23 10:47 ` [PATCHv4 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-23 10:47 ` [PATCHv4 4/4] gdb: cache program space entry point information Andrew Burgess
2026-06-25 15:26 ` [PATCHv5 0/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-25 15:26 ` [PATCHv5 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-06-25 15:26 ` [PATCHv5 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-06-25 15:26 ` [PATCHv5 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-06-25 15:26 ` [PATCHv5 4/4] gdb: cache program space entry point information Andrew Burgess
2026-07-10 14:24 ` [PATCHv6 0/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-10 14:24 ` [PATCHv6 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-07-10 14:24 ` [PATCHv6 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-07-10 15:39 ` Simon Marchi
2026-07-10 14:24 ` [PATCHv6 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-10 17:00 ` Simon Marchi
2026-07-10 17:01 ` Simon Marchi
2026-07-16 15:06 ` Andrew Burgess
2026-07-10 14:24 ` [PATCHv6 4/4] gdb: cache program space entry point information Andrew Burgess
2026-07-10 17:07 ` Simon Marchi
2026-07-18 13:11 ` [PATCHv7 0/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-18 13:11 ` [PATCHv7 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-07-18 13:11 ` [PATCHv7 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-07-18 13:11 ` [PATCHv7 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-18 13:11 ` [PATCHv7 4/4] gdb: cache program space entry point information Andrew Burgess
2026-07-20 9:52 ` [PATCHv8 0/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-20 9:52 ` [PATCHv8 1/4] gdb: rename program_space::entry_point_address* functions Andrew Burgess
2026-07-20 9:52 ` [PATCHv8 2/4] gdb: introduce program_space::get_entry_point_info function Andrew Burgess
2026-07-20 9:52 ` [PATCHv8 3/4] gdb: allow 'until' to work in outermost frame Andrew Burgess
2026-07-20 9:52 ` Andrew Burgess [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f885b4bd23787f67111266cfd80786c1f68f7d31.1784541057.git.aburgess@redhat.com \
--to=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox