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