Skip to content

Commit 3cd890a

Browse files
[NFC] Move DroppedVariableStats to its own file
1 parent 6b21cf8 commit 3cd890a

File tree

5 files changed

+308
-253
lines changed

5 files changed

+308
-253
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
///===- DroppedVariableStats.h - Opt Diagnostics -*- C++ -*----------------===//
2+
///
3+
/// Part of the LLVM Project, under the Apache License v2.0 with LLVM
4+
/// Exceptions. See https://llvm.org/LICENSE.txt for license information.
5+
/// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
///
7+
///===---------------------------------------------------------------------===//
8+
/// \file
9+
/// Dropped Variable Statistics for Debug Information. Reports any number
10+
/// of #dbg_value that get dropped due to an optimization pass.
11+
///
12+
///===---------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
15+
#define LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
16+
17+
#include "llvm/CodeGen/MachinePassManager.h"
18+
#include "llvm/IR/DebugInfoMetadata.h"
19+
#include "llvm/IR/DiagnosticInfo.h"
20+
#include "llvm/IR/Function.h"
21+
#include "llvm/IR/Module.h"
22+
#include "llvm/IR/PassInstrumentation.h"
23+
24+
namespace llvm {
25+
26+
/// A class to collect and print dropped debug information variable statistics.
27+
/// After every LLVM IR pass is run, it will print how many #dbg_values were
28+
/// dropped due to that pass.
29+
class DroppedVariableStats {
30+
public:
31+
DroppedVariableStats(bool DroppedVarStatsEnabled)
32+
: DroppedVariableStatsEnabled(DroppedVarStatsEnabled) {
33+
if (DroppedVarStatsEnabled)
34+
llvm::outs()
35+
<< "Pass Level, Pass Name, Num of Dropped Variables, Func or "
36+
"Module Name\n";
37+
};
38+
// We intend this to be unique per-compilation, thus no copies.
39+
DroppedVariableStats(const DroppedVariableStats &) = delete;
40+
void operator=(const DroppedVariableStats &) = delete;
41+
42+
void registerCallbacks(PassInstrumentationCallbacks &PIC);
43+
void runBeforePass(StringRef PassID, Any IR);
44+
void runAfterPass(StringRef PassID, Any IR, const PreservedAnalyses &PA);
45+
void runAfterPassInvalidated(StringRef PassID, const PreservedAnalyses &PA);
46+
bool getPassDroppedVariables() { return PassDroppedVariables; }
47+
48+
private:
49+
bool PassDroppedVariables = false;
50+
bool DroppedVariableStatsEnabled = false;
51+
/// A unique key that represents a #dbg_value.
52+
using VarID =
53+
std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
54+
55+
struct DebugVariables {
56+
/// DenseSet of VarIDs before an optimization pass has run.
57+
DenseSet<VarID> DebugVariablesBefore;
58+
/// DenseSet of VarIDs after an optimization pass has run.
59+
DenseSet<VarID> DebugVariablesAfter;
60+
};
61+
62+
/// A stack of a DenseMap, that maps DebugVariables for every pass to an
63+
/// llvm::Function. A stack is used because an optimization pass can call
64+
/// other passes.
65+
SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
66+
67+
/// A DenseSet tracking whether a scope was visited before.
68+
DenseSet<const DIScope *> VisitedScope;
69+
/// A stack of DenseMaps, which map the name of an llvm::Function to a
70+
/// DenseMap of VarIDs and their inlinedAt locations before an optimization
71+
/// pass has run.
72+
SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
73+
74+
/// Iterate over all Functions in a Module and report any dropped debug
75+
/// information. Will call calculateDroppedVarStatsOnFunction on every
76+
/// Function.
77+
void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
78+
std::string FuncOrModName,
79+
std::string PassLevel);
80+
/// Iterate over all Instructions in a Function and report any dropped debug
81+
/// information.
82+
void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
83+
std::string FuncOrModName,
84+
std::string PassLevel);
85+
/// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
86+
/// after a pass has run to facilitate dropped variable calculation for an
87+
/// llvm::Function.
88+
void runOnFunction(const Function *F, bool Before);
89+
/// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
90+
/// after a pass has run to facilitate dropped variable calculation for an
91+
/// llvm::Module. Calls runOnFunction on every Function in the Module.
92+
void runOnModule(const Module *M, bool Before);
93+
/// Remove a dropped #dbg_value VarID from all Sets in the
94+
/// DroppedVariablesBefore stack.
95+
void removeVarFromAllSets(VarID Var, const Function *F);
96+
/// Return true if \p Scope is the same as \p DbgValScope or a child scope of
97+
/// \p DbgValScope, return false otherwise.
98+
bool isScopeChildOfOrEqualTo(DIScope *Scope, const DIScope *DbgValScope);
99+
/// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
100+
/// the InlinedAt chain, return false otherwise.
101+
bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
102+
const DILocation *DbgValInlinedAt);
103+
template <typename IRUnitT> static const IRUnitT *unwrapIR(Any IR) {
104+
const IRUnitT **IRPtr = llvm::any_cast<const IRUnitT *>(&IR);
105+
return IRPtr ? *IRPtr : nullptr;
106+
}
107+
};
108+
109+
} // namespace llvm
110+
111+
#endif

llvm/include/llvm/Passes/StandardInstrumentations.h

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/ADT/SmallVector.h"
2020
#include "llvm/ADT/StringRef.h"
2121
#include "llvm/ADT/StringSet.h"
22+
#include "llvm/CodeGen/DroppedVariableStats.h"
2223
#include "llvm/CodeGen/MachineBasicBlock.h"
2324
#include "llvm/IR/BasicBlock.h"
2425
#include "llvm/IR/DebugInfoMetadata.h"
@@ -579,83 +580,6 @@ class PrintCrashIRInstrumentation {
579580
static void SignalHandler(void *);
580581
};
581582

582-
/// A class to collect and print dropped debug information variable statistics.
583-
/// After every LLVM IR pass is run, it will print how many #dbg_values were
584-
/// dropped due to that pass.
585-
class DroppedVariableStats {
586-
public:
587-
DroppedVariableStats(bool DroppedVarStatsEnabled) {
588-
if (DroppedVarStatsEnabled)
589-
llvm::outs()
590-
<< "Pass Level, Pass Name, Num of Dropped Variables, Func or "
591-
"Module Name\n";
592-
};
593-
// We intend this to be unique per-compilation, thus no copies.
594-
DroppedVariableStats(const DroppedVariableStats &) = delete;
595-
void operator=(const DroppedVariableStats &) = delete;
596-
597-
void registerCallbacks(PassInstrumentationCallbacks &PIC);
598-
void runBeforePass(StringRef PassID, Any IR);
599-
void runAfterPass(StringRef PassID, Any IR, const PreservedAnalyses &PA);
600-
void runAfterPassInvalidated(StringRef PassID, const PreservedAnalyses &PA);
601-
bool getPassDroppedVariables() { return PassDroppedVariables; }
602-
603-
private:
604-
bool PassDroppedVariables = false;
605-
/// A unique key that represents a #dbg_value.
606-
using VarID =
607-
std::tuple<const DIScope *, const DIScope *, const DILocalVariable *>;
608-
609-
struct DebugVariables {
610-
/// DenseSet of VarIDs before an optimization pass has run.
611-
DenseSet<VarID> DebugVariablesBefore;
612-
/// DenseSet of VarIDs after an optimization pass has run.
613-
DenseSet<VarID> DebugVariablesAfter;
614-
};
615-
616-
/// A stack of a DenseMap, that maps DebugVariables for every pass to an
617-
/// llvm::Function. A stack is used because an optimization pass can call
618-
/// other passes.
619-
SmallVector<DenseMap<const Function *, DebugVariables>> DebugVariablesStack;
620-
621-
/// A DenseSet tracking whether a scope was visited before.
622-
DenseSet<const DIScope *> VisitedScope;
623-
/// A stack of DenseMaps, which map the name of an llvm::Function to a
624-
/// DenseMap of VarIDs and their inlinedAt locations before an optimization
625-
/// pass has run.
626-
SmallVector<DenseMap<StringRef, DenseMap<VarID, DILocation *>>> InlinedAts;
627-
628-
/// Iterate over all Functions in a Module and report any dropped debug
629-
/// information. Will call calculateDroppedVarStatsOnFunction on every
630-
/// Function.
631-
void calculateDroppedVarStatsOnModule(const Module *M, StringRef PassID,
632-
std::string FuncOrModName,
633-
std::string PassLevel);
634-
/// Iterate over all Instructions in a Function and report any dropped debug
635-
/// information.
636-
void calculateDroppedVarStatsOnFunction(const Function *F, StringRef PassID,
637-
std::string FuncOrModName,
638-
std::string PassLevel);
639-
/// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
640-
/// after a pass has run to facilitate dropped variable calculation for an
641-
/// llvm::Function.
642-
void runOnFunction(const Function *F, bool Before);
643-
/// Populate DebugVariablesBefore, DebugVariablesAfter, InlinedAts before or
644-
/// after a pass has run to facilitate dropped variable calculation for an
645-
/// llvm::Module. Calls runOnFunction on every Function in the Module.
646-
void runOnModule(const Module *M, bool Before);
647-
/// Remove a dropped #dbg_value VarID from all Sets in the
648-
/// DroppedVariablesBefore stack.
649-
void removeVarFromAllSets(VarID Var, const Function *F);
650-
/// Return true if \p Scope is the same as \p DbgValScope or a child scope of
651-
/// \p DbgValScope, return false otherwise.
652-
bool isScopeChildOfOrEqualTo(DIScope *Scope, const DIScope *DbgValScope);
653-
/// Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
654-
/// the InlinedAt chain, return false otherwise.
655-
bool isInlinedAtChildOfOrEqualTo(const DILocation *InlinedAt,
656-
const DILocation *DbgValInlinedAt);
657-
};
658-
659583
/// This class provides an interface to register all the standard pass
660584
/// instrumentations and manages their state (if any).
661585
class StandardInstrumentations {

llvm/lib/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ add_llvm_component_library(LLVMCodeGen
5050
DeadMachineInstructionElim.cpp
5151
DetectDeadLanes.cpp
5252
DFAPacketizer.cpp
53+
DroppedVariableStats.cpp
5354
DwarfEHPrepare.cpp
5455
EarlyIfConversion.cpp
5556
EdgeBundles.cpp

0 commit comments

Comments
 (0)