1705a4c14SHongtao Yu //===- llvm/CodeGen/PseudoProbePrinter.cpp - Pseudo Probe Emission -------===//
2705a4c14SHongtao Yu //
3705a4c14SHongtao Yu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4705a4c14SHongtao Yu // See https://llvm.org/LICENSE.txt for license information.
5705a4c14SHongtao Yu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6705a4c14SHongtao Yu //
7705a4c14SHongtao Yu //===----------------------------------------------------------------------===//
8705a4c14SHongtao Yu //
9705a4c14SHongtao Yu // This file contains support for writing pseudo probe info into asm files.
10705a4c14SHongtao Yu //
11705a4c14SHongtao Yu //===----------------------------------------------------------------------===//
12705a4c14SHongtao Yu
13705a4c14SHongtao Yu #include "PseudoProbePrinter.h"
14705a4c14SHongtao Yu #include "llvm/CodeGen/AsmPrinter.h"
15705a4c14SHongtao Yu #include "llvm/IR/DebugInfoMetadata.h"
16*ed98c1b3Sserge-sans-paille #include "llvm/IR/Function.h"
17705a4c14SHongtao Yu #include "llvm/IR/PseudoProbe.h"
18705a4c14SHongtao Yu #include "llvm/MC/MCPseudoProbe.h"
19705a4c14SHongtao Yu #include "llvm/MC/MCStreamer.h"
20705a4c14SHongtao Yu
21705a4c14SHongtao Yu using namespace llvm;
22705a4c14SHongtao Yu
23f39256e3SHongtao Yu PseudoProbeHandler::~PseudoProbeHandler() = default;
24f39256e3SHongtao Yu
emitPseudoProbe(uint64_t Guid,uint64_t Index,uint64_t Type,uint64_t Attr,const DILocation * DebugLoc)25705a4c14SHongtao Yu void PseudoProbeHandler::emitPseudoProbe(uint64_t Guid, uint64_t Index,
26705a4c14SHongtao Yu uint64_t Type, uint64_t Attr,
27705a4c14SHongtao Yu const DILocation *DebugLoc) {
28705a4c14SHongtao Yu // Gather all the inlined-at nodes.
29705a4c14SHongtao Yu // When it's done ReversedInlineStack looks like ([66, B], [88, A])
30705a4c14SHongtao Yu // which means, Function A inlines function B at calliste with a probe id 88,
31705a4c14SHongtao Yu // and B inlines C at probe 66 where C is represented by Guid.
32705a4c14SHongtao Yu SmallVector<InlineSite, 8> ReversedInlineStack;
33705a4c14SHongtao Yu auto *InlinedAt = DebugLoc ? DebugLoc->getInlinedAt() : nullptr;
34705a4c14SHongtao Yu while (InlinedAt) {
35705a4c14SHongtao Yu const DISubprogram *SP = InlinedAt->getScope()->getSubprogram();
36705a4c14SHongtao Yu // Use linkage name for C++ if possible.
37705a4c14SHongtao Yu auto Name = SP->getLinkageName();
38705a4c14SHongtao Yu if (Name.empty())
39705a4c14SHongtao Yu Name = SP->getName();
40f39256e3SHongtao Yu // Use caching to avoid redundant md5 computation for build speed.
41f39256e3SHongtao Yu uint64_t &CallerGuid = NameGuidMap[Name];
42f39256e3SHongtao Yu if (!CallerGuid)
43f39256e3SHongtao Yu CallerGuid = Function::getGUID(Name);
44705a4c14SHongtao Yu uint64_t CallerProbeId = PseudoProbeDwarfDiscriminator::extractProbeIndex(
45705a4c14SHongtao Yu InlinedAt->getDiscriminator());
46705a4c14SHongtao Yu ReversedInlineStack.emplace_back(CallerGuid, CallerProbeId);
47705a4c14SHongtao Yu InlinedAt = InlinedAt->getInlinedAt();
48705a4c14SHongtao Yu }
49705a4c14SHongtao Yu
50500c4b68SKazu Hirata SmallVector<InlineSite, 8> InlineStack(llvm::reverse(ReversedInlineStack));
51705a4c14SHongtao Yu Asm->OutStreamer->emitPseudoProbe(Guid, Index, Type, Attr, InlineStack);
52705a4c14SHongtao Yu }
53