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)