LLVM: include/llvm/MC/MCPseudoProbe.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54#ifndef LLVM_MC_MCPSEUDOPROBE_H
55#define LLVM_MC_MCPSEUDOPROBE_H
56
67#include
68#include
69#include
70#include
71#include <type_traits>
72#include <unordered_map>
73#include
74
75namespace llvm {
76
80
86
87
98
99class MCDecodedPseudoProbe;
100
101
102using InlineSite = std::tuple<uint64_t, uint32_t>;
104
106public:
109 return Desc.FuncGUID < GUID;
110 };
112 if (It->FuncGUID != GUID)
113 return end();
114 return It;
115 }
116};
117
118class MCDecodedPseudoProbeInlineTree;
119
121protected:
126
127
128
130
131public:
134
136
138
140
142
144
148
152
156
158
160};
161
162
163
164
165
169
170public:
174 Label(Label) {
175 assert(Type <= 0xFF && "Probe type too big to encode, exceeding 2^8");
177 "Probe attributes too big to encode, exceeding 2^16");
178 }
179
184};
185
186
188
192
193public:
199
201
203
205 return InlineTree;
206 }
207
208
209
210
214
215
218
219
221 bool ShowName) const;
222};
223
224
226 : public std::vector<std::reference_wrapper> {
227 auto getIt(uint64_t Addr) const {
230 };
232 }
233
234public:
235
239
241 auto FromIt = getIt(Address);
242 if (FromIt == end() || FromIt->get().getAddress() != Address)
244 auto ToIt = getIt(Address + 1);
246 }
247};
248
249template <typename ProbesType, typename DerivedProbeInlineTreeType,
250 typename InlinedProbeTreeMap>
252protected:
253
255
259 DerivedProbeInlineTreeType>::value,
260 "DerivedProbeInlineTreeType must be subclass of "
261 "MCPseudoProbeInlineTreeBase");
262 }
263
264public:
266
267
272
274 InlinedProbeTreeMap> *Parent = nullptr;
277 Site, std::make_unique(Site));
278 Ret.first->second->Parent = this;
279 return Ret.first->second.get();
280 };
281};
282
283
284
285
286
287
290 return std::get<0>(Site) ^ std::get<1>(Site);
291 }
292};
295 std::vector, MCPseudoProbeInlineTree,
296 std::unordered_map<InlineSite,
297 std::unique_ptr,
298 InlineSiteHash>> {
299public:
303 this->Guid = std::get<0>(Site);
304 }
305
306
310};
311
312
315 MCDecodedPseudoProbe *, MCDecodedPseudoProbeInlineTree,
316 MutableArrayRef> {
319
320public:
324 : ProbeId(std::get<1>(Site)) {
325 this->Guid = std::get<0>(Site);
326 this->Parent = Parent;
327 }
328
329
335 NumProbes = ProbesRef.size();
336 }
340};
341
342
343
345public:
348 MCProbeDivisions[FuncSym].addPseudoProbe(Probe, InlineStack);
349 }
350
351
352
353 using MCProbeDivisionMap = std::unordered_map<MCSymbol *, MCPseudoProbeInlineTree>;
354
355private:
356
357
358
360
361public:
363
364 bool empty() const { return MCProbeDivisions.empty(); }
365
367};
368
370
371
372
373
374
375
377
378public:
380
382
383#ifndef NDEBUG
385#endif
386};
387
389
390 std::vector PseudoProbeVec;
391
392
393
394
395
396
398 std::vector>
399 InjectedProbeMap;
400
401 std::vector InlineTreeVec;
402
403
405
407
408
410
411
412
413
414
416
417
418 const uint8_t *Data = nullptr;
419
420
421 const uint8_t *End = nullptr;
422
423
424 bool EncodingIsAddrBased = false;
425
426
427 template ErrorOr readUnencodedNumber();
428 template ErrorOr readUnsignedNumber();
429 template ErrorOr readSignedNumber();
431
432public:
435
436
437
438
440 bool IsMMapped = false);
441
442
443
444 template
447
448
449
452 const Uint64Map &FuncStartAddrs);
453
454
456
457
459
460
462
463
466
468
469
470
471
472
473
474
475
479 bool IncludeLeaf) const;
480
482 return Address2ProbesMap;
483 }
484
486
488 return GUID2FuncDescMap;
489 }
490
493
495 return DummyInlineRoot;
496 }
497
500 InjectedProbeMap[Parent].emplace_back(Probe).setAddress(Address);
501 }
502
503 size_t
505 auto It = InjectedProbeMap.find(Parent);
506 if (It == InjectedProbeMap.end())
507 return 0;
508 return It->second.size();
509 }
510
512 auto It = InjectedProbeMap.find(Parent);
513 assert(It != InjectedProbeMap.end());
515 }
516
518 return InlineTreeVec;
519 }
520
521private:
522
523
524 template
528 const uint32_t CurChildIndex);
529};
530
531}
532
533#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
Provides ErrorOr smart pointer.
This file defines the SmallVector class.
Definition MCPseudoProbe.h:226
auto find(uint64_t Address) const
Definition MCPseudoProbe.h:240
auto find(uint64_t From, uint64_t To) const
Definition MCPseudoProbe.h:236
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Implements a dense probed hash-table based set.
Represents either an error or a value T.
Definition MCPseudoProbe.h:105
auto find(uint64_t GUID) const
Definition MCPseudoProbe.h:107
Definition MCPseudoProbe.h:316
InlineSite getInlineSite() const
Definition MCPseudoProbe.h:332
MCDecodedPseudoProbeInlineTree()=default
bool hasInlineSite() const
Definition MCPseudoProbe.h:330
MCDecodedPseudoProbeInlineTree(const InlineSite &Site, MCDecodedPseudoProbeInlineTree *Parent)
Definition MCPseudoProbe.h:322
void setProbes(MutableArrayRef< MCDecodedPseudoProbe > ProbesRef)
Definition MCPseudoProbe.h:333
bool isTopLevelFunc() const
Definition MCPseudoProbe.h:331
auto getProbes() const
Definition MCPseudoProbe.h:337
Definition MCPseudoProbe.h:189
LLVM_ABI void print(raw_ostream &OS, const GUIDProbeFunctionMap &GUID2FuncMAP, bool ShowName) const
void setAddress(uint64_t Addr)
Definition MCPseudoProbe.h:202
LLVM_ABI uint64_t getGuid() const
MCDecodedPseudoProbe(uint64_t Ad, uint32_t I, PseudoProbeType K, uint8_t At, uint32_t D, MCDecodedPseudoProbeInlineTree *Tree)
Definition MCPseudoProbe.h:194
LLVM_ABI std::string getInlineContextStr(const GUIDProbeFunctionMap &GUID2FuncMAP) const
MCDecodedPseudoProbeInlineTree * getInlineTreeNode() const
Definition MCPseudoProbe.h:204
LLVM_ABI void getInlineContext(SmallVectorImpl< MCPseudoProbeFrameLocation > &ContextStack, const GUIDProbeFunctionMap &GUID2FuncMAP) const
uint64_t getAddress() const
Definition MCPseudoProbe.h:200
Streaming object file generation interface.
uint32_t getIndex() const
Definition MCPseudoProbe.h:137
bool isCall() const
Definition MCPseudoProbe.h:157
uint8_t getType() const
Definition MCPseudoProbe.h:143
uint8_t Type
Definition MCPseudoProbe.h:125
uint8_t Attributes
Definition MCPseudoProbe.h:124
uint32_t Index
Definition MCPseudoProbe.h:122
uint8_t getAttributes() const
Definition MCPseudoProbe.h:141
bool isEntry() const
Definition MCPseudoProbe.h:135
uint32_t getDiscriminator() const
Definition MCPseudoProbe.h:139
MCPseudoProbeBase(uint64_t I, uint64_t At, uint8_t T, uint32_t D)
Definition MCPseudoProbe.h:132
bool isDirectCall() const
Definition MCPseudoProbe.h:153
bool isIndirectCall() const
Definition MCPseudoProbe.h:149
uint32_t Discriminator
Definition MCPseudoProbe.h:123
void setAttributes(uint8_t Attr)
Definition MCPseudoProbe.h:159
static const uint32_t PseudoProbeFirstId
Definition MCPseudoProbe.h:129
bool isBlock() const
Definition MCPseudoProbe.h:145
Definition MCPseudoProbe.h:388
auto getInjectedProbes(MCDecodedPseudoProbeInlineTree *Parent)
Definition MCPseudoProbe.h:511
DenseSet< uint64_t > Uint64Set
Definition MCPseudoProbe.h:433
LLVM_ABI bool buildAddress2ProbeMap(const uint8_t *Start, std::size_t Size, const Uint64Set &GuildFilter, const Uint64Map &FuncStartAddrs)
const AddressProbesMap & getAddress2ProbesMap() const
Definition MCPseudoProbe.h:481
LLVM_ABI void printProbesForAllAddresses(raw_ostream &OS)
size_t getNumInjectedProbes(const MCDecodedPseudoProbeInlineTree *Parent) const
Definition MCPseudoProbe.h:504
const GUIDProbeFunctionMap & getGUID2FuncDescMap() const
Definition MCPseudoProbe.h:487
const MCDecodedPseudoProbeInlineTree & getDummyInlineRoot() const
Definition MCPseudoProbe.h:494
LLVM_ABI void printGUID2FuncDescMap(raw_ostream &OS)
DenseMap< uint64_t, uint64_t > Uint64Map
Definition MCPseudoProbe.h:434
LLVM_ABI bool buildGUID2FuncDescMap(const uint8_t *Start, std::size_t Size, bool IsMMapped=false)
LLVM_ABI void printProbeForAddress(raw_ostream &OS, uint64_t Address)
ArrayRef< MCDecodedPseudoProbeInlineTree > getInlineTreeVec() const
Definition MCPseudoProbe.h:517
LLVM_ABI void getInlineContextForProbe(const MCDecodedPseudoProbe *Probe, SmallVectorImpl< MCPseudoProbeFrameLocation > &InlineContextStack, bool IncludeLeaf) const
AddressProbesMap & getAddress2ProbesMap()
Definition MCPseudoProbe.h:485
LLVM_ABI const MCPseudoProbeFuncDesc * getInlinerDescForProbe(const MCDecodedPseudoProbe *Probe) const
bool countRecords(bool &Discard, uint32_t &ProbeCount, uint32_t &InlinedCount, const Uint64Set &GuidFilter)
void addInjectedProbe(const MCDecodedPseudoProbe &Probe, uint64_t Address)
Definition MCPseudoProbe.h:498
LLVM_ABI const MCDecodedPseudoProbe * getCallProbeForAddr(uint64_t Address) const
LLVM_ABI const MCPseudoProbeFuncDesc * getFuncDescForGUID(uint64_t GUID) const
Definition MCPseudoProbe.h:251
uint64_t Guid
Definition MCPseudoProbe.h:265
InlinedProbeTreeMap Children
Definition MCPseudoProbe.h:254
DerivedProbeInlineTreeType * getOrAddNode(const InlineSite &Site)
Definition MCPseudoProbe.h:275
bool isRoot() const
Definition MCPseudoProbe.h:268
ProbesType Probes
Definition MCPseudoProbe.h:256
MCPseudoProbeInlineTreeBase< ProbesType, DerivedProbeInlineTreeType, InlinedProbeTreeMap > * Parent
Definition MCPseudoProbe.h:274
MCPseudoProbeInlineTreeBase()
Definition MCPseudoProbe.h:257
const InlinedProbeTreeMap & getChildren() const
Definition MCPseudoProbe.h:270
InlinedProbeTreeMap & getChildren()
Definition MCPseudoProbe.h:269
const ProbesType & getProbes() const
Definition MCPseudoProbe.h:271
MCPseudoProbeInlineTree()=default
LLVM_ABI void emit(MCObjectStreamer *MCOS, const MCPseudoProbe *&LastProbe)
MCPseudoProbeInlineTree(uint64_t Guid)
Definition MCPseudoProbe.h:301
LLVM_ABI void addPseudoProbe(const MCPseudoProbe &Probe, const MCPseudoProbeInlineStack &InlineStack)
MCPseudoProbeInlineTree(const InlineSite &Site)
Definition MCPseudoProbe.h:302
Instances of this class represent the pseudo probes inserted into a compile unit.
Definition MCPseudoProbe.h:344
void addPseudoProbe(MCSymbol *FuncSym, const MCPseudoProbe &Probe, const MCPseudoProbeInlineStack &InlineStack)
Definition MCPseudoProbe.h:346
LLVM_ABI void emit(MCObjectStreamer *MCOS)
const MCProbeDivisionMap & getMCProbes() const
Definition MCPseudoProbe.h:362
bool empty() const
Definition MCPseudoProbe.h:364
std::unordered_map< MCSymbol *, MCPseudoProbeInlineTree > MCProbeDivisionMap
Definition MCPseudoProbe.h:353
Definition MCPseudoProbe.h:369
MCPseudoProbeSections & getProbeSections()
Definition MCPseudoProbe.h:381
static int DdgPrintIndent
Definition MCPseudoProbe.h:384
static LLVM_ABI void emit(MCObjectStreamer *MCOS)
Instances of this class represent a pseudo probe instance for a pseudo probe table entry,...
Definition MCPseudoProbe.h:166
MCSymbol * getLabel() const
Definition MCPseudoProbe.h:181
LLVM_ABI void emit(MCObjectStreamer *MCOS, const MCPseudoProbe *LastProbe) const
MCPseudoProbe(MCSymbol *Label, uint64_t Guid, uint64_t Index, uint64_t Type, uint64_t Attributes, uint32_t Discriminator)
Definition MCPseudoProbe.h:171
uint64_t getGuid() const
Definition MCPseudoProbe.h:180
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
std::tuple< uint64_t, uint32_t > InlineSite
Definition MCPseudoProbe.h:102
std::pair< StringRef, uint32_t > MCPseudoProbeFrameLocation
Definition MCPseudoProbe.h:187
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
SmallVector< InlineSite, 8 > MCPseudoProbeInlineStack
Definition MCPseudoProbe.h:103
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
MCPseudoProbeFlag
Definition MCPseudoProbe.h:81
@ AddressDelta
Definition MCPseudoProbe.h:84
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Implement std::hash so that hash_code can be used in STL containers.
Definition MCPseudoProbe.h:288
uint64_t operator()(const InlineSite &Site) const
Definition MCPseudoProbe.h:289
Definition MCPseudoProbe.h:88
uint64_t FuncHash
Definition MCPseudoProbe.h:90
StringRef FuncName
Definition MCPseudoProbe.h:91
MCPseudoProbeFuncDesc(uint64_t GUID, uint64_t Hash, StringRef Name)
Definition MCPseudoProbe.h:93
uint64_t FuncGUID
Definition MCPseudoProbe.h:89
LLVM_ABI void print(raw_ostream &OS)