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
10namespace llvm {
11namespace xray {
12
13void TraceExpander::resetCurrentRecord() {
14  if (BuildingRecord)
15    C(CurrentRecord);
16  BuildingRecord = false;
17  CurrentRecord.CallArgs.clear();
18  CurrentRecord.Data.clear();
19}
20
21Error TraceExpander::visit(BufferExtents &) {
22  resetCurrentRecord();
23  return Error::success();
24}
25
26Error TraceExpander::visit(WallclockRecord &) { return Error::success(); }
27
28Error TraceExpander::visit(NewCPUIDRecord &R) {
29  CPUId = R.cpuid();
30  BaseTSC = R.tsc();
31  return Error::success();
32}
33
34Error TraceExpander::visit(TSCWrapRecord &R) {
35  BaseTSC = R.tsc();
36  return Error::success();
37}
38
39Error 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 = R.data();
48    BuildingRecord = true;
49  }
50  return Error::success();
51}
52
53Error 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 = R.data();
63    BuildingRecord = true;
64  }
65  return Error::success();
66}
67
68Error 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 = R.data();
79    BuildingRecord = true;
80  }
81  return Error::success();
82}
83
84Error TraceExpander::visit(CallArgRecord &R) {
85  CurrentRecord.CallArgs.push_back(R.arg());
86  CurrentRecord.Type = RecordTypes::ENTER_ARG;
87  return Error::success();
88}
89
90Error TraceExpander::visit(PIDRecord &R) {
91  PID = R.pid();
92  return Error::success();
93}
94
95Error 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
104Error TraceExpander::visit(EndBufferRecord &) {
105  IgnoringRecords = true;
106  resetCurrentRecord();
107  return Error::success();
108}
109
110Error 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
125Error TraceExpander::flush() {
126  resetCurrentRecord();
127  return Error::success();
128}
129
130} // namespace xray
131} // namespace llvm
132