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