1414#ifndef LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
1515#define LLVM_CODEGEN_DROPPEDVARIABLESTATS_H
1616
17- #include " llvm/IR/DebugInfoMetadata.h"
18- #include " llvm/IR/DiagnosticInfo.h"
19- #include " llvm/IR/Function.h"
20- #include " llvm/IR/PassInstrumentation.h"
17+ #include " llvm/ADT/DenseSet.h"
18+ #include " llvm/ADT/SmallVector.h"
19+ #include < tuple>
2120
2221namespace llvm {
2322
23+ class DIScope ;
24+ class DILocalVariable ;
25+ class Function ;
26+ class DILocation ;
27+ class DebugLoc ;
28+ class StringRef ;
29+
2430// / A unique key that represents a debug variable.
2531// / First const DIScope *: Represents the scope of the debug variable.
2632// / Second const DIScope *: Represents the InlinedAt scope of the debug
@@ -33,13 +39,7 @@ using VarID =
3339// / statistics.
3440class DroppedVariableStats {
3541public:
36- DroppedVariableStats (bool DroppedVarStatsEnabled)
37- : DroppedVariableStatsEnabled(DroppedVarStatsEnabled) {
38- if (DroppedVarStatsEnabled)
39- llvm::outs ()
40- << " Pass Level, Pass Name, Num of Dropped Variables, Func or "
41- " Module Name\n " ;
42- };
42+ DroppedVariableStats (bool DroppedVarStatsEnabled);
4343
4444 virtual ~DroppedVariableStats () {}
4545
@@ -50,20 +50,9 @@ class DroppedVariableStats {
5050 bool getPassDroppedVariables () { return PassDroppedVariables; }
5151
5252protected:
53- void setup () {
54- DebugVariablesStack.push_back (
55- {DenseMap<const Function *, DebugVariables>()});
56- InlinedAts.push_back (
57- {DenseMap<StringRef, DenseMap<VarID, DILocation *>>()});
58- }
59-
60- void cleanup () {
61- assert (!DebugVariablesStack.empty () &&
62- " DebugVariablesStack shouldn't be empty!" );
63- assert (!InlinedAts.empty () && " InlinedAts shouldn't be empty!" );
64- DebugVariablesStack.pop_back ();
65- InlinedAts.pop_back ();
66- }
53+ void setup ();
54+
55+ void cleanup ();
6756
6857 bool DroppedVariableStatsEnabled = false ;
6958 struct DebugVariables {
@@ -73,7 +62,6 @@ class DroppedVariableStats {
7362 DenseSet<VarID> DebugVariablesAfter;
7463 };
7564
76- protected:
7765 // / A stack of a DenseMap, that maps DebugVariables for every pass to an
7866 // / llvm::Function. A stack is used because an optimization pass can call
7967 // / other passes.
@@ -90,78 +78,27 @@ class DroppedVariableStats {
9078 void calculateDroppedStatsAndPrint (DebugVariables &DbgVariables,
9179 StringRef FuncName, StringRef PassID,
9280 StringRef FuncOrModName,
93- StringRef PassLevel,
94- const Function *Func) {
95- unsigned DroppedCount = 0 ;
96- DenseSet<VarID> &DebugVariablesBeforeSet =
97- DbgVariables.DebugVariablesBefore ;
98- DenseSet<VarID> &DebugVariablesAfterSet = DbgVariables.DebugVariablesAfter ;
99- auto It = InlinedAts.back ().find (FuncName);
100- if (It == InlinedAts.back ().end ())
101- return ;
102- DenseMap<VarID, DILocation *> &InlinedAtsMap = It->second ;
103- // Find an Instruction that shares the same scope as the dropped #dbg_value
104- // or has a scope that is the child of the scope of the #dbg_value, and has
105- // an inlinedAt equal to the inlinedAt of the #dbg_value or it's inlinedAt
106- // chain contains the inlinedAt of the #dbg_value, if such an Instruction is
107- // found, debug information is dropped.
108- for (VarID Var : DebugVariablesBeforeSet) {
109- if (DebugVariablesAfterSet.contains (Var))
110- continue ;
111- visitEveryInstruction (DroppedCount, InlinedAtsMap, Var);
112- removeVarFromAllSets (Var, Func);
113- }
114- if (DroppedCount > 0 ) {
115- llvm::outs () << PassLevel << " , " << PassID << " , " << DroppedCount
116- << " , " << FuncOrModName << " \n " ;
117- PassDroppedVariables = true ;
118- } else
119- PassDroppedVariables = false ;
120- }
81+ StringRef PassLevel, const Function *Func);
12182
12283 // / Check if a \p Var has been dropped or is a false positive. Also update the
12384 // / \p DroppedCount if a debug variable is dropped.
12485 bool updateDroppedCount (DILocation *DbgLoc, const DIScope *Scope,
12586 const DIScope *DbgValScope,
12687 DenseMap<VarID, DILocation *> &InlinedAtsMap,
127- VarID Var, unsigned &DroppedCount) {
128- // If the Scope is a child of, or equal to the DbgValScope and is inlined at
129- // the Var's InlinedAt location, return true to signify that the Var has
130- // been dropped.
131- if (isScopeChildOfOrEqualTo (Scope, DbgValScope))
132- if (isInlinedAtChildOfOrEqualTo (DbgLoc->getInlinedAt (),
133- InlinedAtsMap[Var])) {
134- // Found another instruction in the variable's scope, so there exists a
135- // break point at which the variable could be observed. Count it as
136- // dropped.
137- DroppedCount++;
138- return true ;
139- }
140- return false ;
141- }
88+ VarID Var, unsigned &DroppedCount);
89+
14290 // / Run code to populate relevant data structures over an llvm::Function or
14391 // / llvm::MachineFunction.
144- void run (DebugVariables &DbgVariables, StringRef FuncName, bool Before) {
145- auto &VarIDSet = (Before ? DbgVariables.DebugVariablesBefore
146- : DbgVariables.DebugVariablesAfter );
147- auto &InlinedAtsMap = InlinedAts.back ();
148- if (Before)
149- InlinedAtsMap.try_emplace (FuncName, DenseMap<VarID, DILocation *>());
150- VarIDSet = DenseSet<VarID>();
151- visitEveryDebugRecord (VarIDSet, InlinedAtsMap, FuncName, Before);
152- }
92+ void run (DebugVariables &DbgVariables, StringRef FuncName, bool Before);
93+
15394 // / Populate the VarIDSet and InlinedAtMap with the relevant information
15495 // / needed for before and after pass analysis to determine dropped variable
15596 // / status.
15697 void populateVarIDSetAndInlinedMap (
15798 const DILocalVariable *DbgVar, DebugLoc DbgLoc, DenseSet<VarID> &VarIDSet,
15899 DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
159- StringRef FuncName, bool Before) {
160- VarID Key{DbgVar->getScope (), DbgLoc->getInlinedAtScope (), DbgVar};
161- VarIDSet.insert (Key);
162- if (Before)
163- InlinedAtsMap[FuncName].try_emplace (Key, DbgLoc.getInlinedAt ());
164- }
100+ StringRef FuncName, bool Before);
101+
165102 // / Visit every llvm::Instruction or llvm::MachineInstruction and check if the
166103 // / debug variable denoted by its ID \p Var may have been dropped by an
167104 // / optimization pass.
@@ -179,47 +116,18 @@ class DroppedVariableStats {
179116private:
180117 // / Remove a dropped debug variable's VarID from all Sets in the
181118 // / DroppedVariablesBefore stack.
182- void removeVarFromAllSets (VarID Var, const Function *F) {
183- // Do not remove Var from the last element, it will be popped from the
184- // stack.
185- for (auto &DebugVariablesMap : llvm::drop_end (DebugVariablesStack))
186- DebugVariablesMap[F].DebugVariablesBefore .erase (Var);
187- }
119+ void removeVarFromAllSets (VarID Var, const Function *F);
120+
188121 // / Return true if \p Scope is the same as \p DbgValScope or a child scope of
189122 // / \p DbgValScope, return false otherwise.
190123 bool isScopeChildOfOrEqualTo (const DIScope *Scope,
191- const DIScope *DbgValScope) {
192- while (Scope != nullptr ) {
193- if (VisitedScope.find (Scope) == VisitedScope.end ()) {
194- VisitedScope.insert (Scope);
195- if (Scope == DbgValScope) {
196- VisitedScope.clear ();
197- return true ;
198- }
199- Scope = Scope->getScope ();
200- } else {
201- VisitedScope.clear ();
202- return false ;
203- }
204- }
205- return false ;
206- }
124+ const DIScope *DbgValScope);
125+
207126 // / Return true if \p InlinedAt is the same as \p DbgValInlinedAt or part of
208127 // / the InlinedAt chain, return false otherwise.
209128 bool isInlinedAtChildOfOrEqualTo (const DILocation *InlinedAt,
210- const DILocation *DbgValInlinedAt) {
211- if (DbgValInlinedAt == InlinedAt)
212- return true ;
213- if (!DbgValInlinedAt)
214- return false ;
215- auto *IA = InlinedAt;
216- while (IA) {
217- if (IA == DbgValInlinedAt)
218- return true ;
219- IA = IA->getInlinedAt ();
220- }
221- return false ;
222- }
129+ const DILocation *DbgValInlinedAt);
130+
223131 bool PassDroppedVariables = false ;
224132};
225133
0 commit comments