PTH:
- Added a side-table per each token-cached file with the preprocessor conditional stack. This tracks what #if's are matched with what #endifs and where their respective tokens are in the PTH file. This will allow for quick skipping of excluded conditional branches in the Preprocessor.
- Performance testing shows the addition of this information (without actually utilizing it) leads to no performance regressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60911 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp
index 3afbb5b..0adcf41 100644
--- a/lib/Lex/PTHLexer.cpp
+++ b/lib/Lex/PTHLexer.cpp
@@ -194,19 +194,24 @@
class VISIBILITY_HIDDEN PTHFileLookup {
public:
class Val {
- uint32_t v;
+ uint32_t TokenOff;
+ uint32_t PPCondOff;
public:
- Val() : v(~0) {}
- Val(uint32_t x) : v(x) {}
+ Val() : TokenOff(~0) {}
+ Val(uint32_t toff, uint32_t poff) : TokenOff(toff), PPCondOff(poff) {}
- operator uint32_t() const {
- assert(v != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
- return v;
+ uint32_t getTokenOffset() const {
+ assert(TokenOff != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
+ return TokenOff;
}
- Val& operator=(uint32_t x) { v = x; return *this; }
- bool isValid() const { return v != ~((uint32_t)0); }
+ uint32_t gettPPCondOffset() const {
+ assert(TokenOff != ~((uint32_t)0) && "PTHFileLookup entry initialized.");
+ return PPCondOff;
+ }
+
+ bool isValid() const { return TokenOff != ~((uint32_t)0); }
};
private:
@@ -228,7 +233,8 @@
uint32_t len = Read32(D);
const char* s = D;
D += len;
- FileMap.GetOrCreateValue(s, s+len).getValue() = Read32(D);
+ uint32_t TokenOff = Read32(D);
+ FileMap.GetOrCreateValue(s, s+len).getValue() = Val(TokenOff, Read32(D));
}
}
};
@@ -351,13 +357,13 @@
// Lookup the FileEntry object in our file lookup data structure. It will
// return a variant that indicates whether or not there is an offset within
// the PTH file that contains cached tokens.
- PTHFileLookup::Val Off = ((PTHFileLookup*) FileLookup)->Lookup(FE);
+ PTHFileLookup::Val FileData = ((PTHFileLookup*) FileLookup)->Lookup(FE);
- if (!Off.isValid()) // No tokens available.
+ if (!FileData.isValid()) // No tokens available.
return 0;
// Compute the offset of the token data within the buffer.
- const char* data = Buf->getBufferStart() + Off;
+ const char* data = Buf->getBufferStart() + FileData.getTokenOffset();
assert(data < Buf->getBufferEnd());
return new PTHLexer(PP, SourceLocation::getFileLoc(FileID, 0), data, *this);
}