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