]> granicus.if.org Git - clang/commitdiff
Bitmangle file characteristic bits into the low bits of
authorChris Lattner <sabre@nondot.org>
Mon, 26 Jan 2009 06:49:09 +0000 (06:49 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Jan 2009 06:49:09 +0000 (06:49 +0000)
the content cache pointer.  This saves 105876 bytes on
cocoa.h because it shrinks the SLocEntry union, which
we have a big array of.  It would be nice to use
PointerIntPair here, but we can't because it is in a
union.

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

include/clang/Basic/SourceManager.h

index 17c39f8016e3a7c1f4d0fc23a3f4b330cdee2776..a58662443d14bdc9331671fd54f62b23a32635da 100644 (file)
@@ -130,31 +130,33 @@ namespace SrcMgr {
     /// This is an invalid SLOC for the main file (top of the #include chain).
     unsigned IncludeLoc;  // Really a SourceLocation
     
-    /// Content - Information about the source buffer itself.
-    const ContentCache *Content;
-
-    /// FileCharacteristic - This is an instance of CharacteristicKind,
-    /// indicating whether this is a system header dir or not.
-    unsigned FileCharacteristic : 2;
+    /// Data - This contains the ContentCache* and the bits indicating the
+    /// characteristic of the file and whether it has #line info, all bitmangled
+    /// together.
+    uintptr_t Data;
   public:
     /// get - Return a FileInfo object.
     static FileInfo get(SourceLocation IL, const ContentCache *Con,
                         CharacteristicKind FileCharacter) {
       FileInfo X;
       X.IncludeLoc = IL.getRawEncoding();
-      X.Content = Con;
-      X.FileCharacteristic = FileCharacter;
+      X.Data = (uintptr_t)Con;
+      assert((X.Data & 7) == 0 &&"ContentCache pointer insufficiently aligned");
+      assert((unsigned)FileCharacter < 4 && "invalid file character");
+      X.Data |= (unsigned)FileCharacter;
       return X;
     }
     
     SourceLocation getIncludeLoc() const {
       return SourceLocation::getFromRawEncoding(IncludeLoc);
     }
-    const ContentCache* getContentCache() const { return Content; }
+    const ContentCache* getContentCache() const {
+      return reinterpret_cast<const ContentCache*>(Data & ~7UL);
+    }
     
     /// getCharacteristic - Return whether this is a system header or not.
     CharacteristicKind getFileCharacteristic() const { 
-      return (CharacteristicKind)FileCharacteristic;
+      return (CharacteristicKind)(Data & 3);
     }
   };