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