Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/XRay/FDRTraceExpander.cpp
35233 views
1
//===- FDRTraceExpander.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
#include "llvm/XRay/FDRTraceExpander.h"
9
10
namespace llvm {
11
namespace xray {
12
13
void TraceExpander::resetCurrentRecord() {
14
if (BuildingRecord)
15
C(CurrentRecord);
16
BuildingRecord = false;
17
CurrentRecord.CallArgs.clear();
18
CurrentRecord.Data.clear();
19
}
20
21
Error TraceExpander::visit(BufferExtents &) {
22
resetCurrentRecord();
23
return Error::success();
24
}
25
26
Error TraceExpander::visit(WallclockRecord &) { return Error::success(); }
27
28
Error TraceExpander::visit(NewCPUIDRecord &R) {
29
CPUId = R.cpuid();
30
BaseTSC = R.tsc();
31
return Error::success();
32
}
33
34
Error TraceExpander::visit(TSCWrapRecord &R) {
35
BaseTSC = R.tsc();
36
return Error::success();
37
}
38
39
Error TraceExpander::visit(CustomEventRecord &R) {
40
resetCurrentRecord();
41
if (!IgnoringRecords) {
42
CurrentRecord.TSC = R.tsc();
43
CurrentRecord.CPU = R.cpu();
44
CurrentRecord.PId = PID;
45
CurrentRecord.TId = TID;
46
CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
47
CurrentRecord.Data = std::string(R.data());
48
BuildingRecord = true;
49
}
50
return Error::success();
51
}
52
53
Error TraceExpander::visit(CustomEventRecordV5 &R) {
54
resetCurrentRecord();
55
if (!IgnoringRecords) {
56
BaseTSC += R.delta();
57
CurrentRecord.TSC = BaseTSC;
58
CurrentRecord.CPU = CPUId;
59
CurrentRecord.PId = PID;
60
CurrentRecord.TId = TID;
61
CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
62
CurrentRecord.Data = std::string(R.data());
63
BuildingRecord = true;
64
}
65
return Error::success();
66
}
67
68
Error TraceExpander::visit(TypedEventRecord &R) {
69
resetCurrentRecord();
70
if (!IgnoringRecords) {
71
BaseTSC += R.delta();
72
CurrentRecord.TSC = BaseTSC;
73
CurrentRecord.CPU = CPUId;
74
CurrentRecord.PId = PID;
75
CurrentRecord.TId = TID;
76
CurrentRecord.RecordType = R.eventType();
77
CurrentRecord.Type = RecordTypes::TYPED_EVENT;
78
CurrentRecord.Data = std::string(R.data());
79
BuildingRecord = true;
80
}
81
return Error::success();
82
}
83
84
Error TraceExpander::visit(CallArgRecord &R) {
85
CurrentRecord.CallArgs.push_back(R.arg());
86
CurrentRecord.Type = RecordTypes::ENTER_ARG;
87
return Error::success();
88
}
89
90
Error TraceExpander::visit(PIDRecord &R) {
91
PID = R.pid();
92
return Error::success();
93
}
94
95
Error TraceExpander::visit(NewBufferRecord &R) {
96
if (IgnoringRecords)
97
IgnoringRecords = false;
98
TID = R.tid();
99
if (LogVersion == 2)
100
PID = R.tid();
101
return Error::success();
102
}
103
104
Error TraceExpander::visit(EndBufferRecord &) {
105
IgnoringRecords = true;
106
resetCurrentRecord();
107
return Error::success();
108
}
109
110
Error TraceExpander::visit(FunctionRecord &R) {
111
resetCurrentRecord();
112
if (!IgnoringRecords) {
113
BaseTSC += R.delta();
114
CurrentRecord.Type = R.recordType();
115
CurrentRecord.FuncId = R.functionId();
116
CurrentRecord.TSC = BaseTSC;
117
CurrentRecord.PId = PID;
118
CurrentRecord.TId = TID;
119
CurrentRecord.CPU = CPUId;
120
BuildingRecord = true;
121
}
122
return Error::success();
123
}
124
125
Error TraceExpander::flush() {
126
resetCurrentRecord();
127
return Error::success();
128
}
129
130
} // namespace xray
131
} // namespace llvm
132
133