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 Andricvoid 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 AndricError TraceExpander::visit(BufferExtents &) { 23*b5893f02SDimitry Andric resetCurrentRecord(); 24*b5893f02SDimitry Andric return Error::success(); 25*b5893f02SDimitry Andric } 26*b5893f02SDimitry Andric visit(WallclockRecord &)27*b5893f02SDimitry AndricError TraceExpander::visit(WallclockRecord &) { return Error::success(); } 28*b5893f02SDimitry Andric visit(NewCPUIDRecord & R)29*b5893f02SDimitry AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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 AndricError 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