public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/solib-svr4: don't disable probes interface if probe not found
@ 2023-02-02 15:08 Simon Marchi
  0 siblings, 0 replies; only message in thread
From: Simon Marchi @ 2023-02-02 15:08 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=17467c103073ae0ec7bc43ffa35cb488cd2a97ed

commit 17467c103073ae0ec7bc43ffa35cb488cd2a97ed
Author: Simon Marchi <simon.marchi@efficios.com>
Date:   Tue Nov 22 13:18:43 2022 -0500

    gdb/solib-svr4: don't disable probes interface if probe not found
    
    In ROCm-GDB, we install an solib provider for the GPU code objects on
    top of the svr4 provider for the host, in order to add solibs
    representing the GPU code objects to the solib list containing the host
    process' shared libraries.  We override the target_so_ops::handle_event
    function pointer with our own, in which we call svr4_so_ops.handle_event
    (which contains svr4_handle_solib_event) manually.  When the host
    (un)loads a library, the ROCm part of handle_event is a no-op.  When the
    GPU (un)loads a code object, we want the host side (svr4) to be a no-op.
    
    The problem is that when handle_event is called because of a GPU event,
    svr4_handle_solib_event gets called while not stopped at an svr4
    probe.  It then assumes this means there's a problem with the probes
    interface and disables it through the following sequence of events:
    
      - solib_event_probe_at return nullptr
      - svr4_handle_solib_event returns early
      - the make_scope_exit callback calls disable_probes_interface
    
    We could fix that by making the ROCm handle_event callback check if an
    svr4 probe is that the stop address, and only call
    svr4_so_ops.handle_event if so.  However, it doesn't feel right to
    include some svr4 implementation detail in the ROCm event handler.
    
    Instead, this patch changes svr4_handle_solib_event to not assume it is
    an error if called while not at an svr4 probe location, and therefore
    not disable the probes interface.  That just means moving the
    make_scope_exit call below where we lookup the probe by pc.
    
    Change-Id: Ie8ddf5beffa2e92b8ebfdd016454546252519244
    Co-Authored-By: Lancelot SIX <lancelot.six@amd.com>

Diff:
---
 gdb/solib-svr4.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index fe009a1581d..33577b7ddd2 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1977,6 +1977,16 @@ svr4_handle_solib_event (void)
   if (info->probes_table == NULL)
     return;
 
+  pc = regcache_read_pc (get_current_regcache ());
+  pa = solib_event_probe_at (info, pc);
+  if (pa == nullptr)
+    {
+      /* When some solib ops sits above us, it can respond to a solib event
+	 by calling in here.  This is done assuming that if the current event
+	 is not an SVR4 solib event, calling here should be a no-op.  */
+      return;
+    }
+
   /* If anything goes wrong we revert to the original linker
      interface.  */
   auto cleanup = make_scope_exit ([info] ()
@@ -1984,11 +1994,6 @@ svr4_handle_solib_event (void)
       disable_probes_interface (info);
     });
 
-  pc = regcache_read_pc (get_current_regcache ());
-  pa = solib_event_probe_at (info, pc);
-  if (pa == NULL)
-    return;
-
   action = solib_event_probe_action (pa);
   if (action == PROBES_INTERFACE_FAILED)
     return;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-02 15:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-02 15:08 [binutils-gdb] gdb/solib-svr4: don't disable probes interface if probe not found Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).