11188faa7SWalter Erquinigo //===-- IntelPTPerThreadProcessTrace.h ------------------------ -*- C++ -*-===//
21188faa7SWalter Erquinigo //
31188faa7SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41188faa7SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information.
51188faa7SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61188faa7SWalter Erquinigo //
71188faa7SWalter Erquinigo //===----------------------------------------------------------------------===//
81188faa7SWalter Erquinigo 
91188faa7SWalter Erquinigo #ifndef liblldb_IntelPTPerThreadProcessTrace_H_
101188faa7SWalter Erquinigo #define liblldb_IntelPTPerThreadProcessTrace_H_
111188faa7SWalter Erquinigo 
121f56f7fcSWalter Erquinigo #include "IntelPTProcessTrace.h"
131188faa7SWalter Erquinigo #include "IntelPTSingleBufferTrace.h"
141188faa7SWalter Erquinigo #include "IntelPTThreadTraceCollection.h"
151188faa7SWalter Erquinigo 
161188faa7SWalter Erquinigo namespace lldb_private {
171188faa7SWalter Erquinigo namespace process_linux {
181188faa7SWalter Erquinigo 
191188faa7SWalter Erquinigo /// Manages a "process trace" instance by tracing each thread individually.
201f56f7fcSWalter Erquinigo class IntelPTPerThreadProcessTrace : public IntelPTProcessTrace {
211188faa7SWalter Erquinigo public:
221188faa7SWalter Erquinigo   /// Start tracing the current process by tracing each of its tids
231188faa7SWalter Erquinigo   /// individually.
241188faa7SWalter Erquinigo   ///
251188faa7SWalter Erquinigo   /// \param[in] request
261188faa7SWalter Erquinigo   ///   Intel PT configuration parameters.
271188faa7SWalter Erquinigo   ///
281188faa7SWalter Erquinigo   /// \param[in] current_tids
291188faa7SWalter Erquinigo   ///   List of tids currently alive. In the future, whenever a new thread is
301188faa7SWalter Erquinigo   ///   spawned, they should be traced by calling the \a TraceStart(tid) method.
311188faa7SWalter Erquinigo   ///
321188faa7SWalter Erquinigo   /// \return
331188faa7SWalter Erquinigo   ///   An \a IntelPTMultiCoreTrace instance if tracing was successful, or
341188faa7SWalter Erquinigo   ///   an \a llvm::Error otherwise.
35*03cc58ffSWalter Erquinigo   static llvm::Expected<std::unique_ptr<IntelPTPerThreadProcessTrace>>
361188faa7SWalter Erquinigo   Start(const TraceIntelPTStartRequest &request,
371188faa7SWalter Erquinigo         llvm::ArrayRef<lldb::tid_t> current_tids);
381188faa7SWalter Erquinigo 
391f56f7fcSWalter Erquinigo   bool TracesThread(lldb::tid_t tid) const override;
401188faa7SWalter Erquinigo 
411f56f7fcSWalter Erquinigo   llvm::Error TraceStart(lldb::tid_t tid) override;
421188faa7SWalter Erquinigo 
431f56f7fcSWalter Erquinigo   llvm::Error TraceStop(lldb::tid_t tid) override;
441188faa7SWalter Erquinigo 
451f2d49a8SWalter Erquinigo   TraceIntelPTGetStateResponse GetState() override;
461f56f7fcSWalter Erquinigo 
47fc5ef57cSWalter Erquinigo   llvm::Expected<llvm::Optional<std::vector<uint8_t>>>
48fc5ef57cSWalter Erquinigo   TryGetBinaryData(const TraceGetBinaryDataRequest &request) override;
491188faa7SWalter Erquinigo 
501188faa7SWalter Erquinigo private:
IntelPTPerThreadProcessTrace(const TraceIntelPTStartRequest & request)511188faa7SWalter Erquinigo   IntelPTPerThreadProcessTrace(const TraceIntelPTStartRequest &request)
521188faa7SWalter Erquinigo       : m_tracing_params(request) {}
531188faa7SWalter Erquinigo 
541188faa7SWalter Erquinigo   IntelPTThreadTraceCollection m_thread_traces;
551188faa7SWalter Erquinigo   /// Params used to trace threads when the user started "process tracing".
561188faa7SWalter Erquinigo   TraceIntelPTStartRequest m_tracing_params;
571188faa7SWalter Erquinigo };
581188faa7SWalter Erquinigo 
591188faa7SWalter Erquinigo } // namespace process_linux
601188faa7SWalter Erquinigo } // namespace lldb_private
611188faa7SWalter Erquinigo 
621188faa7SWalter Erquinigo #endif // liblldb_IntelPTPerThreadProcessTrace_H_
63