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) { 25*6a5355e8SWalter Erquinigo if (m_thread_traces.GetTotalBufferSize() + m_tracing_params.ipt_trace_size > 261188faa7SWalter Erquinigo static_cast<size_t>(*m_tracing_params.process_buffer_size_limit)) 271188faa7SWalter Erquinigo return createStringError( 281188faa7SWalter Erquinigo inconvertibleErrorCode(), 291188faa7SWalter Erquinigo "Thread %" PRIu64 " can't be traced as the process trace size limit " 301188faa7SWalter Erquinigo "has been reached. Consider retracing with a higher " 311188faa7SWalter Erquinigo "limit.", 321188faa7SWalter Erquinigo tid); 331188faa7SWalter Erquinigo 341188faa7SWalter Erquinigo return m_thread_traces.TraceStart(tid, m_tracing_params); 351188faa7SWalter Erquinigo } 361188faa7SWalter Erquinigo 371f2d49a8SWalter Erquinigo TraceIntelPTGetStateResponse IntelPTPerThreadProcessTrace::GetState() { 381f2d49a8SWalter Erquinigo TraceIntelPTGetStateResponse state; 391f56f7fcSWalter Erquinigo m_thread_traces.ForEachThread( 401f56f7fcSWalter Erquinigo [&](lldb::tid_t tid, const IntelPTSingleBufferTrace &thread_trace) { 41*6a5355e8SWalter Erquinigo state.traced_threads.push_back( 42*6a5355e8SWalter Erquinigo {tid, 43*6a5355e8SWalter Erquinigo {{IntelPTDataKinds::kIptTrace, thread_trace.GetIptTraceSize()}}}); 441f56f7fcSWalter Erquinigo }); 451f56f7fcSWalter Erquinigo return state; 461f56f7fcSWalter Erquinigo } 471f56f7fcSWalter Erquinigo 48fc5ef57cSWalter Erquinigo Expected<llvm::Optional<std::vector<uint8_t>>> 49fc5ef57cSWalter Erquinigo IntelPTPerThreadProcessTrace::TryGetBinaryData( 501f56f7fcSWalter Erquinigo const TraceGetBinaryDataRequest &request) { 51fc5ef57cSWalter Erquinigo return m_thread_traces.TryGetBinaryData(request); 521f56f7fcSWalter Erquinigo } 531f56f7fcSWalter Erquinigo 5403cc58ffSWalter Erquinigo Expected<std::unique_ptr<IntelPTPerThreadProcessTrace>> 551f56f7fcSWalter Erquinigo IntelPTPerThreadProcessTrace::Start(const TraceIntelPTStartRequest &request, 561f56f7fcSWalter Erquinigo ArrayRef<lldb::tid_t> current_tids) { 5703cc58ffSWalter Erquinigo std::unique_ptr<IntelPTPerThreadProcessTrace> trace( 5803cc58ffSWalter Erquinigo new IntelPTPerThreadProcessTrace(request)); 591f56f7fcSWalter Erquinigo 601f56f7fcSWalter Erquinigo Error error = Error::success(); 611f56f7fcSWalter Erquinigo for (lldb::tid_t tid : current_tids) 621f56f7fcSWalter Erquinigo error = joinErrors(std::move(error), trace->TraceStart(tid)); 631f56f7fcSWalter Erquinigo if (error) 641f56f7fcSWalter Erquinigo return std::move(error); 651f56f7fcSWalter Erquinigo return trace; 661188faa7SWalter Erquinigo } 67