1 //===-- ThreadPlanStepInRange.h ---------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_ThreadPlanStepInRange_h_
11 #define liblldb_ThreadPlanStepInRange_h_
15 // Other libraries and framework includes
17 #include "lldb/Core/AddressRange.h"
18 #include "lldb/Target/StackID.h"
19 #include "lldb/Target/Thread.h"
20 #include "lldb/Target/ThreadPlanStepRange.h"
21 #include "lldb/Target/ThreadPlanShouldStopHere.h"
23 namespace lldb_private {
25 class ThreadPlanStepInRange :
26 public ThreadPlanStepRange,
27 public ThreadPlanShouldStopHere
30 ThreadPlanStepInRange (Thread &thread,
31 const AddressRange &range,
32 const SymbolContext &addr_context,
33 lldb::RunMode stop_others,
34 LazyBool step_in_avoids_code_without_debug_info,
35 LazyBool step_out_avoids_code_without_debug_info);
37 ThreadPlanStepInRange (Thread &thread,
38 const AddressRange &range,
39 const SymbolContext &addr_context,
40 const char *step_into_function_name,
41 lldb::RunMode stop_others,
42 LazyBool step_in_avoids_code_without_debug_info,
43 LazyBool step_out_avoids_code_without_debug_info);
45 ~ThreadPlanStepInRange() override;
48 GetDescription(Stream *s, lldb::DescriptionLevel level) override;
51 ShouldStop(Event *event_ptr) override;
53 void SetAvoidRegexp(const char *name);
55 void SetStepInTarget (const char *target)
57 m_step_into_target.SetCString(target);
61 SetDefaultFlagValue (uint32_t new_value);
64 IsVirtualStep() override;
68 DefaultShouldStopHereCallback (ThreadPlan *current_plan, Flags &flags, lldb::FrameComparison operation, void *baton);
70 bool DoWillResume(lldb::StateType resume_state, bool current_plan) override;
73 DoPlanExplainsStop(Event *event_ptr) override;
76 SetFlagsToDefault() override
78 GetFlags().Set(ThreadPlanStepInRange::s_default_flag_values);
84 ThreadPlanShouldStopHere::ThreadPlanShouldStopHereCallbacks callbacks(ThreadPlanStepInRange::DefaultShouldStopHereCallback, nullptr);
85 SetShouldStopHereCallbacks (&callbacks, nullptr);
89 FrameMatchesAvoidCriteria ();
93 friend lldb::ThreadPlanSP
94 Thread::QueueThreadPlanForStepOverRange (bool abort_other_plans,
95 const AddressRange &range,
96 const SymbolContext &addr_context,
97 lldb::RunMode stop_others,
98 LazyBool avoid_code_without_debug_info);
99 friend lldb::ThreadPlanSP
100 Thread::QueueThreadPlanForStepInRange (bool abort_other_plans,
101 const AddressRange &range,
102 const SymbolContext &addr_context,
103 const char *step_in_target,
104 lldb::RunMode stop_others,
105 LazyBool step_in_avoids_code_without_debug_info,
106 LazyBool step_out_avoids_code_without_debug_info);
108 void SetupAvoidNoDebug(LazyBool step_in_avoids_code_without_debug_info,
109 LazyBool step_out_avoids_code_without_debug_info);
110 // Need an appropriate marker for the current stack so we can tell step out
113 static uint32_t s_default_flag_values; // These are the default flag values for the ThreadPlanStepThrough.
114 lldb::ThreadPlanSP m_sub_plan_sp; // Keep track of the last plan we were running. If it fails, we should stop.
115 std::unique_ptr<RegularExpression> m_avoid_regexp_ap;
116 bool m_step_past_prologue; // FIXME: For now hard-coded to true, we could put a switch in for this if there's
118 bool m_virtual_step; // true if we've just done a "virtual step", i.e. just moved the inline stack depth.
119 ConstString m_step_into_target;
120 DISALLOW_COPY_AND_ASSIGN (ThreadPlanStepInRange);
123 } // namespace lldb_private
125 #endif // liblldb_ThreadPlanStepInRange_h_