| ///===- DroppedVariableStatsMIR.cpp ---------------------------------------===// | |
| /// | |
| /// Part of the LLVM Project, under the Apache License v2.0 with LLVM | |
| /// Exceptions. See https://llvm.org/LICENSE.txt for license information. | |
| /// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| /// | |
| ///===---------------------------------------------------------------------===// | |
| /// \file | |
| /// Dropped Variable Statistics for Debug Information. Reports any number | |
| /// of DBG_VALUEs that get dropped due to an optimization pass. | |
| /// | |
| ///===---------------------------------------------------------------------===// | |
| #include "llvm/CodeGen/DroppedVariableStatsMIR.h" | |
| #include "llvm/IR/DebugInfoMetadata.h" | |
| using namespace llvm; | |
| void DroppedVariableStatsMIR::runBeforePass(StringRef PassID, | |
| MachineFunction *MF) { | |
| if (PassID == "Debug Variable Analysis") | |
| return; | |
| setup(); | |
| return runOnMachineFunction(MF, true); | |
| } | |
| void DroppedVariableStatsMIR::runAfterPass(StringRef PassID, | |
| MachineFunction *MF) { | |
| if (PassID == "Debug Variable Analysis") | |
| return; | |
| runOnMachineFunction(MF, false); | |
| calculateDroppedVarStatsOnMachineFunction(MF, PassID, MF->getName().str()); | |
| cleanup(); | |
| } | |
| void DroppedVariableStatsMIR::runOnMachineFunction(const MachineFunction *MF, | |
| bool Before) { | |
| auto &DebugVariables = DebugVariablesStack.back()[&MF->getFunction()]; | |
| auto FuncName = MF->getName(); | |
| MFunc = MF; | |
| run(DebugVariables, FuncName, Before); | |
| } | |
| void DroppedVariableStatsMIR::calculateDroppedVarStatsOnMachineFunction( | |
| const MachineFunction *MF, StringRef PassID, StringRef FuncOrModName) { | |
| MFunc = MF; | |
| StringRef FuncName = MF->getName(); | |
| const Function *Func = &MF->getFunction(); | |
| DebugVariables &DbgVariables = DebugVariablesStack.back()[Func]; | |
| calculateDroppedStatsAndPrint(DbgVariables, FuncName, PassID, FuncOrModName, | |
| "MachineFunction", Func); | |
| } | |
| void DroppedVariableStatsMIR::visitEveryInstruction( | |
| unsigned &DroppedCount, DenseMap<VarID, DILocation *> &InlinedAtsMap, | |
| VarID Var) { | |
| unsigned PrevDroppedCount = DroppedCount; | |
| const DIScope *DbgValScope = std::get<0>(Var); | |
| for (const auto &MBB : *MFunc) { | |
| for (const auto &MI : MBB) { | |
| if (!MI.isDebugInstr()) { | |
| auto *DbgLoc = MI.getDebugLoc().get(); | |
| if (!DbgLoc) | |
| continue; | |
| auto *Scope = DbgLoc->getScope(); | |
| if (updateDroppedCount(DbgLoc, Scope, DbgValScope, InlinedAtsMap, Var, | |
| DroppedCount)) | |
| break; | |
| } | |
| } | |
| if (PrevDroppedCount != DroppedCount) { | |
| PrevDroppedCount = DroppedCount; | |
| break; | |
| } | |
| } | |
| } | |
| void DroppedVariableStatsMIR::visitEveryDebugRecord( | |
| DenseSet<VarID> &VarIDSet, | |
| DenseMap<StringRef, DenseMap<VarID, DILocation *>> &InlinedAtsMap, | |
| StringRef FuncName, bool Before) { | |
| for (const auto &MBB : *MFunc) { | |
| for (const auto &MI : MBB) { | |
| if (MI.isDebugValueLike()) { | |
| auto *DbgVar = MI.getDebugVariable(); | |
| if (!DbgVar) | |
| continue; | |
| auto DbgLoc = MI.getDebugLoc(); | |
| populateVarIDSetAndInlinedMap(DbgVar, DbgLoc, VarIDSet, InlinedAtsMap, | |
| FuncName, Before); | |
| } | |
| } | |
| } | |
| } |