From: Daniel Dunbar Date: Wed, 11 Nov 2009 23:58:53 +0000 (+0000) Subject: Tweak PCH -include handling to make sure it matches the name as would be present X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7162937a4ccd044a0df67eed4a73ee828c49162;p=clang Tweak PCH -include handling to make sure it matches the name as would be present in the predefines buffer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86903 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/Utils.h b/include/clang/Frontend/Utils.h index 60c0f226ef..4bda8bd71d 100644 --- a/include/clang/Frontend/Utils.h +++ b/include/clang/Frontend/Utils.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_FRONTEND_UTILS_H #define LLVM_CLANG_FRONTEND_UTILS_H +#include "llvm/ADT/StringRef.h" #include #include @@ -40,6 +41,10 @@ class SourceManager; class Stmt; class TargetInfo; +/// Normalize \arg File for use in a user defined #include directive (in the +/// predefines buffer). +std::string NormalizeDashIncludePath(llvm::StringRef File); + /// Apply the header search options to get given HeaderSearch object. void ApplyHeaderSearchOptions(HeaderSearch &HS, const HeaderSearchOptions &HSOpts, diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index ad70727c05..462e065e8c 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -61,9 +61,7 @@ static void UndefineBuiltinMacro(std::vector &Buf, const char *Macro) { Buf.push_back('\n'); } -/// Add the quoted name of an implicit include file. -static void AddQuotedIncludePath(std::vector &Buf, - const std::string &File) { +std::string clang::NormalizeDashIncludePath(llvm::StringRef File) { // Implicit include paths should be resolved relative to the current // working directory first, and then use the regular header search // mechanism. The proper way to handle this is to have the @@ -76,9 +74,16 @@ static void AddQuotedIncludePath(std::vector &Buf, if (!Path.exists()) Path = File; + return Lexer::Stringify(Path.str()); +} + +/// Add the quoted name of an implicit include file. +static void AddQuotedIncludePath(std::vector &Buf, + const std::string &File) { + // Escape double quotes etc. Buf.push_back('"'); - std::string EscapedFile = Lexer::Stringify(Path.str()); + std::string EscapedFile = NormalizeDashIncludePath(File); Buf.insert(Buf.end(), EscapedFile.begin(), EscapedFile.end()); Buf.push_back('"'); } diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 936382482c..780890de2a 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -13,6 +13,7 @@ #include "clang/Frontend/PCHReader.h" #include "clang/Frontend/FrontendDiagnostic.h" +#include "clang/Frontend/Utils.h" #include "../Sema/Sema.h" // FIXME: move Sema headers elsewhere #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" @@ -158,12 +159,13 @@ bool PCHValidator::ReadPredefinesBuffer(llvm::StringRef PCHPredef, FileID PCHBufferID, llvm::StringRef OriginalFileName, std::string &SuggestedPredefines) { - // We are in the context of an implicit include, so the predefines buffer - // will have a #include entry for the PCH file itself. Find it and skip over - // it in the checking below. + // We are in the context of an implicit include, so the predefines buffer will + // have a #include entry for the PCH file itself (as normalized by the + // preprocessor initialization). Find it and skip over it in the checking + // below. llvm::SmallString<256> PCHInclude; PCHInclude += "#include \""; - PCHInclude += OriginalFileName; + PCHInclude += NormalizeDashIncludePath(OriginalFileName); PCHInclude += "\"\n"; std::pair Split = llvm::StringRef(PP.getPredefines()).split(PCHInclude.str());