diff options
-rw-r--r-- | Driver/CacheTokens.cpp | 14 | ||||
-rw-r--r-- | include/clang/Lex/PTHManager.h | 2 | ||||
-rw-r--r-- | lib/Lex/PTHLexer.cpp | 12 |
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); |