1 //===-- TraceIntelPTMultiCpuDecoder.h ---------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTMULTICPUDECODER_H
10 #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTMULTICPUDECODER_H
12 #include "LibiptDecoder.h"
13 #include "PerfContextSwitchDecoder.h"
14 #include "ThreadDecoder.h"
15 #include "forward-declarations.h"
18 namespace lldb_private
{
19 namespace trace_intel_pt
{
21 /// Class used to decode a multi-cpu Intel PT trace. It assumes that each
22 /// thread could have potentially been executed on different cpu cores. It uses
23 /// a context switch trace per CPU with timestamps to identify which thread owns
24 /// each Intel PT decoded instruction and in which order. It also assumes that
25 /// the Intel PT data and context switches might have gaps in their traces due
26 /// to contention or race conditions. Finally, it assumes that a tid is not
27 /// repeated twice for two different threads because of the shortness of the
30 /// This object should be recreated after every stop in the case of live
32 class TraceIntelPTMultiCpuDecoder
{
34 /// \param[in] TraceIntelPT
35 /// The trace object to be decoded
36 TraceIntelPTMultiCpuDecoder(TraceIntelPTSP trace_sp
);
39 /// A \a DecodedThread for the \p thread by decoding its instructions on all
40 /// CPUs, sorted by TSCs. An \a llvm::Error is returned if the decoder
41 /// couldn't be properly set up.
42 llvm::Expected
<DecodedThreadSP
> Decode(Thread
&thread
);
45 /// \b true if the given \p tid is managed by this decoder, regardless of
46 /// whether there's tracing data associated to it or not.
47 bool TracesThread(lldb::tid_t tid
) const;
50 /// The number of continuous executions found for the given \p tid.
51 size_t GetNumContinuousExecutionsForThread(lldb::tid_t tid
) const;
54 /// The number of PSB blocks for a given thread in all cores.
55 size_t GePSBBlocksCountForThread(lldb::tid_t tid
) const;
58 /// The total number of continuous executions found across CPUs.
59 size_t GetTotalContinuousExecutionsCount() const;
62 /// The number of psb blocks in all cores that couldn't be matched with a
63 /// thread execution coming from context switch traces.
64 size_t GetUnattributedPSBBlocksCount() const;
67 /// The total number of PSB blocks in all cores.
68 size_t GetTotalPSBBlocksCount() const;
71 /// The lowest TSC value in this trace if available, \a std::nullopt if
72 /// the trace is empty or the trace contains no timing information, or an
73 /// \a llvm::Error if it was not possible to set up the decoder.
74 llvm::Expected
<std::optional
<uint64_t>> FindLowestTSC();
77 /// Traverse the context switch traces and the basic intel pt continuous
78 /// subtraces and produce a list of continuous executions for each process and
81 /// See \a DoCorrelateContextSwitchesAndIntelPtTraces.
83 /// Any errors are stored in \a m_setup_error.
84 llvm::Error
CorrelateContextSwitchesAndIntelPtTraces();
86 /// Produce a mapping from thread ids to the list of continuos executions with
87 /// their associated intel pt subtraces.
89 llvm::DenseMap
<lldb::tid_t
, std::vector
<IntelPTThreadContinousExecution
>>>
90 DoCorrelateContextSwitchesAndIntelPtTraces();
92 TraceIntelPTSP
GetTrace();
94 std::weak_ptr
<TraceIntelPT
> m_trace_wp
;
95 std::set
<lldb::tid_t
> m_tids
;
97 llvm::DenseMap
<lldb::tid_t
, std::vector
<IntelPTThreadContinousExecution
>>>
98 m_continuous_executions_per_thread
;
99 llvm::DenseMap
<lldb::tid_t
, DecodedThreadSP
> m_decoded_threads
;
100 /// This variable will not be std::nullopt if a severe error happened during
101 /// the setup of the decoder and we don't want decoding to be reattempted.
102 std::optional
<std::string
> m_setup_error
;
103 uint64_t m_unattributed_psb_blocks
= 0;
104 uint64_t m_total_psb_blocks
= 0;
107 } // namespace trace_intel_pt
108 } // namespace lldb_private
110 #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTMULTICPUDECODER_H