wallace created this revision.
wallace added reviewers: jj10306, persona0220.
Herald added a project: All.
wallace requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
This metric was missing. We were only measuring in per-thread mode, and
this completes the work.
For a sample trace I have, the `dump info` command shows
Timing for this thread:
Decoding instructions: 0.12s
I also improved a bit the TaskTime function so that callers don't need to
specify the template argument
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D129249
Files:
lldb/source/Plugins/Trace/intel-pt/TaskTimer.h
lldb/source/Plugins/Trace/intel-pt/ThreadDecoder.cpp
lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp
lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h
lldb/source/Plugins/Trace/intel-pt/TraceIntelPTMultiCpuDecoder.cpp
Index: lldb/source/Plugins/Trace/intel-pt/TraceIntelPTMultiCpuDecoder.cpp
===================================================================
--- lldb/source/Plugins/Trace/intel-pt/TraceIntelPTMultiCpuDecoder.cpp
+++ lldb/source/Plugins/Trace/intel-pt/TraceIntelPTMultiCpuDecoder.cpp
@@ -39,30 +39,35 @@
if (Error err = CorrelateContextSwitchesAndIntelPtTraces())
return std::move(err);
- auto it = m_decoded_threads.find(thread.GetID());
- if (it != m_decoded_threads.end())
- return it->second;
-
- DecodedThreadSP decoded_thread_sp =
- std::make_shared<DecodedThread>(thread.shared_from_this());
-
TraceIntelPTSP trace_sp = GetTrace();
- Error err = trace_sp->OnAllCpusBinaryDataRead(
- IntelPTDataKinds::kIptTrace,
- [&](const DenseMap<cpu_id_t, ArrayRef<uint8_t>> &buffers) -> Error {
- auto it = m_continuous_executions_per_thread->find(thread.GetID());
- if (it != m_continuous_executions_per_thread->end())
- return DecodeSystemWideTraceForThread(*decoded_thread_sp, *trace_sp,
- buffers, it->second);
-
- return Error::success();
+ return trace_sp
+ ->GetThreadTimer(thread.GetID())
+ .TimeTask("Decoding instructions", [&]() -> Expected<DecodedThreadSP> {
+ auto it = m_decoded_threads.find(thread.GetID());
+ if (it != m_decoded_threads.end())
+ return it->second;
+
+ DecodedThreadSP decoded_thread_sp =
+ std::make_shared<DecodedThread>(thread.shared_from_this());
+
+ Error err = trace_sp->OnAllCpusBinaryDataRead(
+ IntelPTDataKinds::kIptTrace,
+ [&](const DenseMap<cpu_id_t, ArrayRef<uint8_t>> &buffers) -> Error {
+ auto it =
+ m_continuous_executions_per_thread->find(thread.GetID());
+ if (it != m_continuous_executions_per_thread->end())
+ return DecodeSystemWideTraceForThread(
+ *decoded_thread_sp, *trace_sp, buffers, it->second);
+
+ return Error::success();
+ });
+ if (err)
+ return std::move(err);
+
+ m_decoded_threads.try_emplace(thread.GetID(), decoded_thread_sp);
+ return decoded_thread_sp;
});
- if (err)
- return std::move(err);
-
- m_decoded_threads.try_emplace(thread.GetID(), decoded_thread_sp);
- return decoded_thread_sp;
}
static Expected<std::vector<IntelPTThreadSubtrace>>
@@ -153,7 +158,7 @@
if (m_continuous_executions_per_thread)
return Error::success();
- Error err = GetTrace()->GetTimer().ForGlobal().TimeTask<Error>(
+ Error err = GetTrace()->GetGlobalTimer().TimeTask(
"Context switch and Intel PT traces correlation", [&]() -> Error {
if (auto correlation = DoCorrelateContextSwitchesAndIntelPtTraces()) {
m_continuous_executions_per_thread.emplace(std::move(*correlation));
Index: lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h
===================================================================
--- lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h
+++ lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.h
@@ -157,6 +157,14 @@
/// The timer object for this trace.
TaskTimer &GetTimer();
+ /// \return
+ /// The ScopedTaskTimer object for the given thread in this trace.
+ ScopedTaskTimer &GetThreadTimer(lldb::tid_t tid);
+
+ /// \return
+ /// The global copedTaskTimer object for this trace.
+ ScopedTaskTimer &GetGlobalTimer();
+
TraceIntelPTSP GetSharedPtr();
private:
Index: lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp
===================================================================
--- lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp
+++ lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp
@@ -199,10 +199,10 @@
std::chrono::milliseconds duration) {
s.Format(" {0}: {1:2}s\n", name, duration.count() / 1000.0);
};
- GetTimer().ForThread(tid).ForEachTimedTask(print_duration);
+ GetThreadTimer(tid).ForEachTimedTask(print_duration);
s << "\n Timing for global tasks:\n";
- GetTimer().ForGlobal().ForEachTimedTask(print_duration);
+ GetGlobalTimer().ForEachTimedTask(print_duration);
}
// Instruction events stats
@@ -494,3 +494,11 @@
}
TaskTimer &TraceIntelPT::GetTimer() { return GetUpdatedStorage().task_timer; }
+
+ScopedTaskTimer &TraceIntelPT::GetThreadTimer(lldb::tid_t tid) {
+ return GetTimer().ForThread(tid);
+}
+
+ScopedTaskTimer &TraceIntelPT::GetGlobalTimer() {
+ return GetTimer().ForGlobal();
+}
Index: lldb/source/Plugins/Trace/intel-pt/ThreadDecoder.cpp
===================================================================
--- lldb/source/Plugins/Trace/intel-pt/ThreadDecoder.cpp
+++ lldb/source/Plugins/Trace/intel-pt/ThreadDecoder.cpp
@@ -35,9 +35,8 @@
}
llvm::Expected<DecodedThreadSP> ThreadDecoder::DoDecode() {
- return m_trace.GetTimer()
- .ForThread(m_thread_sp->GetID())
- .TimeTask<Expected<DecodedThreadSP>>(
+ return m_trace.GetThreadTimer(m_thread_sp->GetID())
+ .TimeTask(
"Decoding instructions", [&]() -> Expected<DecodedThreadSP> {
DecodedThreadSP decoded_thread_sp =
std::make_shared<DecodedThread>(m_thread_sp);
Index: lldb/source/Plugins/Trace/intel-pt/TaskTimer.h
===================================================================
--- lldb/source/Plugins/Trace/intel-pt/TaskTimer.h
+++ lldb/source/Plugins/Trace/intel-pt/TaskTimer.h
@@ -35,9 +35,9 @@
///
/// \return
/// The return value of the task.
- template <class R> R TimeTask(llvm::StringRef name, std::function<R()> task) {
+ template <typename C> auto TimeTask(llvm::StringRef name, C task) {
auto start = std::chrono::steady_clock::now();
- R result = task();
+ auto result = task();
auto end = std::chrono::steady_clock::now();
std::chrono::milliseconds duration =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits