blob: a99a6815f0d16b7be85d63b9ec46546a3e69193f [file] [log] [blame]
Dean Michael Berris02f097e2018-09-06 05:55:57 +00001//===- BlockIndexer.cpp - FDR Block Indexing VIsitor ----------------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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-exception
Dean Michael Berris02f097e2018-09-06 05:55:57 +00006//
7//===----------------------------------------------------------------------===//
8//
9// An implementation of the RecordVisitor which generates a mapping between a
10// thread and a range of records representing a block.
11//
12//===----------------------------------------------------------------------===//
13#include "llvm/XRay/BlockIndexer.h"
14
15namespace llvm {
16namespace xray {
17
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000018Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }
Dean Michael Berris02f097e2018-09-06 05:55:57 +000019
20Error BlockIndexer::visit(WallclockRecord &R) {
21 CurrentBlock.Records.push_back(&R);
Dean Michael Berris985c2b92018-09-11 06:45:59 +000022 CurrentBlock.WallclockTime = &R;
Dean Michael Berris02f097e2018-09-06 05:55:57 +000023 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
Dean Michael Berris59439dd2018-11-07 04:37:42 +000041Error 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
Dean Michael Berris02f097e2018-09-06 05:55:57 +000051Error BlockIndexer::visit(CallArgRecord &R) {
52 CurrentBlock.Records.push_back(&R);
53 return Error::success();
Simon Pilgrim6088e852018-09-06 15:15:28 +000054}
Dean Michael Berris02f097e2018-09-06 05:55:57 +000055
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) {
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000063 if (!CurrentBlock.Records.empty())
64 if (auto E = flush())
65 return E;
66
Dean Michael Berris02f097e2018-09-06 05:55:57 +000067 CurrentBlock.ThreadID = R.tid();
68 CurrentBlock.Records.push_back(&R);
69 return Error::success();
70}
71
72Error BlockIndexer::visit(EndBufferRecord &R) {
Dean Michael Berris02f097e2018-09-06 05:55:57 +000073 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() {
Dean Michael Berris02f097e2018-09-06 05:55:57 +000083 Index::iterator It;
84 std::tie(It, std::ignore) =
85 Indices.insert({{CurrentBlock.ProcessID, CurrentBlock.ThreadID}, {}});
86 It->second.push_back({CurrentBlock.ProcessID, CurrentBlock.ThreadID,
Dean Michael Berris985c2b92018-09-11 06:45:59 +000087 CurrentBlock.WallclockTime,
Dean Michael Berris02f097e2018-09-06 05:55:57 +000088 std::move(CurrentBlock.Records)});
89 CurrentBlock.ProcessID = 0;
90 CurrentBlock.ThreadID = 0;
91 CurrentBlock.Records = {};
Dean Michael Berris90a46bd2018-09-13 09:25:42 +000092 CurrentBlock.WallclockTime = nullptr;
Dean Michael Berris02f097e2018-09-06 05:55:57 +000093 return Error::success();
94}
95
96} // namespace xray
97} // namespace llvm