]> granicus.if.org Git - clang/commitdiff
Embed the offset of the PTH table inside the prologue of the PTH file. This will...
authorTed Kremenek <kremenek@apple.com>
Mon, 26 Jan 2009 21:43:14 +0000 (21:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 26 Jan 2009 21:43:14 +0000 (21:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63045 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/CacheTokens.cpp
lib/Lex/PTHLexer.cpp

index fcb4d2f12db117bf1da46fb76ceae36ff1d75630..975d3648ee29c95703aa436e311650d29960918f 100644 (file)
@@ -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) {
index f6994e0976d221d4edf27a5bbaded83dd3ad85b8..747ec101566ba7c52667e10aeb01b541a8db5cf6 100644 (file)
@@ -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.