1 //===-- CommandObjectTraceStartIntelPT.h ----------------------*- C++ //-*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 10 #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 11 12 #include "../../../../source/Commands/CommandObjectTrace.h" 13 #include "TraceIntelPT.h" 14 #include "lldb/Interpreter/CommandInterpreter.h" 15 #include "lldb/Interpreter/CommandReturnObject.h" 16 17 namespace lldb_private { 18 namespace trace_intel_pt { 19 20 class CommandObjectThreadTraceStartIntelPT 21 : public CommandObjectMultipleThreads { 22 public: 23 class CommandOptions : public Options { 24 public: 25 CommandOptions() : Options() { OptionParsingStarting(nullptr); } 26 27 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, 28 ExecutionContext *execution_context) override; 29 30 void OptionParsingStarting(ExecutionContext *execution_context) override; 31 32 llvm::ArrayRef<OptionDefinition> GetDefinitions() override; 33 34 size_t m_thread_buffer_size; 35 bool m_enable_tsc; 36 llvm::Optional<size_t> m_psb_period; 37 }; 38 39 CommandObjectThreadTraceStartIntelPT(TraceIntelPT &trace, 40 CommandInterpreter &interpreter) 41 : CommandObjectMultipleThreads( 42 interpreter, "thread trace start", 43 "Start tracing one or more threads with intel-pt. " 44 "Defaults to the current thread. Thread indices can be " 45 "specified as arguments.\n Use the thread-index \"all\" to trace " 46 "all threads including future threads.", 47 "thread trace start [<thread-index> <thread-index> ...] " 48 "[<intel-pt-options>]", 49 lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock | 50 lldb::eCommandProcessMustBeLaunched | 51 lldb::eCommandProcessMustBePaused), 52 m_trace(trace), m_options() {} 53 54 Options *GetOptions() override { return &m_options; } 55 56 protected: 57 bool DoExecuteOnThreads(Args &command, CommandReturnObject &result, 58 llvm::ArrayRef<lldb::tid_t> tids) override; 59 60 TraceIntelPT &m_trace; 61 CommandOptions m_options; 62 }; 63 64 class CommandObjectProcessTraceStartIntelPT : public CommandObjectParsed { 65 public: 66 class CommandOptions : public Options { 67 public: 68 CommandOptions() : Options() { OptionParsingStarting(nullptr); } 69 70 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, 71 ExecutionContext *execution_context) override; 72 73 void OptionParsingStarting(ExecutionContext *execution_context) override; 74 75 llvm::ArrayRef<OptionDefinition> GetDefinitions() override; 76 77 size_t m_thread_buffer_size; 78 size_t m_process_buffer_size_limit; 79 bool m_enable_tsc; 80 llvm::Optional<size_t> m_psb_period; 81 }; 82 83 CommandObjectProcessTraceStartIntelPT(TraceIntelPT &trace, 84 CommandInterpreter &interpreter) 85 : CommandObjectParsed( 86 interpreter, "process trace start", 87 "Start tracing this process with intel-pt, including future " 88 "threads. " 89 "This is implemented by tracing each thread independently. " 90 "Threads traced with the \"thread trace start\" command are left " 91 "unaffected ant not retraced.", 92 "process trace start [<intel-pt-options>]", 93 lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock | 94 lldb::eCommandProcessMustBeLaunched | 95 lldb::eCommandProcessMustBePaused), 96 m_trace(trace), m_options() {} 97 98 Options *GetOptions() override { return &m_options; } 99 100 protected: 101 bool DoExecute(Args &command, CommandReturnObject &result) override; 102 103 TraceIntelPT &m_trace; 104 CommandOptions m_options; 105 }; 106 107 } // namespace trace_intel_pt 108 } // namespace lldb_private 109 110 #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 111