xref: /llvm-project/llvm/lib/Passes/DroppedVariableStatsIR.cpp (revision 12903fb3c73ad549c89585097f24d8b9952d849c)
10b5b09b6SShubham Sandeep Rastogi ///===- DroppedVariableStatsIR.cpp ----------------------------------------===//
20b5b09b6SShubham Sandeep Rastogi ///
30b5b09b6SShubham Sandeep Rastogi /// Part of the LLVM Project, under the Apache License v2.0 with LLVM
40b5b09b6SShubham Sandeep Rastogi /// Exceptions. See https://llvm.org/LICENSE.txt for license information.
50b5b09b6SShubham Sandeep Rastogi /// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b5b09b6SShubham Sandeep Rastogi ///
70b5b09b6SShubham Sandeep Rastogi ///===---------------------------------------------------------------------===//
80b5b09b6SShubham Sandeep Rastogi /// \file
90b5b09b6SShubham Sandeep Rastogi /// Dropped Variable Statistics for Debug Information. Reports any number
100b5b09b6SShubham Sandeep Rastogi /// of #dbg_value that get dropped due to an optimization pass.
110b5b09b6SShubham Sandeep Rastogi ///
120b5b09b6SShubham Sandeep Rastogi ///===---------------------------------------------------------------------===//
130b5b09b6SShubham Sandeep Rastogi 
140b5b09b6SShubham Sandeep Rastogi #include "llvm/Passes/DroppedVariableStatsIR.h"
150b5b09b6SShubham Sandeep Rastogi 
160b5b09b6SShubham Sandeep Rastogi using namespace llvm;
170b5b09b6SShubham Sandeep Rastogi 
18*12903fb3SShubham Sandeep Rastogi void DroppedVariableStatsIR::runOnFunction(StringRef PassID, const Function *F,
19*12903fb3SShubham Sandeep Rastogi                                            bool Before) {
200b5b09b6SShubham Sandeep Rastogi   auto &DebugVariables = DebugVariablesStack.back()[F];
210b5b09b6SShubham Sandeep Rastogi   auto FuncName = F->getName();
220b5b09b6SShubham Sandeep Rastogi   Func = F;
230b5b09b6SShubham Sandeep Rastogi   run(DebugVariables, FuncName, Before);
240b5b09b6SShubham Sandeep Rastogi }
250b5b09b6SShubham Sandeep Rastogi 
260b5b09b6SShubham Sandeep Rastogi void DroppedVariableStatsIR::calculateDroppedVarStatsOnFunction(
270b5b09b6SShubham Sandeep Rastogi     const Function *F, StringRef PassID, StringRef FuncOrModName,
280b5b09b6SShubham Sandeep Rastogi     StringRef PassLevel) {
290b5b09b6SShubham Sandeep Rastogi   Func = F;
300b5b09b6SShubham Sandeep Rastogi   StringRef FuncName = F->getName();
310b5b09b6SShubham Sandeep Rastogi   DebugVariables &DbgVariables = DebugVariablesStack.back()[F];
320b5b09b6SShubham Sandeep Rastogi   calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName,
330b5b09b6SShubham Sandeep Rastogi                                 PassLevel, Func);
340b5b09b6SShubham Sandeep Rastogi }
350b5b09b6SShubham Sandeep Rastogi 
36*12903fb3SShubham Sandeep Rastogi void DroppedVariableStatsIR::runOnModule(StringRef PassID, const Module *M,
37*12903fb3SShubham Sandeep Rastogi                                          bool Before) {
38*12903fb3SShubham Sandeep Rastogi   for (auto &F : *M) {
39*12903fb3SShubham Sandeep Rastogi     runOnFunction(PassID, &F, Before);
40*12903fb3SShubham Sandeep Rastogi   }
410b5b09b6SShubham Sandeep Rastogi }
420b5b09b6SShubham Sandeep Rastogi 
430b5b09b6SShubham Sandeep Rastogi void DroppedVariableStatsIR::calculateDroppedVarStatsOnModule(
440b5b09b6SShubham Sandeep Rastogi     const Module *M, StringRef PassID, StringRef FuncOrModName,
450b5b09b6SShubham Sandeep Rastogi     StringRef PassLevel) {
460b5b09b6SShubham Sandeep Rastogi   for (auto &F : *M) {
470b5b09b6SShubham Sandeep Rastogi     calculateDroppedVarStatsOnFunction(&F, PassID, FuncOrModName, PassLevel);
480b5b09b6SShubham Sandeep Rastogi   }
490b5b09b6SShubham Sandeep Rastogi }
500b5b09b6SShubham Sandeep Rastogi 
510b5b09b6SShubham Sandeep Rastogi void DroppedVariableStatsIR::registerCallbacks(
520b5b09b6SShubham Sandeep Rastogi     PassInstrumentationCallbacks &PIC) {
530b5b09b6SShubham Sandeep Rastogi   if (!DroppedVariableStatsEnabled)
540b5b09b6SShubham Sandeep Rastogi     return;
550b5b09b6SShubham Sandeep Rastogi 
560b5b09b6SShubham Sandeep Rastogi   PIC.registerBeforeNonSkippedPassCallback(
57*12903fb3SShubham Sandeep Rastogi       [this](StringRef P, Any IR) { return runBeforePass(P, IR); });
580b5b09b6SShubham Sandeep Rastogi   PIC.registerAfterPassCallback(
590b5b09b6SShubham Sandeep Rastogi       [this](StringRef P, Any IR, const PreservedAnalyses &PA) {
600b5b09b6SShubham Sandeep Rastogi         return runAfterPass(P, IR);
610b5b09b6SShubham Sandeep Rastogi       });
620b5b09b6SShubham Sandeep Rastogi   PIC.registerAfterPassInvalidatedCallback(
630b5b09b6SShubham Sandeep Rastogi       [this](StringRef P, const PreservedAnalyses &PA) { return cleanup(); });
640b5b09b6SShubham Sandeep Rastogi }
650b5b09b6SShubham Sandeep Rastogi 
660b5b09b6SShubham Sandeep Rastogi void DroppedVariableStatsIR::visitEveryInstruction(
670b5b09b6SShubham Sandeep Rastogi     unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap,
680b5b09b6SShubham Sandeep Rastogi     VarID Var) {
690b5b09b6SShubham Sandeep Rastogi   const DIScope *DbgValScope = std::get<0>(Var);
700b5b09b6SShubham Sandeep Rastogi   for (const auto &I : instructions(Func)) {
710b5b09b6SShubham Sandeep Rastogi     auto *DbgLoc = I.getDebugLoc().get();
720b5b09b6SShubham Sandeep Rastogi     if (!DbgLoc)
730b5b09b6SShubham Sandeep Rastogi       continue;
740b5b09b6SShubham Sandeep Rastogi     if (updateDroppedCount(DbgLoc, DbgLoc->getScope(), DbgValScope,
750b5b09b6SShubham Sandeep Rastogi                            InlinedAtsMap, Var, DroppedCount))
760b5b09b6SShubham Sandeep Rastogi       break;
770b5b09b6SShubham Sandeep Rastogi   }
780b5b09b6SShubham Sandeep Rastogi }
790b5b09b6SShubham Sandeep Rastogi 
800b5b09b6SShubham Sandeep Rastogi void DroppedVariableStatsIR::visitEveryDebugRecord(
810b5b09b6SShubham Sandeep Rastogi     DenseSet<VarID> &VarIDSet,
820b5b09b6SShubham Sandeep Rastogi     DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap,
830b5b09b6SShubham Sandeep Rastogi     StringRef FuncName, bool Before) {
840b5b09b6SShubham Sandeep Rastogi   for (const auto &I : instructions(Func)) {
850b5b09b6SShubham Sandeep Rastogi     for (DbgRecord &DR : I.getDbgRecordRange()) {
860b5b09b6SShubham Sandeep Rastogi       if (auto *Dbg = dyn_cast<DbgVariableRecord>(&DR)) {
870b5b09b6SShubham Sandeep Rastogi         auto *DbgVar = Dbg->getVariable();
880b5b09b6SShubham Sandeep Rastogi         auto DbgLoc = DR.getDebugLoc();
890b5b09b6SShubham Sandeep Rastogi         populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap,
900b5b09b6SShubham Sandeep Rastogi                                       FuncName, Before);
910b5b09b6SShubham Sandeep Rastogi       }
920b5b09b6SShubham Sandeep Rastogi     }
930b5b09b6SShubham Sandeep Rastogi   }
940b5b09b6SShubham Sandeep Rastogi }
95