LLVM
15.0.0git
lib
XRay
BlockIndexer.cpp
Go to the documentation of this file.
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.
11
//
12
//===----------------------------------------------------------------------===//
13
#include "
llvm/XRay/BlockIndexer.h
"
14
15
namespace
llvm
{
16
namespace
xray {
17
18
Error
BlockIndexer::visit
(
BufferExtents
&) {
return
Error::success
(); }
19
20
Error
BlockIndexer::visit
(
WallclockRecord
&R) {
21
CurrentBlock.
Records
.push_back(&R);
22
CurrentBlock.
WallclockTime
= &R;
23
return
Error::success
();
24
}
25
26
Error
BlockIndexer::visit
(
NewCPUIDRecord
&R) {
27
CurrentBlock.
Records
.push_back(&R);
28
return
Error::success
();
29
}
30
31
Error
BlockIndexer::visit
(
TSCWrapRecord
&R) {
32
CurrentBlock.
Records
.push_back(&R);
33
return
Error::success
();
34
}
35
36
Error
BlockIndexer::visit
(
CustomEventRecord
&R) {
37
CurrentBlock.
Records
.push_back(&R);
38
return
Error::success
();
39
}
40
41
Error
BlockIndexer::visit
(
CustomEventRecordV5
&R) {
42
CurrentBlock.
Records
.push_back(&R);
43
return
Error::success
();
44
}
45
46
Error
BlockIndexer::visit
(
TypedEventRecord
&R) {
47
CurrentBlock.
Records
.push_back(&R);
48
return
Error::success
();
49
}
50
51
Error
BlockIndexer::visit
(
CallArgRecord
&R) {
52
CurrentBlock.
Records
.push_back(&R);
53
return
Error::success
();
54
}
55
56
Error
BlockIndexer::visit
(
PIDRecord
&R) {
57
CurrentBlock.
ProcessID
= R.pid();
58
CurrentBlock.
Records
.push_back(&R);
59
return
Error::success
();
60
}
61
62
Error
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
72
Error
BlockIndexer::visit
(
EndBufferRecord
&R) {
73
CurrentBlock.
Records
.push_back(&R);
74
return
Error::success
();
75
}
76
77
Error
BlockIndexer::visit
(
FunctionRecord
&R) {
78
CurrentBlock.
Records
.push_back(&R);
79
return
Error::success
();
80
}
81
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
();
94
}
95
96
}
// namespace xray
97
}
// namespace llvm
llvm::xray::BlockIndexer::visit
Error visit(BufferExtents &) override
Definition:
BlockIndexer.cpp:18
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:
AddressRanges.h:17
llvm::xray::FunctionRecord
Definition:
FDRRecords.h:372
llvm::xray::PIDRecord
Definition:
FDRRecords.h:313
llvm::Error::success
static ErrorSuccess success()
Create a success value.
Definition:
Error.h:329
llvm::DenseMapIterator
Definition:
DenseMap.h:57
BlockIndexer.h
llvm::xray::BufferExtents
Definition:
FDRRecords.h:110
llvm::xray::NewCPUIDRecord
Definition:
FDRRecords.h:158
llvm::xray::BlockIndexer::Block::ProcessID
uint64_t ProcessID
Definition:
BlockIndexer.h:29
llvm::xray::BlockIndexer::flush
Error flush()
The flush() function will clear out the current state of the visitor, to allow for explicitly flushin...
Definition:
BlockIndexer.cpp:82
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
llvm::xray::NewBufferRecord
Definition:
FDRRecords.h:336
llvm::xray::BlockIndexer::Block::ThreadID
int32_t ThreadID
Definition:
BlockIndexer.h:30
move
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
Definition:
README.txt:546
llvm::xray::EndBufferRecord
Definition:
FDRRecords.h:359
llvm::xray::WallclockRecord
Definition:
FDRRecords.h:133
llvm::xray::BlockIndexer::Block::Records
std::vector< Record * > Records
Definition:
BlockIndexer.h:32
llvm::xray::CallArgRecord
Definition:
FDRRecords.h:291
llvm::xray::TypedEventRecord
Definition:
FDRRecords.h:262
llvm::xray::TSCWrapRecord
Definition:
FDRRecords.h:184
llvm::xray::BlockIndexer::Block::WallclockTime
WallclockRecord * WallclockTime
Definition:
BlockIndexer.h:31
llvm::DenseMapBase::insert
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition:
DenseMap.h:209
llvm::Error
Lightweight error class with error context and mandatory checking.
Definition:
Error.h:155
llvm::xray::CustomEventRecord
Definition:
FDRRecords.h:206
llvm::xray::CustomEventRecordV5
Definition:
FDRRecords.h:235
Generated on Tue Jul 5 2022 09:51:32 for LLVM by
1.8.17