• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- ModuleDebugInfoPrinter.cpp - Prints module debug info metadata ----===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This pass decodes the debug info metadata in a module and prints in a
11  // (sufficiently-prepared-) human-readable form.
12  //
13  // For example, run this pass from opt along with the -analyze option, and
14  // it'll print to standard output.
15  //
16  //===----------------------------------------------------------------------===//
17  
18  #include "llvm/Analysis/Passes.h"
19  #include "llvm/Assembly/Writer.h"
20  #include "llvm/DebugInfo.h"
21  #include "llvm/Function.h"
22  #include "llvm/Pass.h"
23  #include "llvm/Support/ErrorHandling.h"
24  #include "llvm/Support/raw_ostream.h"
25  #include "llvm/ADT/Statistic.h"
26  using namespace llvm;
27  
28  namespace {
29    class ModuleDebugInfoPrinter : public ModulePass {
30      DebugInfoFinder Finder;
31    public:
32      static char ID; // Pass identification, replacement for typeid
ModuleDebugInfoPrinter()33      ModuleDebugInfoPrinter() : ModulePass(ID) {
34        initializeModuleDebugInfoPrinterPass(*PassRegistry::getPassRegistry());
35      }
36  
37      virtual bool runOnModule(Module &M);
38  
getAnalysisUsage(AnalysisUsage & AU) const39      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
40        AU.setPreservesAll();
41      }
42      virtual void print(raw_ostream &O, const Module *M) const;
43    };
44  }
45  
46  char ModuleDebugInfoPrinter::ID = 0;
47  INITIALIZE_PASS(ModuleDebugInfoPrinter, "module-debuginfo",
48                  "Decodes module-level debug info", false, true)
49  
createModuleDebugInfoPrinterPass()50  ModulePass *llvm::createModuleDebugInfoPrinterPass() {
51    return new ModuleDebugInfoPrinter();
52  }
53  
runOnModule(Module & M)54  bool ModuleDebugInfoPrinter::runOnModule(Module &M) {
55    Finder.processModule(M);
56    return false;
57  }
58  
print(raw_ostream & O,const Module * M) const59  void ModuleDebugInfoPrinter::print(raw_ostream &O, const Module *M) const {
60    for (DebugInfoFinder::iterator I = Finder.compile_unit_begin(),
61         E = Finder.compile_unit_end(); I != E; ++I) {
62      O << "Compile Unit: ";
63      DICompileUnit(*I).print(O);
64      O << '\n';
65    }
66  
67    for (DebugInfoFinder::iterator I = Finder.subprogram_begin(),
68         E = Finder.subprogram_end(); I != E; ++I) {
69      O << "Subprogram: ";
70      DISubprogram(*I).print(O);
71      O << '\n';
72    }
73  
74    for (DebugInfoFinder::iterator I = Finder.global_variable_begin(),
75         E = Finder.global_variable_end(); I != E; ++I) {
76      O << "GlobalVariable: ";
77      DIGlobalVariable(*I).print(O);
78      O << '\n';
79    }
80  
81    for (DebugInfoFinder::iterator I = Finder.type_begin(),
82         E = Finder.type_end(); I != E; ++I) {
83      O << "Type: ";
84      DIType(*I).print(O);
85      O << '\n';
86    }
87  }
88