Conditionally restore displaced stepping state after fork.
authorJohn Baldwin <jhb@FreeBSD.org>
Tue, 1 Jun 2021 21:22:20 +0000 (14:22 -0700)
committerJohn Baldwin <jhb@FreeBSD.org>
Tue, 1 Jun 2021 21:22:20 +0000 (14:22 -0700)
There is no default method for
gdbarch_displaced_step_restore_all_in_ptid, so calling it
unconditionally for fork events triggered an assertion failure on
platforms that do not support displaced stepping.  To fix, only invoke
the method if the gdbarch supports displaced stepping.

Note that not all gdbarches support both displaced stepping and fork
events, so gdbarch validation does not require
gdbarch_displaced_step_restore_all_in_ptid for any gdbarch supporting
displaced stepping.  However, the internal assertion in
gdbarch_displaced_step_restore_all_in_ptid should catch any gdbarches
which do support both but fail to provide this method.

gdb/ChangeLog:

* infrun.c (handle_inferior_event): Only call
gdbarch_displaced_step_restore_all_in_ptid if
gdbarch_supports_displaced_stepping is true.

gdb/ChangeLog
gdb/infrun.c

index 1ca03b4e17a5d4ba39be8fabc4ae8cf7ac22cb53..6e5e88f923175c45a87f0bec553cd2e5a57fb8c3 100644 (file)
@@ -1,3 +1,9 @@
+2021-06-01  John Baldwin  <jhb@FreeBSD.org>
+
+       * infrun.c (handle_inferior_event): Only call
+       gdbarch_displaced_step_restore_all_in_ptid if
+       gdbarch_supports_displaced_stepping is true.
+
 2021-06-01  Tom Tromey  <tromey@adacore.com>
 
        * Makefile.in (all-data-directory): Remove.
index e9624d2a9b6e55c5ebd418e0800aa8a03a61c31f..488bcc1e10bcf3e9fd3e27e098561097766b592f 100644 (file)
@@ -5493,10 +5493,18 @@ handle_inferior_event (struct execution_control_state *ecs)
        struct gdbarch *gdbarch = regcache->arch ();
        inferior *parent_inf = find_inferior_ptid (ecs->target, ecs->ptid);
 
-       /* If this is a fork (child gets its own address space copy) and some
-          displaced step buffers were in use at the time of the fork, restore
-          the displaced step buffer bytes in the child process.  */
-       if (ecs->ws.kind == TARGET_WAITKIND_FORKED)
+       /* If this is a fork (child gets its own address space copy)
+          and some displaced step buffers were in use at the time of
+          the fork, restore the displaced step buffer bytes in the
+          child process.
+
+          Architectures which support displaced stepping and fork
+          events must supply an implementation of
+          gdbarch_displaced_step_restore_all_in_ptid.  This is not
+          enforced during gdbarch validation to support architectures
+          which support displaced stepping but not forks.  */
+       if (ecs->ws.kind == TARGET_WAITKIND_FORKED
+           && gdbarch_supports_displaced_stepping (gdbarch))
          gdbarch_displaced_step_restore_all_in_ptid
            (gdbarch, parent_inf, ecs->ws.value.related_pid);