BlockIndexer.cpp revision 343171
1//===- BlockIndexer.cpp - FDR Block Indexing VIsitor ----------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// An implementation of the RecordVisitor which generates a mapping between a
11// thread and a range of records representing a block.
12//
13//===----------------------------------------------------------------------===//
14#include "llvm/XRay/BlockIndexer.h"
15
16namespace llvm {
17namespace xray {
18
19Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }
20
21Error BlockIndexer::visit(WallclockRecord &R) {
22  CurrentBlock.Records.push_back(&R);
23  CurrentBlock.WallclockTime = &R;
24  return Error::success();
25}
26
27Error BlockIndexer::visit(NewCPUIDRecord &R) {
28  CurrentBlock.Records.push_back(&R);
29  return Error::success();
30}
31
32Error BlockIndexer::visit(TSCWrapRecord &R) {
33  CurrentBlock.Records.push_back(&R);
34  return Error::success();
35}
36
37Error BlockIndexer::visit(CustomEventRecord &R) {
38  CurrentBlock.Records.push_back(&R);
39  return Error::success();
40}
41
42Error BlockIndexer::visit(CustomEventRecordV5 &R) {
43  CurrentBlock.Records.push_back(&R);
44  return Error::success();
45}
46
47Error BlockIndexer::visit(TypedEventRecord &R) {
48  CurrentBlock.Records.push_back(&R);
49  return Error::success();
50}
51
52Error BlockIndexer::visit(CallArgRecord &R) {
53  CurrentBlock.Records.push_back(&R);
54  return Error::success();
55}
56
57Error BlockIndexer::visit(PIDRecord &R) {
58  CurrentBlock.ProcessID = R.pid();
59  CurrentBlock.Records.push_back(&R);
60  return Error::success();
61}
62
63Error BlockIndexer::visit(NewBufferRecord &R) {
64  if (!CurrentBlock.Records.empty())
65    if (auto E = flush())
66      return E;
67
68  CurrentBlock.ThreadID = R.tid();
69  CurrentBlock.Records.push_back(&R);
70  return Error::success();
71}
72
73Error BlockIndexer::visit(EndBufferRecord &R) {
74  CurrentBlock.Records.push_back(&R);
75  return Error::success();
76}
77
78Error BlockIndexer::visit(FunctionRecord &R) {
79  CurrentBlock.Records.push_back(&R);
80  return Error::success();
81}
82
83Error BlockIndexer::flush() {
84  Index::iterator It;
85  std::tie(It, std::ignore) =
86      Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}});
87  It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID,
88                        CurrentBlock.WallclockTime,
89                        std::move(CurrentBlock.Records)});
90  CurrentBlock.ProcessID = 0;
91  CurrentBlock.ThreadID = 0;
92  CurrentBlock.Records = {};
93  CurrentBlock.WallclockTime = nullptr;
94  return Error::success();
95}
96
97} // namespace xray
98} // namespace llvm
99