diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/DebugLoc.h | 109 | ||||
| -rw-r--r-- | llvm/include/llvm/CodeGen/MachineFunction.h | 15 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineFunction.cpp | 27 | 
3 files changed, 150 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/DebugLoc.h b/llvm/include/llvm/CodeGen/DebugLoc.h new file mode 100644 index 00000000000..ad68839b054 --- /dev/null +++ b/llvm/include/llvm/CodeGen/DebugLoc.h @@ -0,0 +1,109 @@ +//===---- llvm/CodeGen/DebugLoc.h - Debug Location Information --*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines a number of light weight data structures used by the code +// generator to describe and track debug location information. + +#ifndef LLVM_CODEGEN_DEBUGLOC_H +#define LLVM_CODEGEN_DEBUGLOC_H + +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/StringMap.h" +#include <vector> + +namespace llvm { + +  /// DebugLocTuple - Debug location tuple of filename id, line and column. +  /// +  struct DebugLocTuple { +    unsigned FileId, Line, Col; + +    DebugLocTuple(unsigned fi, unsigned l, unsigned c) +      : FileId(fi), Line(l), Col(c) {}; +  }; + +  /// DebugLoc - Debug location id. This is carried by SDNode and +  /// MachineInstr to index into a vector of unique debug location tuples.  +  class DebugLoc { +    unsigned Idx; + +  public: +    DebugLoc() : Idx(~0U) {} + +    static DebugLoc getNoDebugLoc()   { DebugLoc L; L.Idx = 0;   return L; } +    static DebugLoc get(unsigned idx) { DebugLoc L; L.Idx = idx; return L; } + +    bool isInvalid() { return Idx == ~0U; } +    bool isUnknown() { return Idx == 0; } +  }; + +  struct DebugLocTupleDenseMapInfo { +    static inline DebugLocTuple getEmptyKey() { +      return DebugLocTuple(~0U, ~0U, ~0U); +    } +    static inline DebugLocTuple getTombstoneKey() { +      return DebugLocTuple(~1U, ~1U, ~1U); +    } +    static unsigned getHashValue(const DebugLocTuple &Val) { +      return DenseMapInfo<unsigned>::getHashValue(Val.FileId) ^ +             DenseMapInfo<unsigned>::getHashValue(Val.Line) ^ +             DenseMapInfo<unsigned>::getHashValue(Val.Col); +    } +    static bool isEqual(const DebugLocTuple &LHS, const DebugLocTuple &RHS) { +      return LHS.FileId == RHS.FileId && +             LHS.Line == RHS.Line && +             LHS.Col == RHS.Col; +    } + +    static bool isPod() { return true; } +  }; + +  typedef DenseMap<DebugLocTuple, unsigned, DebugLocTupleDenseMapInfo> +    DebugIdMapType; +     +  /// DebugLocTracker - This class tracks debug location information. +  /// +  struct DebugLocTracker { +    // NumFilenames - Size of the DebugFilenames vector. +    // +    unsigned NumFilenames; +     +    // DebugFilenames - A vector of unique file names. +    // +    std::vector<std::string> DebugFilenames; + +    // DebugFilenamesMap - File name to DebugFilenames index map. +    // +    StringMap<unsigned> DebugFilenamesMap; + +    // NumDebugLocations - Size of the DebugLocations vector. +    unsigned NumDebugLocations; + +    // DebugLocations - A vector of unique DebugLocTuple's. +    // +    std::vector<DebugLocTuple> DebugLocations; + +    // DebugIdsMap - This maps DebugLocTuple's to indices into +    // DebugLocations vector. +    DebugIdMapType DebugIdMap; + +    DebugLocTracker() : NumFilenames(0), NumDebugLocations(0) {} + +    ~DebugLocTracker() { +      NumFilenames = 0; +      DebugFilenames.clear(); +      DebugFilenamesMap.clear(); +      DebugLocations.clear(); +      DebugIdMap.clear(); +    } +  }; +   +} // end namespace llvm + +#endif /* LLVM_CODEGEN_DEBUGLOC_H */ diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h index 835c8a37c56..1397b846779 100644 --- a/llvm/include/llvm/CodeGen/MachineFunction.h +++ b/llvm/include/llvm/CodeGen/MachineFunction.h @@ -19,6 +19,7 @@  #define LLVM_CODEGEN_MACHINEFUNCTION_H  #include "llvm/ADT/ilist.h" +#include "llvm/CodeGen/DebugLoc.h"  #include "llvm/CodeGen/MachineBasicBlock.h"  #include "llvm/Support/Annotation.h"  #include "llvm/Support/Allocator.h" @@ -27,11 +28,11 @@  namespace llvm {  class Function; -class TargetMachine;  class MachineRegisterInfo;  class MachineFrameInfo;  class MachineConstantPool;  class MachineJumpTableInfo; +class TargetMachine;  template <>  struct ilist_traits<MachineBasicBlock> @@ -94,6 +95,9 @@ class MachineFunction : private Annotation {    typedef ilist<MachineBasicBlock> BasicBlockListType;    BasicBlockListType BasicBlocks; +  // Tracks debug locations. +  DebugLocTracker DebugLocInfo; +  public:    MachineFunction(const Function *Fn, const TargetMachine &TM);    ~MachineFunction(); @@ -302,6 +306,15 @@ public:    /// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.    ///    void DeleteMachineBasicBlock(MachineBasicBlock *MBB); + +  //===--------------------------------------------------------------------===// +  // Debug location. +  // + +  /// lookUpDebugLocId - Look up the DebugLocTuple index with the given +  /// filename, line, and column. It may add a new filename and / or +  /// a new DebugLocTuple. +  unsigned lookUpDebugLocId(const char *Filename, unsigned Line, unsigned Col);  };  //===--------------------------------------------------------------------===// diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index 8bae7bbb92c..0d442af7eda 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -378,6 +378,33 @@ MachineFunction& MachineFunction::get(const Function *F)    return *mc;  } +/// lookUpDebugLocId - Look up the DebugLocTuple index with the given +/// filename, line, and column. It may add a new filename and / or +/// a new DebugLocTuple. +unsigned MachineFunction::lookUpDebugLocId(const char *Filename, unsigned Line, +                                           unsigned Col) { +  unsigned FileId; +  StringMap<unsigned>::iterator I = +    DebugLocInfo.DebugFilenamesMap.find(Filename); +  if (I != DebugLocInfo.DebugFilenamesMap.end()) +    FileId = I->second; +  else { +    // Add a new filename. +    FileId = DebugLocInfo.NumFilenames++; +    DebugLocInfo.DebugFilenames.push_back(Filename); +    DebugLocInfo.DebugFilenamesMap[Filename] = FileId; +  } + +  struct DebugLocTuple Tuple(FileId, Line, Col); +  DebugIdMapType::iterator II = DebugLocInfo.DebugIdMap.find(Tuple); +  if (II != DebugLocInfo.DebugIdMap.end()) +    return II->second; +  // Add a new tuple. +  DebugLocInfo.DebugLocations.push_back(Tuple); +  DebugLocInfo.DebugIdMap[Tuple] = DebugLocInfo.NumDebugLocations; +  return DebugLocInfo.NumDebugLocations++; +} +  //===----------------------------------------------------------------------===//  //  MachineFrameInfo implementation  //===----------------------------------------------------------------------===//  | 

