25#define DEBUG_TYPE "mir-check-debugify"
31struct CheckDebugMachineModule :
public ModulePass {
32 bool runOnModule(
Module &M)
override {
33 NamedMDNode *NMD = M.getNamedMetadata(
"llvm.mir.debugify");
35 errs() <<
"WARNING: Please run mir-debugify to generate "
36 "llvm.mir.debugify metadata first.\n";
41 getAnalysis<MachineModuleInfoWrapperPass>().getMMI();
43 auto getDebugifyOperand = [&](
unsigned Idx) ->
unsigned {
48 "llvm.mir.debugify should have exactly 2 operands!");
49 unsigned NumLines = getDebugifyOperand(0);
50 unsigned NumVars = getDebugifyOperand(1);
62 if (
MI.isDebugValue())
65 if (
DL &&
DL.getLine() != 0) {
66 MissingLines.
reset(
DL.getLine() - 1);
71 errs() <<
"WARNING: Instruction with empty DebugLoc in function ";
72 errs() <<
F.getName() <<
" --";
80 if (!
MI.isDebugValue())
85 (void)
to_integer(LocalVar->getName(), Var, 10);
86 assert(Var <= NumVars &&
"Unexpected name for DILocalVariable");
87 MissingVars.
reset(Var - 1);
93 for (
unsigned Idx : MissingLines.
set_bits()) {
94 errs() <<
"WARNING: Missing line " << Idx + 1 <<
"\n";
98 for (
unsigned Idx : MissingVars.
set_bits()) {
99 errs() <<
"WARNING: Missing variable " << Idx + 1 <<
"\n";
102 errs() <<
"Machine IR debug info check: ";
103 errs() << (
Fail ?
"FAIL" :
"PASS") <<
"\n";
117char CheckDebugMachineModule::ID = 0;
122 "Machine Check Debug Module",
false,
false)
127 return new CheckDebugMachineModule();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
iterator_range< const_set_bits_iterator > set_bits() const
const MDOperand & getOperand(unsigned I) const
Representation of each machine instruction.
This class contains meta information specific to a module.
LLVM_ABI MachineFunction * getMachineFunction(const Function &F) const
Returns the MachineFunction associated to IR function F if there is one, otherwise nullptr.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
A Module instance is used to store all the information related to an LLVM module.
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI ModulePass * createCheckDebugMachineModulePass()
Creates MIR Check Debug pass.
bool to_integer(StringRef S, N &Num, unsigned Base=0)
Convert the string S to an integer of the specified type using the radix Base. If Base is 0,...