blob: 4dbe2d2717ad1cd88a445197870665249a33f164 [file] [log] [blame]
Dean Michael Berris02f097e2018-09-06 05:55:57 +00001//===- 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
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000019Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }
Dean Michael Berris02f097e2018-09-06 05:55:57 +000020
21Error BlockIndexer::visit(WallclockRecord &R) {
22 CurrentBlock.Records.push_back(&R);
Dean Michael Berris985c2b92018-09-11 06:45:59 +000023 CurrentBlock.WallclockTime = &R;
Dean Michael Berris02f097e2018-09-06 05:55:57 +000024 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
Dean Michael Berris59439dd2018-11-07 04:37:42 +000042Error 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
Dean Michael Berris02f097e2018-09-06 05:55:57 +000052Error BlockIndexer::visit(CallArgRecord &R) {
53 CurrentBlock.Records.push_back(&R);
54 return Error::success();
Simon Pilgrim6088e852018-09-06 15:15:28 +000055}
Dean Michael Berris02f097e2018-09-06 05:55:57 +000056
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) {
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000064 if (!CurrentBlock.Records.empty())
65 if (auto E = flush())
66 return E;
67
Dean Michael Berris02f097e2018-09-06 05:55:57 +000068 CurrentBlock.ThreadID = R.tid();
69 CurrentBlock.Records.push_back(&R);
70 return Error::success();
71}
72
73Error BlockIndexer::visit(EndBufferRecord &R) {
Dean Michael Berris02f097e2018-09-06 05:55:57 +000074 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() {
Dean Michael Berris02f097e2018-09-06 05:55:57 +000084 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,
Dean Michael Berris985c2b92018-09-11 06:45:59 +000088 CurrentBlock.WallclockTime,
Dean Michael Berris02f097e2018-09-06 05:55:57 +000089 std::move(CurrentBlock.Records)});
90 CurrentBlock.ProcessID = 0;
91 CurrentBlock.ThreadID = 0;
92 CurrentBlock.Records = {};
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000093 CurrentBlock.WallclockTime = nullptr;
Dean Michael Berris02f097e2018-09-06 05:55:57 +000094 return Error::success();
95}
96
97} // namespace xray
98} // namespace llvm