92 lines · cpp
1//===- BlockIndexer.cpp - FDR Block Indexing VIsitor ----------------------===//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//9// An implementation of the RecordVisitor which generates a mapping between a10// thread and a range of records representing a block.11//12//===----------------------------------------------------------------------===//13#include "llvm/XRay/BlockIndexer.h"14 15using namespace llvm;16using namespace llvm::xray;17 18Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }19 20Error BlockIndexer::visit(WallclockRecord &R) {21 CurrentBlock.Records.push_back(&R);22 CurrentBlock.WallclockTime = &R;23 return Error::success();24}25 26Error BlockIndexer::visit(NewCPUIDRecord &R) {27 CurrentBlock.Records.push_back(&R);28 return Error::success();29}30 31Error BlockIndexer::visit(TSCWrapRecord &R) {32 CurrentBlock.Records.push_back(&R);33 return Error::success();34}35 36Error BlockIndexer::visit(CustomEventRecord &R) {37 CurrentBlock.Records.push_back(&R);38 return Error::success();39}40 41Error BlockIndexer::visit(CustomEventRecordV5 &R) {42 CurrentBlock.Records.push_back(&R);43 return Error::success();44}45 46Error BlockIndexer::visit(TypedEventRecord &R) {47 CurrentBlock.Records.push_back(&R);48 return Error::success();49}50 51Error BlockIndexer::visit(CallArgRecord &R) {52 CurrentBlock.Records.push_back(&R);53 return Error::success();54}55 56Error BlockIndexer::visit(PIDRecord &R) {57 CurrentBlock.ProcessID = R.pid();58 CurrentBlock.Records.push_back(&R);59 return Error::success();60}61 62Error BlockIndexer::visit(NewBufferRecord &R) {63 if (!CurrentBlock.Records.empty())64 if (auto E = flush())65 return E;66 67 CurrentBlock.ThreadID = R.tid();68 CurrentBlock.Records.push_back(&R);69 return Error::success();70}71 72Error BlockIndexer::visit(EndBufferRecord &R) {73 CurrentBlock.Records.push_back(&R);74 return Error::success();75}76 77Error BlockIndexer::visit(FunctionRecord &R) {78 CurrentBlock.Records.push_back(&R);79 return Error::success();80}81 82Error BlockIndexer::flush() {83 Indices[{CurrentBlock.ProcessID, CurrentBlock.ThreadID}].push_back(84 {CurrentBlock.ProcessID, CurrentBlock.ThreadID,85 CurrentBlock.WallclockTime, std::move(CurrentBlock.Records)});86 CurrentBlock.ProcessID = 0;87 CurrentBlock.ThreadID = 0;88 CurrentBlock.Records = {};89 CurrentBlock.WallclockTime = nullptr;90 return Error::success();91}92