MachineModuleInfo.cpp revision 6af5681824713544a7a8c6e115649b29d59b3d13
1cfd74d65d832137e20e193c960802afba73b5d38sm//===-- llvm/CodeGen/MachineDebugInfo.cpp -----------------------*- C++ -*-===//
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm//
3cfd74d65d832137e20e193c960802afba73b5d38sm//                     The LLVM Compiler Infrastructure
4cfd74d65d832137e20e193c960802afba73b5d38sm//
5cfd74d65d832137e20e193c960802afba73b5d38sm// This file was developed by James M. Laskey and is distributed under
6cfd74d65d832137e20e193c960802afba73b5d38sm// the University of Illinois Open Source License. See LICENSE.TXT for details.
7cfd74d65d832137e20e193c960802afba73b5d38sm//
8cfd74d65d832137e20e193c960802afba73b5d38sm//===----------------------------------------------------------------------===//
9cfd74d65d832137e20e193c960802afba73b5d38sm//
10cfd74d65d832137e20e193c960802afba73b5d38sm// Collect debug information for a module.  This information should be in a
11cfd74d65d832137e20e193c960802afba73b5d38sm// neutral form that can be used by different debugging schemes.
12cfd74d65d832137e20e193c960802afba73b5d38sm//
13cfd74d65d832137e20e193c960802afba73b5d38sm//===----------------------------------------------------------------------===//
14cfd74d65d832137e20e193c960802afba73b5d38sm
15cfd74d65d832137e20e193c960802afba73b5d38sm#include "llvm/CodeGen/MachineDebugInfo.h"
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smusing namespace llvm;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38sm// Handle the Pass registration stuff necessary to use TargetData's.
20cfd74d65d832137e20e193c960802afba73b5d38smnamespace {
21cfd74d65d832137e20e193c960802afba73b5d38sm  RegisterPass<MachineDebugInfo> X("machinedebuginfo", "Debug Information",
22cfd74d65d832137e20e193c960802afba73b5d38sm                                  PassInfo::Analysis | PassInfo::Optimization);
23cfd74d65d832137e20e193c960802afba73b5d38sm}
24cfd74d65d832137e20e193c960802afba73b5d38sm
25cfd74d65d832137e20e193c960802afba73b5d38smnamespace llvm {
26cfd74d65d832137e20e193c960802afba73b5d38sm
27cfd74d65d832137e20e193c960802afba73b5d38sm  /// DebugInfo - Keep track of debug information for the function.
28cfd74d65d832137e20e193c960802afba73b5d38sm  ///
29cfd74d65d832137e20e193c960802afba73b5d38sm  // FIXME - making it global until we can find a proper place to hang it from.
30cfd74d65d832137e20e193c960802afba73b5d38sm  MachineDebugInfo *DebugInfo;
31cfd74d65d832137e20e193c960802afba73b5d38sm
32cfd74d65d832137e20e193c960802afba73b5d38sm  // FIXME - temporary hack until we can find a place to hand debug info from.
33cfd74d65d832137e20e193c960802afba73b5d38sm  ModulePass *createDebugInfoPass() {
34cfd74d65d832137e20e193c960802afba73b5d38sm    if (!DebugInfo) DebugInfo = new MachineDebugInfo();
35cfd74d65d832137e20e193c960802afba73b5d38sm    return (ModulePass *)DebugInfo;
36cfd74d65d832137e20e193c960802afba73b5d38sm  }
37cfd74d65d832137e20e193c960802afba73b5d38sm
38cfd74d65d832137e20e193c960802afba73b5d38sm  /// getDebugInfo - Returns the DebugInfo.
39cfd74d65d832137e20e193c960802afba73b5d38sm  MachineDebugInfo &getMachineDebugInfo() {
40cfd74d65d832137e20e193c960802afba73b5d38sm    assert(DebugInfo && "DebugInfo pass not created");
41cfd74d65d832137e20e193c960802afba73b5d38sm    return *DebugInfo;
42cfd74d65d832137e20e193c960802afba73b5d38sm  }
43cfd74d65d832137e20e193c960802afba73b5d38sm
44cfd74d65d832137e20e193c960802afba73b5d38sm  /// doInitialization - Initialize the debug state for a new module.
45cfd74d65d832137e20e193c960802afba73b5d38sm  ///
46cfd74d65d832137e20e193c960802afba73b5d38sm  bool MachineDebugInfo::doInitialization() {
47cfd74d65d832137e20e193c960802afba73b5d38sm    return true;
48cfd74d65d832137e20e193c960802afba73b5d38sm  }
49cfd74d65d832137e20e193c960802afba73b5d38sm
50cfd74d65d832137e20e193c960802afba73b5d38sm  /// doFinalization - Tear down the debug state after completion of a module.
51cfd74d65d832137e20e193c960802afba73b5d38sm  ///
52cfd74d65d832137e20e193c960802afba73b5d38sm  bool MachineDebugInfo::doFinalization() {
53cfd74d65d832137e20e193c960802afba73b5d38sm    return true;
54cfd74d65d832137e20e193c960802afba73b5d38sm  }
55cfd74d65d832137e20e193c960802afba73b5d38sm
56cfd74d65d832137e20e193c960802afba73b5d38sm  /// RecordSource - Register a source file with debug info.  Returns an id.
57cfd74d65d832137e20e193c960802afba73b5d38sm  ///
58cfd74d65d832137e20e193c960802afba73b5d38sm  unsigned MachineDebugInfo::RecordSource(std::string fname,
59cfd74d65d832137e20e193c960802afba73b5d38sm                                          std::string dirname) {
60cfd74d65d832137e20e193c960802afba73b5d38sm    // Compose a key
61cfd74d65d832137e20e193c960802afba73b5d38sm    std::string path = dirname + "/" + fname;
62cfd74d65d832137e20e193c960802afba73b5d38sm    // Check if the source file is already recorded
63cfd74d65d832137e20e193c960802afba73b5d38sm    StrIntMapIter SMI = SourceMap.find(path);
64cfd74d65d832137e20e193c960802afba73b5d38sm    // If already there return existing id
65cfd74d65d832137e20e193c960802afba73b5d38sm    if (SMI != SourceMap.end()) return SMI->second;
66cfd74d65d832137e20e193c960802afba73b5d38sm    // Bump up the count
67cfd74d65d832137e20e193c960802afba73b5d38sm    ++SourceCount;
68cfd74d65d832137e20e193c960802afba73b5d38sm    // Record the count
69cfd74d65d832137e20e193c960802afba73b5d38sm    SourceMap[path] = SourceCount;
70cfd74d65d832137e20e193c960802afba73b5d38sm    // Return id
71cfd74d65d832137e20e193c960802afba73b5d38sm    return SourceCount;
72cfd74d65d832137e20e193c960802afba73b5d38sm  }
73cfd74d65d832137e20e193c960802afba73b5d38sm
74cfd74d65d832137e20e193c960802afba73b5d38sm  /// getSourceFiles - Return a vector of files.  Vector index + 1 equals id.
75cfd74d65d832137e20e193c960802afba73b5d38sm  ///
76cfd74d65d832137e20e193c960802afba73b5d38sm  std::vector<std::string> MachineDebugInfo::getSourceFiles() {
77cfd74d65d832137e20e193c960802afba73b5d38sm    std::vector<std::string> Sources(SourceCount);
78cfd74d65d832137e20e193c960802afba73b5d38sm
79cfd74d65d832137e20e193c960802afba73b5d38sm    for (StrIntMapIter SMI = SourceMap.begin(), E = SourceMap.end(); SMI != E;
80cfd74d65d832137e20e193c960802afba73b5d38sm                       SMI++) {
81cfd74d65d832137e20e193c960802afba73b5d38sm      unsigned Index = SMI->second - 1;
82cfd74d65d832137e20e193c960802afba73b5d38sm      std::string Path = SMI->first;
83cfd74d65d832137e20e193c960802afba73b5d38sm      Sources[Index] = Path;
84cfd74d65d832137e20e193c960802afba73b5d38sm    }
85cfd74d65d832137e20e193c960802afba73b5d38sm    return Sources;
86cfd74d65d832137e20e193c960802afba73b5d38sm  }
87cfd74d65d832137e20e193c960802afba73b5d38sm
88cfd74d65d832137e20e193c960802afba73b5d38sm
89cfd74d65d832137e20e193c960802afba73b5d38sm};
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm