1*b5893f02SDimitry Andric //===- FDRTraceExpander.cpp -----------------------------------------------===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric //                     The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric #include "llvm/XRay/FDRTraceExpander.h"
10*b5893f02SDimitry Andric 
11*b5893f02SDimitry Andric namespace llvm {
12*b5893f02SDimitry Andric namespace xray {
13*b5893f02SDimitry Andric 
resetCurrentRecord()14*b5893f02SDimitry Andric void TraceExpander::resetCurrentRecord() {
15*b5893f02SDimitry Andric   if (BuildingRecord)
16*b5893f02SDimitry Andric     C(CurrentRecord);
17*b5893f02SDimitry Andric   BuildingRecord = false;
18*b5893f02SDimitry Andric   CurrentRecord.CallArgs.clear();
19*b5893f02SDimitry Andric   CurrentRecord.Data.clear();
20*b5893f02SDimitry Andric }
21*b5893f02SDimitry Andric 
visit(BufferExtents &)22*b5893f02SDimitry Andric Error TraceExpander::visit(BufferExtents &) {
23*b5893f02SDimitry Andric   resetCurrentRecord();
24*b5893f02SDimitry Andric   return Error::success();
25*b5893f02SDimitry Andric }
26*b5893f02SDimitry Andric 
visit(WallclockRecord &)27*b5893f02SDimitry Andric Error TraceExpander::visit(WallclockRecord &) { return Error::success(); }
28*b5893f02SDimitry Andric 
visit(NewCPUIDRecord & R)29*b5893f02SDimitry Andric Error TraceExpander::visit(NewCPUIDRecord &R) {
30*b5893f02SDimitry Andric   CPUId = R.cpuid();
31*b5893f02SDimitry Andric   BaseTSC = R.tsc();
32*b5893f02SDimitry Andric   return Error::success();
33*b5893f02SDimitry Andric }
34*b5893f02SDimitry Andric 
visit(TSCWrapRecord & R)35*b5893f02SDimitry Andric Error TraceExpander::visit(TSCWrapRecord &R) {
36*b5893f02SDimitry Andric   BaseTSC = R.tsc();
37*b5893f02SDimitry Andric   return Error::success();
38*b5893f02SDimitry Andric }
39*b5893f02SDimitry Andric 
visit(CustomEventRecord & R)40*b5893f02SDimitry Andric Error TraceExpander::visit(CustomEventRecord &R) {
41*b5893f02SDimitry Andric   resetCurrentRecord();
42*b5893f02SDimitry Andric   if (!IgnoringRecords) {
43*b5893f02SDimitry Andric     CurrentRecord.TSC = R.tsc();
44*b5893f02SDimitry Andric     CurrentRecord.CPU = R.cpu();
45*b5893f02SDimitry Andric     CurrentRecord.PId = PID;
46*b5893f02SDimitry Andric     CurrentRecord.TId = TID;
47*b5893f02SDimitry Andric     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
48*b5893f02SDimitry Andric     CurrentRecord.Data = R.data();
49*b5893f02SDimitry Andric     BuildingRecord = true;
50*b5893f02SDimitry Andric   }
51*b5893f02SDimitry Andric   return Error::success();
52*b5893f02SDimitry Andric }
53*b5893f02SDimitry Andric 
visit(CustomEventRecordV5 & R)54*b5893f02SDimitry Andric Error TraceExpander::visit(CustomEventRecordV5 &R) {
55*b5893f02SDimitry Andric   resetCurrentRecord();
56*b5893f02SDimitry Andric   if (!IgnoringRecords) {
57*b5893f02SDimitry Andric     BaseTSC += R.delta();
58*b5893f02SDimitry Andric     CurrentRecord.TSC = BaseTSC;
59*b5893f02SDimitry Andric     CurrentRecord.CPU = CPUId;
60*b5893f02SDimitry Andric     CurrentRecord.PId = PID;
61*b5893f02SDimitry Andric     CurrentRecord.TId = TID;
62*b5893f02SDimitry Andric     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
63*b5893f02SDimitry Andric     CurrentRecord.Data = R.data();
64*b5893f02SDimitry Andric     BuildingRecord = true;
65*b5893f02SDimitry Andric   }
66*b5893f02SDimitry Andric   return Error::success();
67*b5893f02SDimitry Andric }
68*b5893f02SDimitry Andric 
visit(TypedEventRecord & R)69*b5893f02SDimitry Andric Error TraceExpander::visit(TypedEventRecord &R) {
70*b5893f02SDimitry Andric   resetCurrentRecord();
71*b5893f02SDimitry Andric   if (!IgnoringRecords) {
72*b5893f02SDimitry Andric     BaseTSC += R.delta();
73*b5893f02SDimitry Andric     CurrentRecord.TSC = BaseTSC;
74*b5893f02SDimitry Andric     CurrentRecord.CPU = CPUId;
75*b5893f02SDimitry Andric     CurrentRecord.PId = PID;
76*b5893f02SDimitry Andric     CurrentRecord.TId = TID;
77*b5893f02SDimitry Andric     CurrentRecord.RecordType = R.eventType();
78*b5893f02SDimitry Andric     CurrentRecord.Type = RecordTypes::TYPED_EVENT;
79*b5893f02SDimitry Andric     CurrentRecord.Data = R.data();
80*b5893f02SDimitry Andric     BuildingRecord = true;
81*b5893f02SDimitry Andric   }
82*b5893f02SDimitry Andric   return Error::success();
83*b5893f02SDimitry Andric }
84*b5893f02SDimitry Andric 
visit(CallArgRecord & R)85*b5893f02SDimitry Andric Error TraceExpander::visit(CallArgRecord &R) {
86*b5893f02SDimitry Andric   CurrentRecord.CallArgs.push_back(R.arg());
87*b5893f02SDimitry Andric   CurrentRecord.Type = RecordTypes::ENTER_ARG;
88*b5893f02SDimitry Andric   return Error::success();
89*b5893f02SDimitry Andric }
90*b5893f02SDimitry Andric 
visit(PIDRecord & R)91*b5893f02SDimitry Andric Error TraceExpander::visit(PIDRecord &R) {
92*b5893f02SDimitry Andric   PID = R.pid();
93*b5893f02SDimitry Andric   return Error::success();
94*b5893f02SDimitry Andric }
95*b5893f02SDimitry Andric 
visit(NewBufferRecord & R)96*b5893f02SDimitry Andric Error TraceExpander::visit(NewBufferRecord &R) {
97*b5893f02SDimitry Andric   if (IgnoringRecords)
98*b5893f02SDimitry Andric     IgnoringRecords = false;
99*b5893f02SDimitry Andric   TID = R.tid();
100*b5893f02SDimitry Andric   if (LogVersion == 2)
101*b5893f02SDimitry Andric     PID = R.tid();
102*b5893f02SDimitry Andric   return Error::success();
103*b5893f02SDimitry Andric }
104*b5893f02SDimitry Andric 
visit(EndBufferRecord &)105*b5893f02SDimitry Andric Error TraceExpander::visit(EndBufferRecord &) {
106*b5893f02SDimitry Andric   IgnoringRecords = true;
107*b5893f02SDimitry Andric   resetCurrentRecord();
108*b5893f02SDimitry Andric   return Error::success();
109*b5893f02SDimitry Andric }
110*b5893f02SDimitry Andric 
visit(FunctionRecord & R)111*b5893f02SDimitry Andric Error TraceExpander::visit(FunctionRecord &R) {
112*b5893f02SDimitry Andric   resetCurrentRecord();
113*b5893f02SDimitry Andric   if (!IgnoringRecords) {
114*b5893f02SDimitry Andric     BaseTSC += R.delta();
115*b5893f02SDimitry Andric     CurrentRecord.Type = R.recordType();
116*b5893f02SDimitry Andric     CurrentRecord.FuncId = R.functionId();
117*b5893f02SDimitry Andric     CurrentRecord.TSC = BaseTSC;
118*b5893f02SDimitry Andric     CurrentRecord.PId = PID;
119*b5893f02SDimitry Andric     CurrentRecord.TId = TID;
120*b5893f02SDimitry Andric     CurrentRecord.CPU = CPUId;
121*b5893f02SDimitry Andric     BuildingRecord = true;
122*b5893f02SDimitry Andric   }
123*b5893f02SDimitry Andric   return Error::success();
124*b5893f02SDimitry Andric }
125*b5893f02SDimitry Andric 
flush()126*b5893f02SDimitry Andric Error TraceExpander::flush() {
127*b5893f02SDimitry Andric   resetCurrentRecord();
128*b5893f02SDimitry Andric   return Error::success();
129*b5893f02SDimitry Andric }
130*b5893f02SDimitry Andric 
131*b5893f02SDimitry Andric } // namespace xray
132*b5893f02SDimitry Andric } // namespace llvm
133