ModuleDebugInfoPrinter.cpp revision ce665bd2e2b581ab0858d1afe359192bac96b868
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/Analysis/DebugInfo.h"
20ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman#include "llvm/Assembly/Writer.h"
21ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman#include "llvm/Pass.h"
22ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman#include "llvm/Function.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
3390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    ModuleDebugInfoPrinter() : ModulePass(ID) {}
34ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
35ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    virtual bool runOnModule(Module &M);
36ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
37ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
38ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman      AU.setPreservesAll();
39ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    }
40ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    virtual void print(raw_ostream &O, const Module *M) const;
41ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  };
42ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman}
43ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
44ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohmanchar ModuleDebugInfoPrinter::ID = 0;
45d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(ModuleDebugInfoPrinter, "module-debuginfo",
46ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Decodes module-level debug info", false, true)
47ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
48ef0b14593bb8dd5651606925584adb1ac1096ba5Dan GohmanModulePass *llvm::createModuleDebugInfoPrinterPass() {
49ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  return new ModuleDebugInfoPrinter();
50ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman}
51ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
52ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohmanbool ModuleDebugInfoPrinter::runOnModule(Module &M) {
53ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  Finder.processModule(M);
54ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  return false;
55ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman}
56ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
57ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohmanvoid ModuleDebugInfoPrinter::print(raw_ostream &O, const Module *M) const {
58ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  for (DebugInfoFinder::iterator I = Finder.compile_unit_begin(),
59ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman       E = Finder.compile_unit_end(); I != E; ++I) {
60ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << "Compile Unit: ";
61ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    DICompileUnit(*I).print(O);
62ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << '\n';
63ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  }
64ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
65ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  for (DebugInfoFinder::iterator I = Finder.subprogram_begin(),
66ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman       E = Finder.subprogram_end(); I != E; ++I) {
67ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << "Subprogram: ";
68ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    DISubprogram(*I).print(O);
69ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << '\n';
70ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  }
71ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
72ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  for (DebugInfoFinder::iterator I = Finder.global_variable_begin(),
73ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman       E = Finder.global_variable_end(); I != E; ++I) {
74ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << "GlobalVariable: ";
75ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    DIGlobalVariable(*I).print(O);
76ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << '\n';
77ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  }
78ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman
79ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  for (DebugInfoFinder::iterator I = Finder.type_begin(),
80ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman       E = Finder.type_end(); I != E; ++I) {
81ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << "Type: ";
82ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    DIType(*I).print(O);
83ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman    O << '\n';
84ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman  }
85ef0b14593bb8dd5651606925584adb1ac1096ba5Dan Gohman}
86