aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.cpp
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2010-07-16 20:41:52 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2010-07-16 20:41:52 +0000
commitcdf3b83617a3e2471d592795622561506af9109e (patch)
treee980c9de29b543d52e5f098e41d82515116364be /lib/Frontend/PCHReader.cpp
parentdf4ca423ec7d9b62842e112d1b824faa08b64810 (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.cpp83
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;