diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2010-07-16 20:41:52 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2010-07-16 20:41:52 +0000 |
commit | cdf3b83617a3e2471d592795622561506af9109e (patch) | |
tree | e980c9de29b543d52e5f098e41d82515116364be /lib/Frontend/PCHReader.cpp | |
parent | df4ca423ec7d9b62842e112d1b824faa08b64810 (diff) |
Separate out the initial loading of a PCH so that loading chained PCHs can reuse it.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108551 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 83 |
1 files changed, 51 insertions, 32 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 08db039882..7b95b8909a 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -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; |