Skip to content

Commit 6193dd5

Browse files
authored
[PseudoProbe] Warn on illegal guid (#148564)
Check whether guid exists in pseudo probe desc when emitting pseudo probe.
1 parent f79d6b3 commit 6193dd5

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

llvm/lib/CodeGen/AsmPrinter/PseudoProbePrinter.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include "llvm/MC/MCPseudoProbe.h"
1919
#include "llvm/MC/MCStreamer.h"
2020

21+
#ifndef NDEBUG
22+
#include "llvm/IR/Module.h"
23+
#include "llvm/Support/WithColor.h"
24+
#endif
25+
2126
using namespace llvm;
2227

2328
void PseudoProbeHandler::emitPseudoProbe(uint64_t Guid, uint64_t Index,
@@ -35,6 +40,9 @@ void PseudoProbeHandler::emitPseudoProbe(uint64_t Guid, uint64_t Index,
3540
uint64_t &CallerGuid = NameGuidMap[Name];
3641
if (!CallerGuid)
3742
CallerGuid = Function::getGUIDAssumingExternalLinkage(Name);
43+
#ifndef NDEBUG
44+
verifyGuidExistenceInDesc(CallerGuid, Name);
45+
#endif
3846
uint64_t CallerProbeId = PseudoProbeDwarfDiscriminator::extractProbeIndex(
3947
InlinedAt->getDiscriminator());
4048
ReversedInlineStack.emplace_back(CallerGuid, CallerProbeId);
@@ -51,4 +59,28 @@ void PseudoProbeHandler::emitPseudoProbe(uint64_t Guid, uint64_t Index,
5159
SmallVector<InlineSite, 8> InlineStack(llvm::reverse(ReversedInlineStack));
5260
Asm->OutStreamer->emitPseudoProbe(Guid, Index, Type, Attr, Discriminator,
5361
InlineStack, Asm->CurrentFnSym);
62+
#ifndef NDEBUG
63+
verifyGuidExistenceInDesc(
64+
Guid, DebugLoc ? DebugLoc->getSubprogramLinkageName() : "");
65+
#endif
66+
}
67+
68+
#ifndef NDEBUG
69+
void PseudoProbeHandler::verifyGuidExistenceInDesc(uint64_t Guid,
70+
StringRef FuncName) {
71+
NamedMDNode *Desc = Asm->MF->getFunction().getParent()->getNamedMetadata(
72+
PseudoProbeDescMetadataName);
73+
assert(Desc && "pseudo probe does not exist");
74+
75+
// Keep DescGuidSet up to date.
76+
for (size_t I = DescGuidSet.size(), E = Desc->getNumOperands(); I != E; ++I) {
77+
const auto *MD = cast<MDNode>(Desc->getOperand(I));
78+
auto *ID = mdconst::extract<ConstantInt>(MD->getOperand(0));
79+
DescGuidSet.insert(ID->getZExtValue());
80+
}
81+
82+
if (!DescGuidSet.contains(Guid))
83+
WithColor::warning() << "Guid:" << Guid << " Name:" << FuncName
84+
<< " does not exist in pseudo probe desc\n";
5485
}
86+
#endif

llvm/lib/CodeGen/AsmPrinter/PseudoProbePrinter.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515

1616
#include "llvm/ADT/DenseMap.h"
1717

18+
#ifndef NDEBUG
19+
#include "llvm/ADT/DenseSet.h"
20+
#endif
21+
1822
namespace llvm {
1923

2024
class AsmPrinter;
@@ -26,6 +30,13 @@ class PseudoProbeHandler {
2630
// Name to GUID map, used as caching/memoization for speed.
2731
DenseMap<StringRef, uint64_t> NameGuidMap;
2832

33+
#ifndef NDEBUG
34+
// All GUID in llvm.pseudo_probe_desc.
35+
DenseSet<uint64_t> DescGuidSet;
36+
37+
void verifyGuidExistenceInDesc(uint64_t Guid, StringRef FuncName);
38+
#endif
39+
2940
public:
3041
PseudoProbeHandler(AsmPrinter *A) : Asm(A) {};
3142

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s 2>&1 | FileCheck %s
2+
; RUN: llc -mtriple=x86_64-unknown-windows-msvc < %s 2>&1 | FileCheck %s
3+
4+
; CHECK: warning: Guid:8314849053352128226 Name:inlinee does not exist in pseudo probe desc
5+
; CHECK: warning: Guid:6492337042787843907 Name:extract2 does not exist in pseudo probe desc
6+
7+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
8+
9+
define void @extract1() !dbg !8 {
10+
entry:
11+
call void @llvm.pseudoprobe(i64 6028998432455395745, i64 1, i32 0, i64 -1), !dbg !11
12+
call void @llvm.pseudoprobe(i64 8314849053352128226, i64 1, i32 0, i64 -1), !dbg !12
13+
ret void, !dbg !16
14+
}
15+
16+
define void @extract2() !dbg !17 {
17+
entry:
18+
call void @llvm.pseudoprobe(i64 6492337042787843907, i64 1, i32 0, i64 -1), !dbg !18
19+
ret void, !dbg !18
20+
}
21+
22+
declare void @llvm.pseudoprobe(i64, i64, i32, i64)
23+
24+
!llvm.dbg.cu = !{!0}
25+
!llvm.module.flags = !{!2, !3, !4, !5, !6}
26+
!llvm.pseudo_probe_desc = !{!7}
27+
28+
!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang", isOptimized: false, emissionKind: LineTablesOnly, splitDebugInlining: false, nameTableKind: None)
29+
!1 = !DIFile(filename: "test.c", directory: "/home/foo")
30+
!2 = !{i32 7, !"Dwarf Version", i32 4}
31+
!3 = !{i32 2, !"Debug Info Version", i32 3}
32+
!4 = !{i32 1, !"wchar_size", i32 4}
33+
!5 = !{i32 7, !"uwtable", i32 2}
34+
!6 = !{i32 7, !"frame-pointer", i32 2}
35+
!7 = !{i64 6028998432455395745, i64 281479271677951, !"extract1"}
36+
!8 = distinct !DISubprogram(name: "extract1", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, spFlags: DISPFlagDefinition, unit: !0)
37+
!9 = !DISubroutineType(types: !10)
38+
!10 = !{}
39+
!11 = !DILocation(line: 5, column: 3, scope: !8)
40+
!12 = !DILocation(line: 2, column: 1, scope: !13, inlinedAt: !14)
41+
!13 = distinct !DISubprogram(name: "inlinee", scope: !1, file: !1, line: 1, type: !9, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0)
42+
!14 = distinct !DILocation(line: 5, column: 3, scope: !15)
43+
!15 = !DILexicalBlockFile(scope: !8, file: !1, discriminator: 455082007)
44+
!16 = !DILocation(line: 6, column: 1, scope: !8)
45+
!17 = distinct !DISubprogram(name: "extract2", scope: !1, file: !1, line: 8, type: !9, scopeLine: 8, spFlags: DISPFlagDefinition, unit: !0)
46+
!18 = !DILocation(line: 9, column: 1, scope: !17)

0 commit comments

Comments
 (0)