
See https://discourse.llvm.org/t/rfc-keep-globalvalue-guids-stable/84801 for context. This is a non-functional change which just changes the interface of GlobalValue, in preparation for future functional changes. This part touches a fair few users, so is split out for ease of review. Future changes to the GlobalValue implementation can then be focused purely on that class. This does the following: * Rename GlobalValue::getGUID(StringRef) to getGUIDAssumingExternalLinkage. This is simply making explicit at the callsite what is currently implicit. * Where possible, migrate users to directly calling getGUID on a GlobalValue instance. * Otherwise, where possible, have them call the newly renamed getGUIDAssumingExternalLinkage, to make the assumption explicit. There are a few cases where neither of the above are possible, as the caller saves and reconstructs the necessary information to compute the GUID themselves. We want to migrate these callers eventually, but for this first step we leave them be.
55 lines
2.5 KiB
C++
55 lines
2.5 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/Function.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) {
|
|
auto Name = InlinedAt->getSubprogramLinkageName();
|
|
// Use caching to avoid redundant md5 computation for build speed.
|
|
uint64_t &CallerGuid = NameGuidMap[Name];
|
|
if (!CallerGuid)
|
|
CallerGuid = Function::getGUIDAssumingExternalLinkage(Name);
|
|
uint64_t CallerProbeId = PseudoProbeDwarfDiscriminator::extractProbeIndex(
|
|
InlinedAt->getDiscriminator());
|
|
ReversedInlineStack.emplace_back(CallerGuid, CallerProbeId);
|
|
InlinedAt = InlinedAt->getInlinedAt();
|
|
}
|
|
uint64_t Discriminator = 0;
|
|
// For now only block probes have FS discriminators. See
|
|
// MIRFSDiscriminator.cpp for more details.
|
|
if (EnableFSDiscriminator && DebugLoc &&
|
|
(Type == (uint64_t)PseudoProbeType::Block))
|
|
Discriminator = DebugLoc->getDiscriminator();
|
|
assert((EnableFSDiscriminator || Discriminator == 0) &&
|
|
"Discriminator should not be set in non-FSAFDO mode");
|
|
SmallVector<InlineSite, 8> InlineStack(llvm::reverse(ReversedInlineStack));
|
|
Asm->OutStreamer->emitPseudoProbe(Guid, Index, Type, Attr, Discriminator,
|
|
InlineStack, Asm->CurrentFnSym);
|
|
}
|