[llvm-commits] [llvm] r63008 - in /llvm/trunk: include/llvm/CodeGen/DebugLoc.h include/llvm/CodeGen/MachineFunction.h lib/CodeGen/MachineFunction.cpp

Evan Cheng evan.cheng at apple.com
Sun Jan 25 23:41:49 PST 2009


Author: evancheng
Date: Mon Jan 26 01:41:49 2009
New Revision: 63008

URL: http://llvm.org/viewvc/llvm-project?rev=63008&view=rev
Log:
Add data structure to define and track debug location during codegen.

Added:
    llvm/trunk/include/llvm/CodeGen/DebugLoc.h
Modified:
    llvm/trunk/include/llvm/CodeGen/MachineFunction.h
    llvm/trunk/lib/CodeGen/MachineFunction.cpp

Added: llvm/trunk/include/llvm/CodeGen/DebugLoc.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DebugLoc.h?rev=63008&view=auto

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/DebugLoc.h (added)
+++ llvm/trunk/include/llvm/CodeGen/DebugLoc.h Mon Jan 26 01:41:49 2009
@@ -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 */

Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFunction.h?rev=63008&r1=63007&r2=63008&view=diff

==============================================================================
--- llvm/trunk/include/llvm/CodeGen/MachineFunction.h (original)
+++ llvm/trunk/include/llvm/CodeGen/MachineFunction.h Mon Jan 26 01:41:49 2009
@@ -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 @@
   typedef ilist<MachineBasicBlock> BasicBlockListType;
   BasicBlockListType BasicBlocks;
 
+  // Tracks debug locations.
+  DebugLocTracker DebugLocInfo;
+
 public:
   MachineFunction(const Function *Fn, const TargetMachine &TM);
   ~MachineFunction();
@@ -302,6 +306,15 @@
   /// 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);
 };
 
 //===--------------------------------------------------------------------===//

Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=63008&r1=63007&r2=63008&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Mon Jan 26 01:41:49 2009
@@ -378,6 +378,33 @@
   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
 //===----------------------------------------------------------------------===//





More information about the llvm-commits mailing list