xref: /freebsd-src/contrib/llvm-project/llvm/lib/XRay/FDRTraceExpander.cpp (revision e25152834cdf3b353892835a4f3b157e066a8ed4)
10b57cec5SDimitry Andric //===- FDRTraceExpander.cpp -----------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric #include "llvm/XRay/FDRTraceExpander.h"
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric namespace llvm {
110b57cec5SDimitry Andric namespace xray {
120b57cec5SDimitry Andric 
resetCurrentRecord()130b57cec5SDimitry Andric void TraceExpander::resetCurrentRecord() {
140b57cec5SDimitry Andric   if (BuildingRecord)
150b57cec5SDimitry Andric     C(CurrentRecord);
160b57cec5SDimitry Andric   BuildingRecord = false;
170b57cec5SDimitry Andric   CurrentRecord.CallArgs.clear();
180b57cec5SDimitry Andric   CurrentRecord.Data.clear();
190b57cec5SDimitry Andric }
200b57cec5SDimitry Andric 
visit(BufferExtents &)210b57cec5SDimitry Andric Error TraceExpander::visit(BufferExtents &) {
220b57cec5SDimitry Andric   resetCurrentRecord();
230b57cec5SDimitry Andric   return Error::success();
240b57cec5SDimitry Andric }
250b57cec5SDimitry Andric 
visit(WallclockRecord &)260b57cec5SDimitry Andric Error TraceExpander::visit(WallclockRecord &) { return Error::success(); }
270b57cec5SDimitry Andric 
visit(NewCPUIDRecord & R)280b57cec5SDimitry Andric Error TraceExpander::visit(NewCPUIDRecord &R) {
290b57cec5SDimitry Andric   CPUId = R.cpuid();
300b57cec5SDimitry Andric   BaseTSC = R.tsc();
310b57cec5SDimitry Andric   return Error::success();
320b57cec5SDimitry Andric }
330b57cec5SDimitry Andric 
visit(TSCWrapRecord & R)340b57cec5SDimitry Andric Error TraceExpander::visit(TSCWrapRecord &R) {
350b57cec5SDimitry Andric   BaseTSC = R.tsc();
360b57cec5SDimitry Andric   return Error::success();
370b57cec5SDimitry Andric }
380b57cec5SDimitry Andric 
visit(CustomEventRecord & R)390b57cec5SDimitry Andric Error TraceExpander::visit(CustomEventRecord &R) {
400b57cec5SDimitry Andric   resetCurrentRecord();
410b57cec5SDimitry Andric   if (!IgnoringRecords) {
420b57cec5SDimitry Andric     CurrentRecord.TSC = R.tsc();
430b57cec5SDimitry Andric     CurrentRecord.CPU = R.cpu();
440b57cec5SDimitry Andric     CurrentRecord.PId = PID;
450b57cec5SDimitry Andric     CurrentRecord.TId = TID;
460b57cec5SDimitry Andric     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
47*5ffd83dbSDimitry Andric     CurrentRecord.Data = std::string(R.data());
480b57cec5SDimitry Andric     BuildingRecord = true;
490b57cec5SDimitry Andric   }
500b57cec5SDimitry Andric   return Error::success();
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
visit(CustomEventRecordV5 & R)530b57cec5SDimitry Andric Error TraceExpander::visit(CustomEventRecordV5 &R) {
540b57cec5SDimitry Andric   resetCurrentRecord();
550b57cec5SDimitry Andric   if (!IgnoringRecords) {
560b57cec5SDimitry Andric     BaseTSC += R.delta();
570b57cec5SDimitry Andric     CurrentRecord.TSC = BaseTSC;
580b57cec5SDimitry Andric     CurrentRecord.CPU = CPUId;
590b57cec5SDimitry Andric     CurrentRecord.PId = PID;
600b57cec5SDimitry Andric     CurrentRecord.TId = TID;
610b57cec5SDimitry Andric     CurrentRecord.Type = RecordTypes::CUSTOM_EVENT;
62*5ffd83dbSDimitry Andric     CurrentRecord.Data = std::string(R.data());
630b57cec5SDimitry Andric     BuildingRecord = true;
640b57cec5SDimitry Andric   }
650b57cec5SDimitry Andric   return Error::success();
660b57cec5SDimitry Andric }
670b57cec5SDimitry Andric 
visit(TypedEventRecord & R)680b57cec5SDimitry Andric Error TraceExpander::visit(TypedEventRecord &R) {
690b57cec5SDimitry Andric   resetCurrentRecord();
700b57cec5SDimitry Andric   if (!IgnoringRecords) {
710b57cec5SDimitry Andric     BaseTSC += R.delta();
720b57cec5SDimitry Andric     CurrentRecord.TSC = BaseTSC;
730b57cec5SDimitry Andric     CurrentRecord.CPU = CPUId;
740b57cec5SDimitry Andric     CurrentRecord.PId = PID;
750b57cec5SDimitry Andric     CurrentRecord.TId = TID;
760b57cec5SDimitry Andric     CurrentRecord.RecordType = R.eventType();
770b57cec5SDimitry Andric     CurrentRecord.Type = RecordTypes::TYPED_EVENT;
78*5ffd83dbSDimitry Andric     CurrentRecord.Data = std::string(R.data());
790b57cec5SDimitry Andric     BuildingRecord = true;
800b57cec5SDimitry Andric   }
810b57cec5SDimitry Andric   return Error::success();
820b57cec5SDimitry Andric }
830b57cec5SDimitry Andric 
visit(CallArgRecord & R)840b57cec5SDimitry Andric Error TraceExpander::visit(CallArgRecord &R) {
850b57cec5SDimitry Andric   CurrentRecord.CallArgs.push_back(R.arg());
860b57cec5SDimitry Andric   CurrentRecord.Type = RecordTypes::ENTER_ARG;
870b57cec5SDimitry Andric   return Error::success();
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric 
visit(PIDRecord & R)900b57cec5SDimitry Andric Error TraceExpander::visit(PIDRecord &R) {
910b57cec5SDimitry Andric   PID = R.pid();
920b57cec5SDimitry Andric   return Error::success();
930b57cec5SDimitry Andric }
940b57cec5SDimitry Andric 
visit(NewBufferRecord & R)950b57cec5SDimitry Andric Error TraceExpander::visit(NewBufferRecord &R) {
960b57cec5SDimitry Andric   if (IgnoringRecords)
970b57cec5SDimitry Andric     IgnoringRecords = false;
980b57cec5SDimitry Andric   TID = R.tid();
990b57cec5SDimitry Andric   if (LogVersion == 2)
1000b57cec5SDimitry Andric     PID = R.tid();
1010b57cec5SDimitry Andric   return Error::success();
1020b57cec5SDimitry Andric }
1030b57cec5SDimitry Andric 
visit(EndBufferRecord &)1040b57cec5SDimitry Andric Error TraceExpander::visit(EndBufferRecord &) {
1050b57cec5SDimitry Andric   IgnoringRecords = true;
1060b57cec5SDimitry Andric   resetCurrentRecord();
1070b57cec5SDimitry Andric   return Error::success();
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric 
visit(FunctionRecord & R)1100b57cec5SDimitry Andric Error TraceExpander::visit(FunctionRecord &R) {
1110b57cec5SDimitry Andric   resetCurrentRecord();
1120b57cec5SDimitry Andric   if (!IgnoringRecords) {
1130b57cec5SDimitry Andric     BaseTSC += R.delta();
1140b57cec5SDimitry Andric     CurrentRecord.Type = R.recordType();
1150b57cec5SDimitry Andric     CurrentRecord.FuncId = R.functionId();
1160b57cec5SDimitry Andric     CurrentRecord.TSC = BaseTSC;
1170b57cec5SDimitry Andric     CurrentRecord.PId = PID;
1180b57cec5SDimitry Andric     CurrentRecord.TId = TID;
1190b57cec5SDimitry Andric     CurrentRecord.CPU = CPUId;
1200b57cec5SDimitry Andric     BuildingRecord = true;
1210b57cec5SDimitry Andric   }
1220b57cec5SDimitry Andric   return Error::success();
1230b57cec5SDimitry Andric }
1240b57cec5SDimitry Andric 
flush()1250b57cec5SDimitry Andric Error TraceExpander::flush() {
1260b57cec5SDimitry Andric   resetCurrentRecord();
1270b57cec5SDimitry Andric   return Error::success();
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric } // namespace xray
1310b57cec5SDimitry Andric } // namespace llvm
132