[llvm-objcopy] - Reimplement strip-dwo-groups.test to stop using the precompiled...
[llvm-complete.git] / lib / XRay / BlockIndexer.cpp
bloba99a6815f0d16b7be85d63b9ec46546a3e69193f
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // An implementation of the RecordVisitor which generates a mapping between a
10 // thread and a range of records representing a block.
12 //===----------------------------------------------------------------------===//
13 #include "llvm/XRay/BlockIndexer.h"
15 namespace llvm {
16 namespace xray {
18 Error BlockIndexer::visit(BufferExtents &) { return Error::success(); }
20 Error BlockIndexer::visit(WallclockRecord &R) {
21 CurrentBlock.Records.push_back(&R);
22 CurrentBlock.WallclockTime = &R;
23 return Error::success();
26 Error BlockIndexer::visit(NewCPUIDRecord &R) {
27 CurrentBlock.Records.push_back(&R);
28 return Error::success();
31 Error BlockIndexer::visit(TSCWrapRecord &R) {
32 CurrentBlock.Records.push_back(&R);
33 return Error::success();
36 Error BlockIndexer::visit(CustomEventRecord &R) {
37 CurrentBlock.Records.push_back(&R);
38 return Error::success();
41 Error BlockIndexer::visit(CustomEventRecordV5 &R) {
42 CurrentBlock.Records.push_back(&R);
43 return Error::success();
46 Error BlockIndexer::visit(TypedEventRecord &R) {
47 CurrentBlock.Records.push_back(&R);
48 return Error::success();
51 Error BlockIndexer::visit(CallArgRecord &R) {
52 CurrentBlock.Records.push_back(&R);
53 return Error::success();
56 Error BlockIndexer::visit(PIDRecord &R) {
57 CurrentBlock.ProcessID = R.pid();
58 CurrentBlock.Records.push_back(&R);
59 return Error::success();
62 Error BlockIndexer::visit(NewBufferRecord &R) {
63 if (!CurrentBlock.Records.empty())
64 if (auto E = flush())
65 return E;
67 CurrentBlock.ThreadID = R.tid();
68 CurrentBlock.Records.push_back(&R);
69 return Error::success();
72 Error BlockIndexer::visit(EndBufferRecord &R) {
73 CurrentBlock.Records.push_back(&R);
74 return Error::success();
77 Error BlockIndexer::visit(FunctionRecord &R) {
78 CurrentBlock.Records.push_back(&R);
79 return Error::success();
82 Error BlockIndexer::flush() {
83 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,
87 CurrentBlock.WallclockTime,
88 std::move(CurrentBlock.Records)});
89 CurrentBlock.ProcessID = 0;
90 CurrentBlock.ThreadID = 0;
91 CurrentBlock.Records = {};
92 CurrentBlock.WallclockTime = nullptr;
93 return Error::success();
96 } // namespace xray
97 } // namespace llvm