]> granicus.if.org Git - clang/commitdiff
Separate out the initial loading of a PCH so that loading chained PCHs can reuse it.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 16 Jul 2010 20:41:52 +0000 (20:41 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 16 Jul 2010 20:41:52 +0000 (20:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108551 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHReader.h
lib/Frontend/PCHReader.cpp

index 654f4a6e4f62ef8bba3d38b8cb7385fddd725dbc..bef9dd6bd9faac9335cc2190bcf1d734c9d005ff 100644 (file)
@@ -531,7 +531,9 @@ private:
 
   void MaybeAddSystemRootToFilename(std::string &Filename);
 
-  PCHReadResult ReadPCHBlock();
+  PCHReadResult OpenPCH(llvm::StringRef FileName);
+  PCHReadResult ReadChainedPCH(llvm::StringRef FileName);
+  PCHReadResult ReadPCHBlock(PerFileData &F);
   bool CheckPredefinesBuffers();
   bool ParseLineTable(llvm::SmallVectorImpl<uint64_t> &Record);
   PCHReadResult ReadSourceManagerBlock();
index 08db0398828b5661a3282a85053fc125b99c71cf..7b95b8909af2552de42735a8fdba4b0f7ebfdbb8 100644 (file)
@@ -1368,8 +1368,7 @@ void PCHReader::MaybeAddSystemRootToFilename(std::string &Filename) {
 }
 
 PCHReader::PCHReadResult
-PCHReader::ReadPCHBlock() {
-  PerFileData &F = *Chain[0];
+PCHReader::ReadPCHBlock(PerFileData &F) {
   llvm::BitstreamCursor &Stream = F.Stream;
 
   if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID)) {
@@ -1659,36 +1658,13 @@ PCHReader::ReadPCHBlock() {
 }
 
 PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
-  Chain.push_back(new PerFileData());
-  PerFileData &F = *Chain.back();
-
-  // Set the PCH file name.
-  F.FileName = FileName;
-
-  // Open the PCH file.
-  //
-  // FIXME: This shouldn't be here, we should just take a raw_ostream.
-  std::string ErrStr;
-  F.Buffer.reset(llvm::MemoryBuffer::getFileOrSTDIN(FileName, &ErrStr));
-  if (!F.Buffer) {
-    Error(ErrStr.c_str());
-    return IgnorePCH;
+  switch(OpenPCH(FileName)) {
+  case Failure: return Failure;
+  case IgnorePCH: return IgnorePCH;
+  case Success: break;
   }
-
-  // Initialize the stream
-  F.StreamFile.init((const unsigned char *)F.Buffer->getBufferStart(),
-                    (const unsigned char *)F.Buffer->getBufferEnd());
+  PerFileData &F = *Chain.back();
   llvm::BitstreamCursor &Stream = F.Stream;
-  Stream.init(F.StreamFile);
-
-  // Sniff for the signature.
-  if (Stream.Read(8) != 'C' ||
-      Stream.Read(8) != 'P' ||
-      Stream.Read(8) != 'C' ||
-      Stream.Read(8) != 'H') {
-    Diag(diag::err_not_a_pch_file) << FileName;
-    return Failure;
-  }
 
   while (!Stream.AtEndOfStream()) {
     unsigned Code = Stream.ReadCode();
@@ -1709,7 +1685,7 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
       }
       break;
     case pch::PCH_BLOCK_ID:
-      switch (ReadPCHBlock()) {
+      switch (ReadPCHBlock(F)) {
       case Success:
         break;
 
@@ -1741,7 +1717,7 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
     }
   }
 
-  // Check the predefines buffer.
+  // Check the predefines buffers.
   if (CheckPredefinesBuffers())
     return IgnorePCH;
 
@@ -1786,6 +1762,49 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
   return Success;
 }
 
+PCHReader::PCHReadResult PCHReader::OpenPCH(llvm::StringRef FileName) {
+  Chain.push_back(new PerFileData());
+  PerFileData &F = *Chain.back();
+
+  // Set the PCH file name.
+  F.FileName = FileName;
+
+  // Open the PCH file.
+  //
+  // FIXME: This shouldn't be here, we should just take a raw_ostream.
+  std::string ErrStr;
+  F.Buffer.reset(llvm::MemoryBuffer::getFileOrSTDIN(FileName, &ErrStr));
+  if (!F.Buffer) {
+    Error(ErrStr.c_str());
+    return IgnorePCH;
+  }
+
+  // Initialize the stream
+  F.StreamFile.init((const unsigned char *)F.Buffer->getBufferStart(),
+                    (const unsigned char *)F.Buffer->getBufferEnd());
+  llvm::BitstreamCursor &Stream = F.Stream;
+  Stream.init(F.StreamFile);
+
+  // Sniff for the signature.
+  if (Stream.Read(8) != 'C' ||
+      Stream.Read(8) != 'P' ||
+      Stream.Read(8) != 'C' ||
+      Stream.Read(8) != 'H') {
+    Diag(diag::err_not_a_pch_file) << FileName;
+    return Failure;
+  }
+  return Success;
+}
+
+PCHReader::PCHReadResult PCHReader::ReadChainedPCH(llvm::StringRef FileName) {
+  switch(OpenPCH(FileName)) {
+  case Failure: return Failure;
+  case IgnorePCH: return IgnorePCH;
+  case Success: break;
+  }
+  return Success;
+}
+
 void PCHReader::setPreprocessor(Preprocessor &pp) {
   PP = &pp;