Previously we reliedy on pseudo probe descriptors to look up precomputed GUID during probe emission for inlined probes. Since we are moving to always using unique linkage names, GUID for functions can be computed in place from dwarf names. This eliminates the need of importing pseudo probe descs in thinlto, since those descs should be emitted by the original modules. This significantly reduces thinlto memory footprint in some extreme case where the number of imported modules for a single module is massive. Test Plan: Reviewed By: wenlei Differential Revision: https://reviews.llvm.org/D105248
49 lines
2.1 KiB
C++
49 lines
2.1 KiB
C++
//===- 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/Module.h"
|
|
#include "llvm/IR/PseudoProbe.h"
|
|
#include "llvm/MC/MCPseudoProbe.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
|
|
using namespace llvm;
|
|
|
|
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();
|
|
uint64_t CallerGuid = Function::getGUID(Name);
|
|
uint64_t CallerProbeId = PseudoProbeDwarfDiscriminator::extractProbeIndex(
|
|
InlinedAt->getDiscriminator());
|
|
ReversedInlineStack.emplace_back(CallerGuid, CallerProbeId);
|
|
InlinedAt = InlinedAt->getInlinedAt();
|
|
}
|
|
|
|
SmallVector<InlineSite, 8> InlineStack(ReversedInlineStack.rbegin(),
|
|
ReversedInlineStack.rend());
|
|
Asm->OutStreamer->emitPseudoProbe(Guid, Index, Type, Attr, InlineStack);
|
|
}
|