diff --git a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h --- a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h +++ b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h @@ -175,15 +175,6 @@ /// Get a new cursor for the decoded thread. lldb::TraceCursorUP GetCursor(); - /// Set the size in bytes of the corresponding Intel PT raw trace. - void SetRawTraceSize(size_t size); - - /// Get the size in bytes of the corresponding Intel PT raw trace. - /// - /// \return - /// The size of the trace, or \b llvm::None if not available. - llvm::Optional GetRawTraceSize() const; - /// Return the number of TSC decoding errors that happened. A TSC error /// is not a fatal error and doesn't create gaps in the trace. Instead /// we only keep track of them as a statistic. diff --git a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp --- a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp @@ -35,10 +35,6 @@ OS << "error: " << libipt_error_message; } -Optional DecodedThread::GetRawTraceSize() const { - return m_raw_trace_size; -} - size_t DecodedThread::GetInstructionsCount() const { return m_instruction_ips.size(); } @@ -178,8 +174,6 @@ AppendError(std::move(error)); } -void DecodedThread::SetRawTraceSize(size_t size) { m_raw_trace_size = size; } - lldb::TraceCursorUP DecodedThread::GetCursor() { // We insert a fake error signaling an empty trace if needed becasue the // TraceCursor requires non-empty traces. diff --git a/lldb/source/Plugins/Trace/intel-pt/LibiptDecoder.cpp b/lldb/source/Plugins/Trace/intel-pt/LibiptDecoder.cpp --- a/lldb/source/Plugins/Trace/intel-pt/LibiptDecoder.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/LibiptDecoder.cpp @@ -290,8 +290,6 @@ void lldb_private::trace_intel_pt::DecodeTrace(DecodedThread &decoded_thread, TraceIntelPT &trace_intel_pt, ArrayRef buffer) { - decoded_thread.SetRawTraceSize(buffer.size()); - Expected decoder_up = CreateInstructionDecoder(decoded_thread, trace_intel_pt, buffer); if (!decoder_up) diff --git a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h --- a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h +++ b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h @@ -73,7 +73,7 @@ void DumpTraceInfo(Thread &thread, Stream &s, bool verbose) override; - llvm::Optional GetRawTraceSize(Thread &thread); + llvm::Expected GetRawTraceSize(Thread &thread); void DoRefreshLiveProcessState( llvm::Expected state) override; diff --git a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp --- a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp @@ -106,20 +106,27 @@ } void TraceIntelPT::DumpTraceInfo(Thread &thread, Stream &s, bool verbose) { - Optional raw_size = GetRawTraceSize(thread); + lldb::tid_t tid = thread.GetID(); s.Format("\nthread #{0}: tid = {1}", thread.GetIndexID(), thread.GetID()); - if (!raw_size) { + if (!IsTraced(tid)) { s << ", not traced\n"; return; } s << "\n"; + + Expected raw_size = GetRawTraceSize(thread); + if (!raw_size) { + s.Format(" {0}\n", toString(raw_size.takeError())); + return; + } + DecodedThreadSP decoded_trace_sp = Decode(thread); size_t insn_len = decoded_trace_sp->GetInstructionsCount(); size_t mem_used = decoded_trace_sp->CalculateApproximateMemoryUsage(); s.Format(" Total number of instructions: {0}\n", insn_len); - s.PutCString("\n Memory usage:\n"); + s << "\n Memory usage:\n"; s.Format(" Raw trace size: {0} KiB\n", *raw_size / 1024); s.Format( " Total approximate memory usage (excluding raw trace): {0:2} KiB\n", @@ -129,15 +136,13 @@ "{0:2} bytes\n", (double)mem_used / insn_len); - s.PutCString("\n Timing:\n"); - GetTimer() - .ForThread(thread.GetID()) - .ForEachTimedTask( - [&](const std::string &name, std::chrono::milliseconds duration) { - s.Format(" {0}: {1:2}s\n", name, duration.count() / 1000.0); - }); + s << "\n Timing:\n"; + GetTimer().ForThread(tid).ForEachTimedTask( + [&](const std::string &name, std::chrono::milliseconds duration) { + s.Format(" {0}: {1:2}s\n", name, duration.count() / 1000.0); + }); - s.PutCString("\n Errors:\n"); + s << "\n Errors:\n"; const DecodedThread::LibiptErrors &tsc_errors = decoded_trace_sp->GetTscErrors(); s.Format(" Number of TSC decoding errors: {0}\n", tsc_errors.total_count); @@ -147,11 +152,16 @@ } } -Optional TraceIntelPT::GetRawTraceSize(Thread &thread) { - if (IsTraced(thread.GetID())) - return Decode(thread)->GetRawTraceSize(); - else - return None; +llvm::Expected TraceIntelPT::GetRawTraceSize(Thread &thread) { + size_t size; + auto callback = [&](llvm::ArrayRef data) { + size = data.size(); + return Error::success(); + }; + if (Error err = OnThreadBufferRead(thread.GetID(), callback)) + return std::move(err); + + return size; } Expected TraceIntelPT::GetCPUInfoForLiveProcess() {