]> granicus.if.org Git - clang/commitdiff
Add support for reusing macroid's with negative physical loc deltas. This
authorChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 06:41:57 +0000 (06:41 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Jul 2007 06:41:57 +0000 (06:41 +0000)
keeps the MacroInfo table more compact.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40281 91177308-0d34-0410-b5e6-96231b3b80d8

Basic/SourceManager.cpp
include/clang/Basic/SourceLocation.h

index d05da5d971b838688536fed29b05106815afe5f1..be8eeee4086d13572915417c31795fab867d9145 100644 (file)
@@ -180,20 +180,19 @@ SourceLocation SourceManager::getInstantiationLoc(SourceLocation PhysLoc,
   // reuse it.  This implements a single-entry cache.
   if (!MacroIDs.empty()) {
     MacroIDInfo &LastOne = MacroIDs.back();
+    
     if (LastOne.getInstantiationLoc() == InstantLoc &&
         LastOne.getPhysicalLoc().getFileID() == PhysLoc.getFileID()) {
       
       int PhysDelta = PhysLoc.getRawFilePos() -
                       LastOne.getPhysicalLoc().getRawFilePos();
-      if (unsigned(PhysDelta) < (1 << SourceLocation::MacroPhysOffsBits))
-        return SourceLocation::getMacroLoc(MacroIDs.size()-1,
-                                           (unsigned)PhysDelta, 0);
+      if (SourceLocation::isValidMacroPhysOffs(PhysDelta))
+        return SourceLocation::getMacroLoc(MacroIDs.size()-1, PhysDelta, 0);
     }
   }
   
  
   MacroIDs.push_back(MacroIDInfo::get(InstantLoc, PhysLoc));
-  
   return SourceLocation::getMacroLoc(MacroIDs.size()-1, 0, 0);
 }
 
index f0dd0261840ecc114058f751c1c48ccb48b43296..6ba17b053089d90e00ec3cb1e12ba55da56ee0fb 100644 (file)
@@ -28,9 +28,9 @@ public:
     FileIDBits  = 14,
     FilePosBits = 32-1-FileIDBits,
     
-    MacroIDBits       = 19,
+    MacroIDBits       = 20,
     MacroPhysOffsBits = 9,
-    MacroLogOffBits   = 3
+    MacroLogOffBits   = 2
   };
 
   SourceLocation() : ID(0) {}  // 0 is an invalid FileID.
@@ -56,16 +56,24 @@ public:
     return L;
   }
   
-  static SourceLocation getMacroLoc(unsigned MacroID, unsigned PhysOffs,
+  static bool isValidMacroPhysOffs(int Val) {
+    if (Val >= 0)
+      return Val < (1 << (MacroPhysOffsBits-1));
+    return -Val < (1 << (MacroPhysOffsBits-1));
+  }
+  
+  static SourceLocation getMacroLoc(unsigned MacroID, int PhysOffs,
                                     unsigned LogOffs) {
-    SourceLocation L;
-    
     assert(MacroID < (1 << MacroIDBits) && "Too many macros!");
-    assert(PhysOffs < (1 << MacroPhysOffsBits) && "Physoffs too large!");
+    assert(isValidMacroPhysOffs(PhysOffs) && "Physoffs too large!");
     assert(LogOffs  < (1 << MacroLogOffBits) && "Logical offs too large!");
     
+    PhysOffs &= (1 << MacroPhysOffsBits)-1;
+    
+    SourceLocation L;
     L.ID = (1 << 31) | (MacroID << (MacroPhysOffsBits+MacroLogOffBits)) |
-           (PhysOffs << MacroLogOffBits) | LogOffs;
+           (PhysOffs << MacroLogOffBits) |
+           LogOffs;
     return L;
   }
   
@@ -99,9 +107,12 @@ public:
     return (ID >> (MacroPhysOffsBits+MacroLogOffBits)) & ((1 << MacroIDBits)-1);
   }
   
-  unsigned getMacroPhysOffs() const {
+  int getMacroPhysOffs() const {
     assert(isMacroID() && "Is not a macro id!");
-    return (ID >> MacroLogOffBits) & ((1 << MacroPhysOffsBits)-1);
+    int Val = (ID >> MacroLogOffBits) & ((1 << MacroPhysOffsBits)-1);
+    // Sign extend it properly.
+    unsigned ShAmt = sizeof(int)*8 - MacroPhysOffsBits;
+    return (Val << ShAmt) >> ShAmt;
   }
   
   unsigned getMacroLogOffs() const {
@@ -111,7 +122,7 @@ public:
   
   /// getFileLocWithOffset - Return a source location with the specified offset
   /// from this file SourceLocation.
-  SourceLocation getFileLocWithOffset(unsigned Offset) const {
+  SourceLocation getFileLocWithOffset(int Offset) const {
     return getFileLoc(getFileID(), getRawFilePos()+Offset);
   }