LLVM: lib/CodeGen/MachineCheckDebugify.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

24

25#define DEBUG_TYPE "mir-check-debugify"

26

27using namespace llvm;

28

29namespace {

30

31struct CheckDebugMachineModule : public ModulePass {

32 bool runOnModule(Module &M) override {

33 NamedMDNode *NMD = M.getNamedMetadata("llvm.mir.debugify");

34 if (!NMD) {

35 errs() << "WARNING: Please run mir-debugify to generate "

36 "llvm.mir.debugify metadata first.\n";

37 return false;

38 }

39

41 getAnalysis().getMMI();

42

43 auto getDebugifyOperand = [&](unsigned Idx) -> unsigned {

45 ->getZExtValue();

46 };

48 "llvm.mir.debugify should have exactly 2 operands!");

49 unsigned NumLines = getDebugifyOperand(0);

50 unsigned NumVars = getDebugifyOperand(1);

51 BitVector MissingLines{NumLines, true};

52 BitVector MissingVars{NumVars, true};

53

54 for (Function &F : M.functions()) {

56 if (!MF)

57 continue;

59

60

62 if (MI.isDebugValue())

63 continue;

65 if (DL && DL.getLine() != 0) {

66 MissingLines.reset(DL.getLine() - 1);

67 continue;

68 }

69

70 if (DL) {

71 errs() << "WARNING: Instruction with empty DebugLoc in function ";

72 errs() << F.getName() << " --";

74 }

75 }

76

77

78

80 if (MI.isDebugValue())

81 continue;

83 unsigned Var = ~0U;

84

85 (void)to_integer(LocalVar->getName(), Var, 10);

86 assert(Var <= NumVars && "Unexpected name for DILocalVariable");

87 MissingVars.reset(Var - 1);

88 }

89 }

90 }

91

92 bool Fail = false;

93 for (unsigned Idx : MissingLines.set_bits()) {

94 errs() << "WARNING: Missing line " << Idx + 1 << "\n";

96 }

97

98 for (unsigned Idx : MissingVars.set_bits()) {

99 errs() << "WARNING: Missing variable " << Idx + 1 << "\n";

101 }

102 errs() << "Machine IR debug info check: ";

103 errs() << (Fail ? "FAIL" : "PASS") << "\n";

104

105 return false;

106 }

107

108 CheckDebugMachineModule() : ModulePass(ID) {}

109

110 void getAnalysisUsage(AnalysisUsage &AU) const override {

113 }

114

115 static char ID;

116};

117char CheckDebugMachineModule::ID = 0;

118

119}

120

122 "Machine Check Debug Module", false, false)

125

127 return new CheckDebugMachineModule();

128}

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.

Definition MachineCheckDebugify.cpp:126

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,...