From: Douglas Gregor Date: Mon, 22 Oct 2012 23:59:45 +0000 (+0000) Subject: Handle implicitly-included PCH files the same way as X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4ec429d1be4ede3d02712714f20470b2c87f748c;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166452 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 1de547d9b4..83248454aa 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2224,16 +2224,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, OPT_include_pth), ie = Args.filtered_end(); it != ie; ++it) { const Arg *A = *it; - // PCH is handled specially, we need to extra the original include path. - if (A->getOption().matches(OPT_include_pch)) { - std::string OriginalFile = - ASTReader::getOriginalSourceFile(A->getValue(Args), FileMgr, Diags); - if (OriginalFile.empty()) - continue; - - Opts.Includes.push_back(OriginalFile); - } else - Opts.Includes.push_back(A->getValue(Args)); + Opts.Includes.push_back(A->getValue(Args)); } for (arg_iterator it = Args.filtered_begin(OPT_chain_include), diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index e8e57cbf58..24e7dcd95c 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/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 @@ -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()); }