1 //===-- IntelPTPerThreadProcessTrace.cpp ----------------------------------===// 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 #include "IntelPTPerThreadProcessTrace.h" 10 #include <optional> 11 12 using namespace lldb; 13 using namespace lldb_private; 14 using namespace process_linux; 15 using namespace llvm; 16 17 bool IntelPTPerThreadProcessTrace::TracesThread(lldb::tid_t tid) const { 18 return m_thread_traces.TracesThread(tid); 19 } 20 21 Error IntelPTPerThreadProcessTrace::TraceStop(lldb::tid_t tid) { 22 return m_thread_traces.TraceStop(tid); 23 } 24 25 Error IntelPTPerThreadProcessTrace::TraceStart(lldb::tid_t tid) { 26 if (m_thread_traces.GetTotalBufferSize() + m_tracing_params.ipt_trace_size > 27 static_cast<size_t>(*m_tracing_params.process_buffer_size_limit)) 28 return createStringError( 29 inconvertibleErrorCode(), 30 "Thread %" PRIu64 " can't be traced as the process trace size limit " 31 "has been reached. Consider retracing with a higher " 32 "limit.", 33 tid); 34 35 return m_thread_traces.TraceStart(tid, m_tracing_params); 36 } 37 38 TraceIntelPTGetStateResponse IntelPTPerThreadProcessTrace::GetState() { 39 TraceIntelPTGetStateResponse state; 40 m_thread_traces.ForEachThread( 41 [&](lldb::tid_t tid, const IntelPTSingleBufferTrace &thread_trace) { 42 state.traced_threads.push_back( 43 {tid, 44 {{IntelPTDataKinds::kIptTrace, thread_trace.GetIptTraceSize()}}}); 45 }); 46 return state; 47 } 48 49 Expected<std::optional<std::vector<uint8_t>>> 50 IntelPTPerThreadProcessTrace::TryGetBinaryData( 51 const TraceGetBinaryDataRequest &request) { 52 return m_thread_traces.TryGetBinaryData(request); 53 } 54 55 Expected<std::unique_ptr<IntelPTPerThreadProcessTrace>> 56 IntelPTPerThreadProcessTrace::Start(const TraceIntelPTStartRequest &request, 57 ArrayRef<lldb::tid_t> current_tids) { 58 std::unique_ptr<IntelPTPerThreadProcessTrace> trace( 59 new IntelPTPerThreadProcessTrace(request)); 60 61 Error error = Error::success(); 62 for (lldb::tid_t tid : current_tids) 63 error = joinErrors(std::move(error), trace->TraceStart(tid)); 64 if (error) 65 return std::move(error); 66 return std::move(trace); 67 } 68