brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 991e6e5 Raw
129 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8#include "llvm/XRay/FDRTraceExpander.h"9 10using namespace llvm;11using namespace llvm::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 = std::string(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 = std::string(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 = std::string(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