1 //===- FDRTraceExpander.cpp -----------------------------------------------===//
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 //===----------------------------------------------------------------------===//
8 #include "llvm/XRay/FDRTraceExpander.h"
13 void TraceExpander::resetCurrentRecord() {
16 BuildingRecord
= false;
17 CurrentRecord
.CallArgs
.clear();
18 CurrentRecord
.Data
.clear();
21 Error
TraceExpander::visit(BufferExtents
&) {
23 return Error::success();
26 Error
TraceExpander::visit(WallclockRecord
&) { return Error::success(); }
28 Error
TraceExpander::visit(NewCPUIDRecord
&R
) {
31 return Error::success();
34 Error
TraceExpander::visit(TSCWrapRecord
&R
) {
36 return Error::success();
39 Error
TraceExpander::visit(CustomEventRecord
&R
) {
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
= R
.data();
48 BuildingRecord
= true;
50 return Error::success();
53 Error
TraceExpander::visit(CustomEventRecordV5
&R
) {
55 if (!IgnoringRecords
) {
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
= R
.data();
63 BuildingRecord
= true;
65 return Error::success();
68 Error
TraceExpander::visit(TypedEventRecord
&R
) {
70 if (!IgnoringRecords
) {
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
= R
.data();
79 BuildingRecord
= true;
81 return Error::success();
84 Error
TraceExpander::visit(CallArgRecord
&R
) {
85 CurrentRecord
.CallArgs
.push_back(R
.arg());
86 CurrentRecord
.Type
= RecordTypes::ENTER_ARG
;
87 return Error::success();
90 Error
TraceExpander::visit(PIDRecord
&R
) {
92 return Error::success();
95 Error
TraceExpander::visit(NewBufferRecord
&R
) {
97 IgnoringRecords
= false;
101 return Error::success();
104 Error
TraceExpander::visit(EndBufferRecord
&) {
105 IgnoringRecords
= true;
106 resetCurrentRecord();
107 return Error::success();
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;
122 return Error::success();
125 Error
TraceExpander::flush() {
126 resetCurrentRecord();
127 return Error::success();