| //===- FDRTraceExpander.cpp -----------------------------------------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | #include "llvm/XRay/FDRTraceExpander.h" | 
 |  | 
 | namespace llvm { | 
 | namespace xray { | 
 |  | 
 | void TraceExpander::resetCurrentRecord() { | 
 |   if (BuildingRecord) | 
 |     C(CurrentRecord); | 
 |   BuildingRecord = false; | 
 |   CurrentRecord.CallArgs.clear(); | 
 |   CurrentRecord.Data.clear(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(BufferExtents &) { | 
 |   resetCurrentRecord(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(WallclockRecord &) { return Error::success(); } | 
 |  | 
 | Error TraceExpander::visit(NewCPUIDRecord &R) { | 
 |   CPUId = R.cpuid(); | 
 |   BaseTSC = R.tsc(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(TSCWrapRecord &R) { | 
 |   BaseTSC = R.tsc(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(CustomEventRecord &R) { | 
 |   resetCurrentRecord(); | 
 |   if (!IgnoringRecords) { | 
 |     CurrentRecord.TSC = R.tsc(); | 
 |     CurrentRecord.CPU = R.cpu(); | 
 |     CurrentRecord.PId = PID; | 
 |     CurrentRecord.TId = TID; | 
 |     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT; | 
 |     CurrentRecord.Data = std::string(R.data()); | 
 |     BuildingRecord = true; | 
 |   } | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(CustomEventRecordV5 &R) { | 
 |   resetCurrentRecord(); | 
 |   if (!IgnoringRecords) { | 
 |     BaseTSC += R.delta(); | 
 |     CurrentRecord.TSC = BaseTSC; | 
 |     CurrentRecord.CPU = CPUId; | 
 |     CurrentRecord.PId = PID; | 
 |     CurrentRecord.TId = TID; | 
 |     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT; | 
 |     CurrentRecord.Data = std::string(R.data()); | 
 |     BuildingRecord = true; | 
 |   } | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(TypedEventRecord &R) { | 
 |   resetCurrentRecord(); | 
 |   if (!IgnoringRecords) { | 
 |     BaseTSC += R.delta(); | 
 |     CurrentRecord.TSC = BaseTSC; | 
 |     CurrentRecord.CPU = CPUId; | 
 |     CurrentRecord.PId = PID; | 
 |     CurrentRecord.TId = TID; | 
 |     CurrentRecord.RecordType = R.eventType(); | 
 |     CurrentRecord.Type = RecordTypes::TYPED_EVENT; | 
 |     CurrentRecord.Data = std::string(R.data()); | 
 |     BuildingRecord = true; | 
 |   } | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(CallArgRecord &R) { | 
 |   CurrentRecord.CallArgs.push_back(R.arg()); | 
 |   CurrentRecord.Type = RecordTypes::ENTER_ARG; | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(PIDRecord &R) { | 
 |   PID = R.pid(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(NewBufferRecord &R) { | 
 |   if (IgnoringRecords) | 
 |     IgnoringRecords = false; | 
 |   TID = R.tid(); | 
 |   if (LogVersion == 2) | 
 |     PID = R.tid(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(EndBufferRecord &) { | 
 |   IgnoringRecords = true; | 
 |   resetCurrentRecord(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::visit(FunctionRecord &R) { | 
 |   resetCurrentRecord(); | 
 |   if (!IgnoringRecords) { | 
 |     BaseTSC += R.delta(); | 
 |     CurrentRecord.Type = R.recordType(); | 
 |     CurrentRecord.FuncId = R.functionId(); | 
 |     CurrentRecord.TSC = BaseTSC; | 
 |     CurrentRecord.PId = PID; | 
 |     CurrentRecord.TId = TID; | 
 |     CurrentRecord.CPU = CPUId; | 
 |     BuildingRecord = true; | 
 |   } | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | Error TraceExpander::flush() { | 
 |   resetCurrentRecord(); | 
 |   return Error::success(); | 
 | } | 
 |  | 
 | } // namespace xray | 
 | } // namespace llvm |