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