| //===- llvm/CodeGen/PseudoProbePrinter.cpp - Pseudo Probe Emission -------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains support for writing pseudo probe info into asm files. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "PseudoProbePrinter.h" |
| #include "llvm/CodeGen/AsmPrinter.h" |
| #include "llvm/IR/DebugInfoMetadata.h" |
| #include "llvm/IR/Function.h" |
| #include "llvm/IR/PseudoProbe.h" |
| #include "llvm/MC/MCPseudoProbe.h" |
| #include "llvm/MC/MCStreamer.h" |
| |
| using namespace llvm; |
| |
| PseudoProbeHandler::~PseudoProbeHandler() = default; |
| |
| void PseudoProbeHandler::emitPseudoProbe(uint64_t Guid, uint64_t Index, |
| uint64_t Type, uint64_t Attr, |
| const DILocation *DebugLoc) { |
| // Gather all the inlined-at nodes. |
| // When it's done ReversedInlineStack looks like ([66, B], [88, A]) |
| // which means, Function A inlines function B at calliste with a probe id 88, |
| // and B inlines C at probe 66 where C is represented by Guid. |
| SmallVector<InlineSite, 8> ReversedInlineStack; |
| auto *InlinedAt = DebugLoc ? DebugLoc->getInlinedAt() : nullptr; |
| while (InlinedAt) { |
| const DISubprogram *SP = InlinedAt->getScope()->getSubprogram(); |
| // Use linkage name for C++ if possible. |
| auto Name = SP->getLinkageName(); |
| if (Name.empty()) |
| Name = SP->getName(); |
| // Use caching to avoid redundant md5 computation for build speed. |
| uint64_t &CallerGuid = NameGuidMap[Name]; |
| if (!CallerGuid) |
| CallerGuid = Function::getGUID(Name); |
| uint64_t CallerProbeId = PseudoProbeDwarfDiscriminator::extractProbeIndex( |
| InlinedAt->getDiscriminator()); |
| ReversedInlineStack.emplace_back(CallerGuid, CallerProbeId); |
| InlinedAt = InlinedAt->getInlinedAt(); |
| } |
| |
| SmallVector<InlineSite, 8> InlineStack(llvm::reverse(ReversedInlineStack)); |
| Asm->OutStreamer->emitPseudoProbe(Guid, Index, Type, Attr, InlineStack, |
| Asm->CurrentFnSym); |
| } |