//===-- ThreadPlanTracer.h --------------------------------------------*- C++ //-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_TARGET_THREADPLANTRACER_H #define LLDB_TARGET_THREADPLANTRACER_H #include "lldb/Symbol/TaggedASTType.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/RegisterValue.h" #include "lldb/lldb-private.h" namespace lldb_private { class ThreadPlanTracer { friend class ThreadPlan; public: enum ThreadPlanTracerStyle { eLocation = 0, eStateChange, eCheckFrames, ePython }; ThreadPlanTracer(Thread &thread, lldb::StreamSP &stream_sp); ThreadPlanTracer(Thread &thread); virtual ~ThreadPlanTracer() = default; virtual void TracingStarted() {} virtual void TracingEnded() {} bool EnableTracing(bool value) { bool old_value = m_enabled; m_enabled = value; if (old_value == false && value == true) TracingStarted(); else if (old_value == true && value == false) TracingEnded(); return old_value; } bool TracingEnabled() { return m_enabled; } Thread &GetThread(); protected: Process &m_process; lldb::tid_t m_tid; Stream *GetLogStream(); virtual void Log(); private: bool TracerExplainsStop(); bool m_enabled; lldb::StreamSP m_stream_sp; Thread *m_thread; }; class ThreadPlanAssemblyTracer : public ThreadPlanTracer { public: ThreadPlanAssemblyTracer(Thread &thread, lldb::StreamSP &stream_sp); ThreadPlanAssemblyTracer(Thread &thread); ~ThreadPlanAssemblyTracer() override; void TracingStarted() override; void TracingEnded() override; void Log() override; private: Disassembler *GetDisassembler(); TypeFromUser GetIntPointerType(); lldb::DisassemblerSP m_disassembler_sp; TypeFromUser m_intptr_type; std::vector m_register_values; lldb::DataBufferSP m_buffer_sp; }; } // namespace lldb_private #endif // LLDB_TARGET_THREADPLANTRACER_H