aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/CacheTokens.cpp14
-rw-r--r--include/clang/Lex/PTHManager.h2
-rw-r--r--lib/Lex/PTHLexer.cpp12
3 files changed, 13 insertions, 15 deletions
diff --git a/Driver/CacheTokens.cpp b/Driver/CacheTokens.cpp
index d8a1fe1db1..6b9f96e981 100644
--- a/Driver/CacheTokens.cpp
+++ b/Driver/CacheTokens.cpp
@@ -517,8 +517,10 @@ void PTHWriter::GeneratePTH() {
// Generate the prologue.
Out << "cfe-pth";
Emit32(PTHManager::Version);
- Offset JumpOffset = Out.tell();
- Emit32(0);
+
+ // Leave 4 words for the prologue.
+ Offset PrologueOffset = Out.tell();
+ for (unsigned i = 0; i < 4 * sizeof(uint32_t); ++i) Emit8(0);
// Iterate over all the files in SourceManager. Create a lexer
// for each file and cache the tokens.
@@ -554,16 +556,12 @@ void PTHWriter::GeneratePTH() {
// Write out the file table.
Offset FileTableOff = EmitFileTable();
- // Finally, write out the offset table at the end.
- Offset JumpTargetOffset = Out.tell();
+ // Finally, write the prologue.
+ Out.seek(PrologueOffset);
Emit32(IdTableOff.first);
Emit32(IdTableOff.second);
Emit32(FileTableOff);
Emit32(SpellingOff);
-
- // Now write the offset in the prologue.
- Out.seek(JumpOffset);
- Emit32(JumpTargetOffset);
}
void clang::CacheTokens(Preprocessor& PP, const std::string& OutFile) {
diff --git a/include/clang/Lex/PTHManager.h b/include/clang/Lex/PTHManager.h
index 83e2a9806b..049c0d2f0d 100644
--- a/include/clang/Lex/PTHManager.h
+++ b/include/clang/Lex/PTHManager.h
@@ -95,7 +95,7 @@ class PTHManager : public IdentifierInfoLookup {
public:
// The current PTH version.
- enum { Version = 5 };
+ enum { Version = 6 };
~PTHManager();
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp
index 18f2dc4d8e..9f878b630d 100644
--- a/lib/Lex/PTHLexer.cpp
+++ b/lib/Lex/PTHLexer.cpp
@@ -597,16 +597,16 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) {
}
// Compute the address of the index table at the end of the PTH file.
- const unsigned char *EndTable = BufBeg + ReadLE32(p);
+ const unsigned char *PrologueOffset = p;
- if (EndTable >= BufEnd) {
+ if (PrologueOffset >= BufEnd) {
InvalidPTH(Diags);
return 0;
}
// Construct the file lookup table. This will be used for mapping from
// FileEntry*'s to cached tokens.
- const unsigned char* FileTableOffset = EndTable + sizeof(uint32_t)*2;
+ const unsigned char* FileTableOffset = PrologueOffset + sizeof(uint32_t)*2;
const unsigned char* FileTable = BufBeg + ReadLE32(FileTableOffset);
if (!(FileTable > BufBeg && FileTable < BufEnd)) {
@@ -622,7 +622,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) {
// Get the location of the table mapping from persistent ids to the
// data needed to reconstruct identifiers.
- const unsigned char* IDTableOffset = EndTable + sizeof(uint32_t)*0;
+ const unsigned char* IDTableOffset = PrologueOffset + sizeof(uint32_t)*0;
const unsigned char* IData = BufBeg + ReadLE32(IDTableOffset);
if (!(IData >= BufBeg && IData < BufEnd)) {
@@ -632,7 +632,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) {
// Get the location of the hashtable mapping between strings and
// persistent IDs.
- const unsigned char* StringIdTableOffset = EndTable + sizeof(uint32_t)*1;
+ const unsigned char* StringIdTableOffset = PrologueOffset + sizeof(uint32_t)*1;
const unsigned char* StringIdTable = BufBeg + ReadLE32(StringIdTableOffset);
if (!(StringIdTable >= BufBeg && StringIdTable < BufEnd)) {
InvalidPTH(Diags);
@@ -647,7 +647,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) {
}
// Get the location of the spelling cache.
- const unsigned char* spellingBaseOffset = EndTable + sizeof(uint32_t)*3;
+ const unsigned char* spellingBaseOffset = PrologueOffset + sizeof(uint32_t)*3;
const unsigned char* spellingBase = BufBeg + ReadLE32(spellingBaseOffset);
if (!(spellingBase >= BufBeg && spellingBase < BufEnd)) {
InvalidPTH(Diags);