| ///===- 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); |
| } |
| } |
| } |
| } |