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();