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"
19139f7f9bSDimitry Andric #include "llvm/ADT/Statistic.h"
20*91bc56edSDimitry Andric #include "llvm/IR/DebugInfo.h"
21139f7f9bSDimitry Andric #include "llvm/IR/Function.h"
227ae0e2c9SDimitry Andric #include "llvm/Pass.h"
23f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
24f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
25f22ef01cSRoman Divacky using namespace llvm;
26f22ef01cSRoman Divacky 
27f22ef01cSRoman Divacky namespace {
28f22ef01cSRoman Divacky   class ModuleDebugInfoPrinter : public ModulePass {
29f22ef01cSRoman Divacky     DebugInfoFinder Finder;
30f22ef01cSRoman Divacky   public:
31f22ef01cSRoman Divacky     static char ID; // Pass identification, replacement for typeid
322754fe60SDimitry Andric     ModuleDebugInfoPrinter() : ModulePass(ID) {
332754fe60SDimitry Andric       initializeModuleDebugInfoPrinterPass(*PassRegistry::getPassRegistry());
342754fe60SDimitry Andric     }
35f22ef01cSRoman Divacky 
36*91bc56edSDimitry Andric     bool runOnModule(Module &M) override;
37f22ef01cSRoman Divacky 
38*91bc56edSDimitry Andric     void getAnalysisUsage(AnalysisUsage &AU) const override {
39f22ef01cSRoman Divacky       AU.setPreservesAll();
40f22ef01cSRoman Divacky     }
41*91bc56edSDimitry Andric     void print(raw_ostream &O, const Module *M) const override;
42f22ef01cSRoman Divacky   };
43f22ef01cSRoman Divacky }
44f22ef01cSRoman Divacky 
45f22ef01cSRoman Divacky char ModuleDebugInfoPrinter::ID = 0;
46e580952dSDimitry Andric INITIALIZE_PASS(ModuleDebugInfoPrinter, "module-debuginfo",
472754fe60SDimitry Andric                 "Decodes module-level debug info", false, true)
48f22ef01cSRoman Divacky 
49f22ef01cSRoman Divacky ModulePass *llvm::createModuleDebugInfoPrinterPass() {
50f22ef01cSRoman Divacky   return new ModuleDebugInfoPrinter();
51f22ef01cSRoman Divacky }
52f22ef01cSRoman Divacky 
53f22ef01cSRoman Divacky bool ModuleDebugInfoPrinter::runOnModule(Module &M) {
54f22ef01cSRoman Divacky   Finder.processModule(M);
55f22ef01cSRoman Divacky   return false;
56f22ef01cSRoman Divacky }
57f22ef01cSRoman Divacky 
58f22ef01cSRoman Divacky void ModuleDebugInfoPrinter::print(raw_ostream &O, const Module *M) const {
59*91bc56edSDimitry Andric   for (DICompileUnit CU : Finder.compile_units()) {
60f22ef01cSRoman Divacky     O << "Compile Unit: ";
61*91bc56edSDimitry Andric     CU.print(O);
62f22ef01cSRoman Divacky     O << '\n';
63f22ef01cSRoman Divacky   }
64f22ef01cSRoman Divacky 
65*91bc56edSDimitry Andric   for (DISubprogram S : Finder.subprograms()) {
66f22ef01cSRoman Divacky     O << "Subprogram: ";
67*91bc56edSDimitry Andric     S.print(O);
68f22ef01cSRoman Divacky     O << '\n';
69f22ef01cSRoman Divacky   }
70f22ef01cSRoman Divacky 
71*91bc56edSDimitry Andric   for (DIGlobalVariable GV : Finder.global_variables()) {
72f22ef01cSRoman Divacky     O << "GlobalVariable: ";
73*91bc56edSDimitry Andric     GV.print(O);
74f22ef01cSRoman Divacky     O << '\n';
75f22ef01cSRoman Divacky   }
76f22ef01cSRoman Divacky 
77*91bc56edSDimitry Andric   for (DIType T : Finder.types()) {
78f22ef01cSRoman Divacky     O << "Type: ";
79*91bc56edSDimitry Andric     T.print(O);
80f22ef01cSRoman Divacky     O << '\n';
81f22ef01cSRoman Divacky   }
82f22ef01cSRoman Divacky }
83