diff options
-rw-r--r-- | Driver/CacheTokens.cpp | 10 | ||||
-rw-r--r-- | lib/Lex/PTHLexer.cpp | 19 |
2 files changed, 20 insertions, 9 deletions
diff --git a/Driver/CacheTokens.cpp b/Driver/CacheTokens.cpp index fcb4d2f12d..975d3648ee 100644 --- a/Driver/CacheTokens.cpp +++ b/Driver/CacheTokens.cpp @@ -454,6 +454,11 @@ void PTHWriter::EmitCachedSpellings() { } void PTHWriter::GeneratePTH() { + // Generate the prologue. + Out << "cfe-pth"; + Offset JumpOffset = Out.tell(); + Emit32(0); + // Iterate over all the files in SourceManager. Create a lexer // for each file and cache the tokens. SourceManager &SM = PP.getSourceManager(); @@ -490,10 +495,15 @@ void PTHWriter::GeneratePTH() { Offset FileTableOff = EmitFileTable(); // Finally, write out the offset table at the end. + Offset JumpTargetOffset = Out.tell(); Emit32(IdTableOff.first); Emit32(IdTableOff.second.first); Emit32(IdTableOff.second.second); Emit32(FileTableOff); + + // Now write the offset in the prologue. + Out.seek(JumpOffset); + Emit32(JumpTargetOffset); } void clang::CacheTokens(Preprocessor& PP, const std::string& OutFile) { diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index f6994e0976..747ec10156 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -520,17 +520,18 @@ PTHManager* PTHManager::Create(const std::string& file) { // words at the end of the file. const unsigned char* BufBeg = (unsigned char*)File->getBufferStart(); const unsigned char* BufEnd = (unsigned char*)File->getBufferEnd(); - - if(!(BufEnd > BufBeg + sizeof(uint32_t)*3)) { - assert(false && "Invalid PTH file."); - return 0; // FIXME: Proper error diagnostic? - } + + // Check the prologue of the file. + if ((BufEnd - BufBeg) < (unsigned) (sizeof("cfe-pth") + 3) || + memcmp(BufBeg, "cfe-pth", sizeof("cfe-pth") - 1) != 0) + return 0; // Compute the address of the index table at the end of the PTH file. - // This table contains the offset of the file lookup table, the - // persistent ID -> identifer data table. - // FIXME: We should just embed this offset in the PTH file. - const unsigned char* EndTable = BufEnd - sizeof(uint32_t)*4; + const unsigned char *p = BufBeg + (sizeof("cfe-pth") - 1); + const unsigned char *EndTable = BufBeg + ReadLE32(p); + + if (EndTable >= BufEnd) + return 0; // Construct the file lookup table. This will be used for mapping from // FileEntry*'s to cached tokens. |