1 //===-- ThreadPlanTracer.h --------------------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #ifndef liblldb_ThreadPlanTracer_h_
12 #define liblldb_ThreadPlanTracer_h_
13 
14 #include "lldb/Symbol/TaggedASTType.h"
15 #include "lldb/Target/Thread.h"
16 #include "lldb/Utility/RegisterValue.h"
17 #include "lldb/lldb-private.h"
18 
19 namespace lldb_private {
20 
21 class ThreadPlanTracer {
22   friend class ThreadPlan;
23 
24 public:
25   typedef enum ThreadPlanTracerStyle {
26     eLocation = 0,
27     eStateChange,
28     eCheckFrames,
29     ePython
30   } ThreadPlanTracerStyle;
31 
32   ThreadPlanTracer(Thread &thread, lldb::StreamSP &stream_sp);
33   ThreadPlanTracer(Thread &thread);
34 
35   virtual ~ThreadPlanTracer() = default;
36 
TracingStarted()37   virtual void TracingStarted() {}
38 
TracingEnded()39   virtual void TracingEnded() {}
40 
EnableTracing(bool value)41   bool EnableTracing(bool value) {
42     bool old_value = m_enabled;
43     m_enabled = value;
44     if (old_value == false && value == true)
45       TracingStarted();
46     else if (old_value == true && value == false)
47       TracingEnded();
48 
49     return old_value;
50   }
51 
TracingEnabled()52   bool TracingEnabled() { return m_enabled; }
53 
EnableSingleStep(bool value)54   bool EnableSingleStep(bool value) {
55     bool old_value = m_single_step;
56     m_single_step = value;
57     return old_value;
58   }
59 
SingleStepEnabled()60   bool SingleStepEnabled() { return m_single_step; }
61 
62 protected:
63   Thread &m_thread;
64 
65   Stream *GetLogStream();
66 
67   virtual void Log();
68 
69 private:
70   bool TracerExplainsStop();
71 
72   bool m_single_step;
73   bool m_enabled;
74   lldb::StreamSP m_stream_sp;
75 };
76 
77 class ThreadPlanAssemblyTracer : public ThreadPlanTracer {
78 public:
79   ThreadPlanAssemblyTracer(Thread &thread, lldb::StreamSP &stream_sp);
80   ThreadPlanAssemblyTracer(Thread &thread);
81   ~ThreadPlanAssemblyTracer() override;
82 
83   void TracingStarted() override;
84   void TracingEnded() override;
85   void Log() override;
86 
87 private:
88   Disassembler *GetDisassembler();
89 
90   TypeFromUser GetIntPointerType();
91 
92   lldb::DisassemblerSP m_disassembler_sp;
93   TypeFromUser m_intptr_type;
94   std::vector<RegisterValue> m_register_values;
95   lldb::DataBufferSP m_buffer_sp;
96 };
97 
98 } // namespace lldb_private
99 
100 #endif // liblldb_ThreadPlanTracer_h_
101