brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · d0c6853 Raw
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