1fb19f11eSWalter Erquinigo //===-- CommandObjectTraceStartIntelPT.h ----------------------*- C++ //-*-===// 2fb19f11eSWalter Erquinigo // 3fb19f11eSWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fb19f11eSWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information. 5fb19f11eSWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fb19f11eSWalter Erquinigo // 7fb19f11eSWalter Erquinigo //===----------------------------------------------------------------------===// 8fb19f11eSWalter Erquinigo 9fb19f11eSWalter Erquinigo #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 10fb19f11eSWalter Erquinigo #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 11fb19f11eSWalter Erquinigo 120b697561SWalter Erquinigo #include "../../../../source/Commands/CommandObjectTrace.h" 130b697561SWalter Erquinigo #include "TraceIntelPT.h" 14fb19f11eSWalter Erquinigo #include "lldb/Interpreter/CommandInterpreter.h" 15fb19f11eSWalter Erquinigo #include "lldb/Interpreter/CommandReturnObject.h" 16f190ce62SKazu Hirata #include <optional> 17fb19f11eSWalter Erquinigo 18fb19f11eSWalter Erquinigo namespace lldb_private { 19fb19f11eSWalter Erquinigo namespace trace_intel_pt { 20fb19f11eSWalter Erquinigo 210b697561SWalter Erquinigo class CommandObjectThreadTraceStartIntelPT 220b697561SWalter Erquinigo : public CommandObjectMultipleThreads { 23fb19f11eSWalter Erquinigo public: 24fb19f11eSWalter Erquinigo class CommandOptions : public Options { 25fb19f11eSWalter Erquinigo public: CommandOptions()26fb19f11eSWalter Erquinigo CommandOptions() : Options() { OptionParsingStarting(nullptr); } 27fb19f11eSWalter Erquinigo 28fb19f11eSWalter Erquinigo Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, 29fb19f11eSWalter Erquinigo ExecutionContext *execution_context) override; 30fb19f11eSWalter Erquinigo 31fb19f11eSWalter Erquinigo void OptionParsingStarting(ExecutionContext *execution_context) override; 32fb19f11eSWalter Erquinigo 33fb19f11eSWalter Erquinigo llvm::ArrayRef<OptionDefinition> GetDefinitions() override; 34fb19f11eSWalter Erquinigo 356a5355e8SWalter Erquinigo uint64_t m_ipt_trace_size; 3604195843SWalter Erquinigo bool m_enable_tsc; 372fe83274SKazu Hirata std::optional<uint64_t> m_psb_period; 38fb19f11eSWalter Erquinigo }; 39fb19f11eSWalter Erquinigo CommandObjectThreadTraceStartIntelPT(TraceIntelPT & trace,CommandInterpreter & interpreter)400b697561SWalter Erquinigo CommandObjectThreadTraceStartIntelPT(TraceIntelPT &trace, 410b697561SWalter Erquinigo CommandInterpreter &interpreter) 420b697561SWalter Erquinigo : CommandObjectMultipleThreads( 43fb19f11eSWalter Erquinigo interpreter, "thread trace start", 44fb19f11eSWalter Erquinigo "Start tracing one or more threads with intel-pt. " 45fb19f11eSWalter Erquinigo "Defaults to the current thread. Thread indices can be " 46fb19f11eSWalter Erquinigo "specified as arguments.\n Use the thread-index \"all\" to trace " 470b697561SWalter Erquinigo "all threads including future threads.", 48fb19f11eSWalter Erquinigo "thread trace start [<thread-index> <thread-index> ...] " 49fb19f11eSWalter Erquinigo "[<intel-pt-options>]", 50fb19f11eSWalter Erquinigo lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock | 51fb19f11eSWalter Erquinigo lldb::eCommandProcessMustBeLaunched | 52fb19f11eSWalter Erquinigo lldb::eCommandProcessMustBePaused), 530b697561SWalter Erquinigo m_trace(trace), m_options() {} 54fb19f11eSWalter Erquinigo GetOptions()55fb19f11eSWalter Erquinigo Options *GetOptions() override { return &m_options; } 56fb19f11eSWalter Erquinigo 57fb19f11eSWalter Erquinigo protected: 580b697561SWalter Erquinigo bool DoExecuteOnThreads(Args &command, CommandReturnObject &result, 59bf9f21a2SWalter Erquinigo llvm::ArrayRef<lldb::tid_t> tids) override; 60fb19f11eSWalter Erquinigo 610b697561SWalter Erquinigo TraceIntelPT &m_trace; 620b697561SWalter Erquinigo CommandOptions m_options; 630b697561SWalter Erquinigo }; 640b697561SWalter Erquinigo 650b697561SWalter Erquinigo class CommandObjectProcessTraceStartIntelPT : public CommandObjectParsed { 660b697561SWalter Erquinigo public: 670b697561SWalter Erquinigo class CommandOptions : public Options { 680b697561SWalter Erquinigo public: CommandOptions()690b697561SWalter Erquinigo CommandOptions() : Options() { OptionParsingStarting(nullptr); } 700b697561SWalter Erquinigo 710b697561SWalter Erquinigo Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, 720b697561SWalter Erquinigo ExecutionContext *execution_context) override; 730b697561SWalter Erquinigo 740b697561SWalter Erquinigo void OptionParsingStarting(ExecutionContext *execution_context) override; 750b697561SWalter Erquinigo 760b697561SWalter Erquinigo llvm::ArrayRef<OptionDefinition> GetDefinitions() override; 770b697561SWalter Erquinigo 786a5355e8SWalter Erquinigo uint64_t m_ipt_trace_size; 791a3f9969SWalter Erquinigo uint64_t m_process_buffer_size_limit; 8004195843SWalter Erquinigo bool m_enable_tsc; 812fe83274SKazu Hirata std::optional<uint64_t> m_psb_period; 826a5355e8SWalter Erquinigo bool m_per_cpu_tracing; 83d30fd5c3SGaurav Gaur bool m_disable_cgroup_filtering; 840b697561SWalter Erquinigo }; 850b697561SWalter Erquinigo CommandObjectProcessTraceStartIntelPT(TraceIntelPT & trace,CommandInterpreter & interpreter)860b697561SWalter Erquinigo CommandObjectProcessTraceStartIntelPT(TraceIntelPT &trace, 870b697561SWalter Erquinigo CommandInterpreter &interpreter) 880b697561SWalter Erquinigo : CommandObjectParsed( 890b697561SWalter Erquinigo interpreter, "process trace start", 900b697561SWalter Erquinigo "Start tracing this process with intel-pt, including future " 916a5355e8SWalter Erquinigo "threads. If --per-cpu-tracing is not provided, this traces each " 92b8d1776fSWalter Erquinigo "thread independently, thus using a trace buffer per thread. " 930b697561SWalter Erquinigo "Threads traced with the \"thread trace start\" command are left " 94b8d1776fSWalter Erquinigo "unaffected ant not retraced. This is the recommended option " 956a5355e8SWalter Erquinigo "unless the number of threads is huge. If --per-cpu-tracing is " 96b8d1776fSWalter Erquinigo "passed, each cpu core is traced instead of each thread, which " 97b8d1776fSWalter Erquinigo "uses a fixed number of trace buffers, but might result in less " 98b8d1776fSWalter Erquinigo "data available for less frequent threads.", 990b697561SWalter Erquinigo "process trace start [<intel-pt-options>]", 1000b697561SWalter Erquinigo lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock | 1010b697561SWalter Erquinigo lldb::eCommandProcessMustBeLaunched | 1020b697561SWalter Erquinigo lldb::eCommandProcessMustBePaused), 1030b697561SWalter Erquinigo m_trace(trace), m_options() {} 1040b697561SWalter Erquinigo GetOptions()1050b697561SWalter Erquinigo Options *GetOptions() override { return &m_options; } 1060b697561SWalter Erquinigo 1070b697561SWalter Erquinigo protected: 108*92d8a28cSPete Lawrence void DoExecute(Args &command, CommandReturnObject &result) override; 1090b697561SWalter Erquinigo 1100b697561SWalter Erquinigo TraceIntelPT &m_trace; 111fb19f11eSWalter Erquinigo CommandOptions m_options; 112fb19f11eSWalter Erquinigo }; 113fb19f11eSWalter Erquinigo 114db73a52dSrnofenko namespace ParsingUtils { 115db73a52dSrnofenko /// Convert an integral size expression like 12KiB or 4MB into bytes. The units 116db73a52dSrnofenko /// are taken loosely to help users input sizes into LLDB, e.g. KiB and KB are 117db73a52dSrnofenko /// considered the same (2^20 bytes) for simplicity. 118db73a52dSrnofenko /// 119db73a52dSrnofenko /// \param[in] size_expression 120db73a52dSrnofenko /// String expression which is an integral number plus a unit that can be 121db73a52dSrnofenko /// lower or upper case. Supported units: K, KB and KiB for 2^10 bytes; M, 122db73a52dSrnofenko /// MB and MiB for 2^20 bytes; and B for bytes. A single integral number is 123db73a52dSrnofenko /// considered bytes. 124db73a52dSrnofenko /// \return 125768cae4aSKazu Hirata /// The converted number of bytes or \a std::nullopt if the expression is 126db73a52dSrnofenko /// invalid. 1272fe83274SKazu Hirata std::optional<uint64_t> 128db73a52dSrnofenko ParseUserFriendlySizeExpression(llvm::StringRef size_expression); 129db73a52dSrnofenko } // namespace ParsingUtils 130db73a52dSrnofenko 131fb19f11eSWalter Erquinigo } // namespace trace_intel_pt 132fb19f11eSWalter Erquinigo } // namespace lldb_private 133fb19f11eSWalter Erquinigo 134fb19f11eSWalter Erquinigo #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H 135