diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-10-22 23:59:45 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-10-22 23:59:45 +0000 |
commit | c2d984c82384c6d264cc27c2dc4fbf09513912cb (patch) | |
tree | 0a02e3b4740042cd9579cbe56185ae4acdcbb803 /clang/lib/Frontend/InitPreprocessor.cpp | |
parent | 0f4871d48702471a4d6832432db393124fd1e608 (diff) | |
download | bcm5719-llvm-c2d984c82384c6d264cc27c2dc4fbf09513912cb.tar.gz bcm5719-llvm-c2d984c82384c6d264cc27c2dc4fbf09513912cb.zip |
Handle implicitly-included PCH files the same way as
implicitly-included PTH files during initialization, delaying the
mapping down to the "original source file" until after later in the
initialization process.
llvm-svn: 166452
Diffstat (limited to 'clang/lib/Frontend/InitPreprocessor.cpp')
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index e8e57cbf584..24e7dcd95cf 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -22,6 +22,7 @@ #include "clang/Lex/Preprocessor.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" +#include "clang/Serialization/ASTReader.h" #include "llvm/ADT/APFloat.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" @@ -83,6 +84,19 @@ static void AddImplicitIncludePTH(MacroBuilder &Builder, Preprocessor &PP, AddImplicitInclude(Builder, OriginalFile, PP.getFileManager()); } +/// \brief Add an implicit \#include using the original file used to generate +/// a PCH file. +static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, + StringRef ImplicitIncludePCH) { + std::string OriginalFile = + ASTReader::getOriginalSourceFile(ImplicitIncludePCH, PP.getFileManager(), + PP.getDiagnostics()); + if (OriginalFile.empty()) + return; + + AddImplicitInclude(Builder, OriginalFile, PP.getFileManager()); +} + /// PickFP - This is used to pick a value based on the FP semantics of the /// specified FP model. template <typename T> @@ -763,6 +777,8 @@ void clang::InitializePreprocessor(Preprocessor &PP, const std::string &Path = InitOpts.Includes[i]; if (Path == InitOpts.ImplicitPTHInclude) AddImplicitIncludePTH(Builder, PP, Path); + else if (Path == InitOpts.ImplicitPCHInclude) + AddImplicitIncludePCH(Builder, PP, Path); else AddImplicitInclude(Builder, Path, PP.getFileManager()); } |