11188faa7SWalter Erquinigo //===-- IntelPTPerThreadProcessTrace.cpp ----------------------------------===// 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 #include "IntelPTPerThreadProcessTrace.h" 101188faa7SWalter Erquinigo 111188faa7SWalter Erquinigo using namespace lldb; 121188faa7SWalter Erquinigo using namespace lldb_private; 131188faa7SWalter Erquinigo using namespace process_linux; 141188faa7SWalter Erquinigo using namespace llvm; 151188faa7SWalter Erquinigo 161188faa7SWalter Erquinigo bool IntelPTPerThreadProcessTrace::TracesThread(lldb::tid_t tid) const { 171188faa7SWalter Erquinigo return m_thread_traces.TracesThread(tid); 181188faa7SWalter Erquinigo } 191188faa7SWalter Erquinigo 201188faa7SWalter Erquinigo Error IntelPTPerThreadProcessTrace::TraceStop(lldb::tid_t tid) { 211188faa7SWalter Erquinigo return m_thread_traces.TraceStop(tid); 221188faa7SWalter Erquinigo } 231188faa7SWalter Erquinigo 241188faa7SWalter Erquinigo Error IntelPTPerThreadProcessTrace::TraceStart(lldb::tid_t tid) { 251188faa7SWalter Erquinigo if (m_thread_traces.GetTotalBufferSize() + 261188faa7SWalter Erquinigo m_tracing_params.trace_buffer_size > 271188faa7SWalter Erquinigo static_cast<size_t>(*m_tracing_params.process_buffer_size_limit)) 281188faa7SWalter Erquinigo return createStringError( 291188faa7SWalter Erquinigo inconvertibleErrorCode(), 301188faa7SWalter Erquinigo "Thread %" PRIu64 " can't be traced as the process trace size limit " 311188faa7SWalter Erquinigo "has been reached. Consider retracing with a higher " 321188faa7SWalter Erquinigo "limit.", 331188faa7SWalter Erquinigo tid); 341188faa7SWalter Erquinigo 351188faa7SWalter Erquinigo return m_thread_traces.TraceStart(tid, m_tracing_params); 361188faa7SWalter Erquinigo } 371188faa7SWalter Erquinigo 381f2d49a8SWalter Erquinigo TraceIntelPTGetStateResponse IntelPTPerThreadProcessTrace::GetState() { 391f2d49a8SWalter Erquinigo TraceIntelPTGetStateResponse state; 401f56f7fcSWalter Erquinigo m_thread_traces.ForEachThread( 411f56f7fcSWalter Erquinigo [&](lldb::tid_t tid, const IntelPTSingleBufferTrace &thread_trace) { 421f56f7fcSWalter Erquinigo state.traced_threads.push_back({tid, 431f56f7fcSWalter Erquinigo {{IntelPTDataKinds::kTraceBuffer, 441f56f7fcSWalter Erquinigo thread_trace.GetTraceBufferSize()}}}); 451f56f7fcSWalter Erquinigo }); 461f56f7fcSWalter Erquinigo return state; 471f56f7fcSWalter Erquinigo } 481f56f7fcSWalter Erquinigo 49fc5ef57cSWalter Erquinigo Expected<llvm::Optional<std::vector<uint8_t>>> 50fc5ef57cSWalter Erquinigo IntelPTPerThreadProcessTrace::TryGetBinaryData( 511f56f7fcSWalter Erquinigo const TraceGetBinaryDataRequest &request) { 52fc5ef57cSWalter Erquinigo return m_thread_traces.TryGetBinaryData(request); 531f56f7fcSWalter Erquinigo } 541f56f7fcSWalter Erquinigo 55*03cc58ffSWalter Erquinigo Expected<std::unique_ptr<IntelPTPerThreadProcessTrace>> 561f56f7fcSWalter Erquinigo IntelPTPerThreadProcessTrace::Start(const TraceIntelPTStartRequest &request, 571f56f7fcSWalter Erquinigo ArrayRef<lldb::tid_t> current_tids) { 58*03cc58ffSWalter Erquinigo std::unique_ptr<IntelPTPerThreadProcessTrace> trace( 59*03cc58ffSWalter Erquinigo new IntelPTPerThreadProcessTrace(request)); 601f56f7fcSWalter Erquinigo 611f56f7fcSWalter Erquinigo Error error = Error::success(); 621f56f7fcSWalter Erquinigo for (lldb::tid_t tid : current_tids) 631f56f7fcSWalter Erquinigo error = joinErrors(std::move(error), trace->TraceStart(tid)); 641f56f7fcSWalter Erquinigo if (error) 651f56f7fcSWalter Erquinigo return std::move(error); 661f56f7fcSWalter Erquinigo return trace; 671188faa7SWalter Erquinigo } 68