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