This patch uses the DroppedVariableStats class to add dropped variable statistics for MIR passes. Reland 1c082c9cd12efaa67a32c5da89a328c458ed51c5
77 lines
2.7 KiB
C++
77 lines
2.7 KiB
C++
///===- 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"
|
|
|
|
using namespace llvm;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
} |