Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / lldb / source / Plugins / Trace / intel-pt / PerfContextSwitchDecoder.h
blob4ea7738810ce16902acf1c10422e06baf7d6740b
1 //===-- PerfContextSwitchDecoder.h --======----------------------*- C++ -*-===//
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 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_PERFCONTEXTSWITCHDECODER_H
10 #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_PERFCONTEXTSWITCHDECODER_H
12 #include "lldb/Utility/TraceIntelPTGDBRemotePackets.h"
13 #include "lldb/lldb-types.h"
14 #include "llvm/Support/Error.h"
15 #include <set>
16 #include <vector>
18 namespace lldb_private {
19 namespace trace_intel_pt {
21 /// This class indicates the time interval in which a thread was running
22 /// continuously on a cpu core.
23 struct ThreadContinuousExecution {
25 /// In most cases both the start and end of a continuous execution can be
26 /// accurately recovered from the context switch trace, but in some cases one
27 /// of these endpoints might be guessed or not known at all, due to contention
28 /// problems in the trace or because tracing was interrupted, e.g. with ioctl
29 /// calls, which causes gaps in the trace. Because of that, we identify which
30 /// situation we fall into with the following variants.
31 enum class Variant {
32 /// Both endpoints are known.
33 Complete,
34 /// The end is known and we have a lower bound for the start, i.e. the
35 /// previous execution in the same cpu happens strictly before the hinted
36 /// start.
37 HintedStart,
38 /// The start is known and we have an upper bound for the end, i.e. the next
39 /// execution in the same cpu happens strictly after the hinted end.
40 HintedEnd,
41 /// We only know the start. This might be the last entry of a cpu trace.
42 OnlyStart,
43 /// We only know the end. This might be the first entry or a cpu trace.
44 OnlyEnd,
45 } variant;
47 /// \return
48 /// The lowest tsc that we are sure of, i.e. not hinted.
49 uint64_t GetLowestKnownTSC() const;
51 /// \return
52 /// The known or hinted start tsc, or 0 if the variant is \a OnlyEnd.
53 uint64_t GetStartTSC() const;
55 /// \return
56 /// The known or hinted end tsc, or max \a uint64_t if the variant is \a
57 /// OnlyStart.
58 uint64_t GetEndTSC() const;
60 /// Constructors for the different variants of this object
61 ///
62 /// \{
63 static ThreadContinuousExecution
64 CreateCompleteExecution(lldb::cpu_id_t cpu_id, lldb::tid_t tid,
65 lldb::pid_t pid, uint64_t start, uint64_t end);
67 static ThreadContinuousExecution
68 CreateHintedStartExecution(lldb::cpu_id_t cpu_id, lldb::tid_t tid,
69 lldb::pid_t pid, uint64_t hinted_start,
70 uint64_t end);
72 static ThreadContinuousExecution
73 CreateHintedEndExecution(lldb::cpu_id_t cpu_id, lldb::tid_t tid,
74 lldb::pid_t pid, uint64_t start,
75 uint64_t hinted_end);
77 static ThreadContinuousExecution CreateOnlyEndExecution(lldb::cpu_id_t cpu_id,
78 lldb::tid_t tid,
79 lldb::pid_t pid,
80 uint64_t end);
82 static ThreadContinuousExecution
83 CreateOnlyStartExecution(lldb::cpu_id_t cpu_id, lldb::tid_t tid,
84 lldb::pid_t pid, uint64_t start);
85 /// \}
87 union {
88 struct {
89 uint64_t start;
90 uint64_t end;
91 } complete;
92 struct {
93 uint64_t start;
94 } only_start;
95 struct {
96 uint64_t end;
97 } only_end;
98 /// The following 'hinted' structures are useful when there are contention
99 /// problems in the trace
100 struct {
101 uint64_t hinted_start;
102 uint64_t end;
103 } hinted_start;
104 struct {
105 uint64_t start;
106 uint64_t hinted_end;
107 } hinted_end;
108 } tscs;
110 lldb::cpu_id_t cpu_id;
111 lldb::tid_t tid;
112 lldb::pid_t pid;
114 private:
115 /// We keep this constructor private to force the usage of the static named
116 /// constructors.
117 ThreadContinuousExecution(lldb::cpu_id_t cpu_id, lldb::tid_t tid,
118 lldb::pid_t pid)
119 : cpu_id(cpu_id), tid(tid), pid(pid) {}
122 /// Decodes a context switch trace collected with perf_event_open.
124 /// \param[in] data
125 /// The context switch trace in binary format.
127 /// \param[i] cpu_id
128 /// The cpu_id where the trace were gotten from.
130 /// \param[in] tsc_conversion
131 /// The conversion values used to confert nanoseconds to TSC.
133 /// \return
134 /// A list of continuous executions recovered from the raw trace sorted by
135 /// time, or an \a llvm::Error if the data is malformed.
136 llvm::Expected<std::vector<ThreadContinuousExecution>>
137 DecodePerfContextSwitchTrace(llvm::ArrayRef<uint8_t> data,
138 lldb::cpu_id_t cpu_id,
139 const LinuxPerfZeroTscConversion &tsc_conversion);
141 llvm::Expected<std::vector<uint8_t>>
142 FilterProcessesFromContextSwitchTrace(llvm::ArrayRef<uint8_t> data,
143 const std::set<lldb::pid_t> &pids);
145 } // namespace trace_intel_pt
146 } // namespace lldb_private
148 #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_PERFCONTEXTSWITCHDECODER_H