1 //===-- ThreadPlanShouldStopHere.h ------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef liblldb_ThreadPlanShouldStopHere_h_
10 #define liblldb_ThreadPlanShouldStopHere_h_
12 #include "lldb/Target/ThreadPlan.h"
14 namespace lldb_private {
16 // This is an interface that ThreadPlans can adopt to allow flexible
17 // modifications of the behavior when a thread plan comes to a place where it
18 // would ordinarily stop. If such modification makes sense for your plan,
19 // inherit from this class, and when you would be about to stop (in your
20 // ShouldStop method), call InvokeShouldStopHereCallback, passing in the frame
21 // comparison between where the step operation started and where you arrived.
22 // If it returns true, then QueueStepOutFromHere will queue the plan to execute
23 // instead of stopping.
25 // The classic example of the use of this is ThreadPlanStepInRange not stopping
26 // in frames that have no debug information.
28 // This class also defines a set of flags to control general aspects of this
29 // "ShouldStop" behavior.
30 // A class implementing this protocol needs to define a default set of flags,
31 // and can provide access to
32 // changing that default flag set if it wishes.
34 class ThreadPlanShouldStopHere {
36 struct ThreadPlanShouldStopHereCallbacks {
37 ThreadPlanShouldStopHereCallbacks() {
38 should_stop_here_callback = nullptr;
39 step_from_here_callback = nullptr;
42 ThreadPlanShouldStopHereCallbacks(
43 ThreadPlanShouldStopHereCallback should_stop,
44 ThreadPlanStepFromHereCallback step_from_here) {
45 should_stop_here_callback = should_stop;
46 step_from_here_callback = step_from_here;
50 should_stop_here_callback = nullptr;
51 step_from_here_callback = nullptr;
54 ThreadPlanShouldStopHereCallback should_stop_here_callback;
55 ThreadPlanStepFromHereCallback step_from_here_callback;
60 eAvoidInlines = (1 << 0),
61 eStepInAvoidNoDebug = (1 << 1),
62 eStepOutAvoidNoDebug = (1 << 2)
65 // Constructors and Destructors
66 ThreadPlanShouldStopHere(ThreadPlan *owner);
68 ThreadPlanShouldStopHere(ThreadPlan *owner,
69 const ThreadPlanShouldStopHereCallbacks *callbacks,
70 void *baton = nullptr);
71 virtual ~ThreadPlanShouldStopHere();
73 // Set the ShouldStopHere callbacks. Pass in null to clear them and have no
74 // special behavior (though you can also call ClearShouldStopHereCallbacks
75 // for that purpose. If you pass in a valid pointer, it will adopt the non-
76 // null fields, and any null fields will be set to the default values.
79 SetShouldStopHereCallbacks(const ThreadPlanShouldStopHereCallbacks *callbacks,
82 m_callbacks = *callbacks;
83 if (!m_callbacks.should_stop_here_callback)
84 m_callbacks.should_stop_here_callback =
85 ThreadPlanShouldStopHere::DefaultShouldStopHereCallback;
86 if (!m_callbacks.step_from_here_callback)
87 m_callbacks.step_from_here_callback =
88 ThreadPlanShouldStopHere::DefaultStepFromHereCallback;
90 ClearShouldStopHereCallbacks();
95 void ClearShouldStopHereCallbacks() { m_callbacks.Clear(); }
97 bool InvokeShouldStopHereCallback(lldb::FrameComparison operation,
101 CheckShouldStopHereAndQueueStepOut(lldb::FrameComparison operation,
104 lldb_private::Flags &GetFlags() { return m_flags; }
106 const lldb_private::Flags &GetFlags() const { return m_flags; }
109 static bool DefaultShouldStopHereCallback(ThreadPlan *current_plan,
111 lldb::FrameComparison operation,
112 Status &status, void *baton);
114 static lldb::ThreadPlanSP
115 DefaultStepFromHereCallback(ThreadPlan *current_plan, Flags &flags,
116 lldb::FrameComparison operation, Status &status,
119 virtual lldb::ThreadPlanSP
120 QueueStepOutFromHerePlan(Flags &flags, lldb::FrameComparison operation,
123 // Implement this, and call it in the plan's constructor to set the default
125 virtual void SetFlagsToDefault() = 0;
127 ThreadPlanShouldStopHereCallbacks m_callbacks;
130 lldb_private::Flags m_flags;
133 DISALLOW_COPY_AND_ASSIGN(ThreadPlanShouldStopHere);
136 } // namespace lldb_private
138 #endif // liblldb_ThreadPlanShouldStopHere_h_