aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Basic/SourceManager.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-01-26 06:49:09 +0000
committerChris Lattner <sabre@nondot.org>2009-01-26 06:49:09 +0000
commit6e1aff2f586025f2d385ee49239f626b0fc63fd7 (patch)
tree8d480fa58e88e15193da8d54ec9cab6786afcfa6 /include/clang/Basic/SourceManager.h
parent478a18ec47fdb7e0e580a2635648456e9db9ad4f (diff)
Bitmangle file characteristic bits into the low bits of
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
Diffstat (limited to 'include/clang/Basic/SourceManager.h')
-rw-r--r--include/clang/Basic/SourceManager.h22
1 files changed, 12 insertions, 10 deletions
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
index 17c39f8016..a58662443d 100644
--- a/include/clang/Basic/SourceManager.h
+++ b/include/clang/Basic/SourceManager.h
@@ -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);
}
};