From: Daniel Dunbar Date: Thu, 9 Apr 2009 00:51:16 +0000 (+0000) Subject: Make -include, -imacros paths absolute in Frontend. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95bf5d6a86146cb99a1c8a32d4422a46be32fe65;p=clang Make -include, -imacros paths absolute in Frontend. - Otherwise paths will be resolved relative to the main input file, which is incorrect. - I don't know how to make a reasonable test case for this with our testing infrastructure. - PR3395 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68665 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index ea65c0f8cf..3c06ea736c 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -1006,28 +1006,37 @@ static void DefineBuiltinMacro(std::vector &Buf, const char *Macro, Buf.push_back('\n'); } -/// AddImplicitInclude - Add an implicit #include of the specified file to the -/// predefines buffer. -static void AddImplicitInclude(std::vector &Buf, const std::string &File){ - const char *Inc = "#include \""; - Buf.insert(Buf.end(), Inc, Inc+strlen(Inc)); - +/// Add the quoted name of an implicit include file. +static void AddQuotedIncludePath(std::vector &Buf, + const std::string &File) { + // Implicit include paths are relative to the current working + // directory; resolve them now instead of using the normal machinery + // (which would look relative to the input file). + llvm::sys::Path Path(File); + Path.makeAbsolute(); + // Escape double quotes etc. - std::string EscapedFile = Lexer::Stringify(File); + Buf.push_back('"'); + std::string EscapedFile = Lexer::Stringify(Path.toString()); Buf.insert(Buf.end(), EscapedFile.begin(), EscapedFile.end()); Buf.push_back('"'); +} + +/// AddImplicitInclude - Add an implicit #include of the specified file to the +/// predefines buffer. +static void AddImplicitInclude(std::vector &Buf, + const std::string &File) { + const char *Inc = "#include "; + Buf.insert(Buf.end(), Inc, Inc+strlen(Inc)); + AddQuotedIncludePath(Buf, File); Buf.push_back('\n'); } static void AddImplicitIncludeMacros(std::vector &Buf, const std::string &File) { - const char *Inc = "#__include_macros \""; + const char *Inc = "#__include_macros "; Buf.insert(Buf.end(), Inc, Inc+strlen(Inc)); - - // Escape double quotes etc. - std::string EscapedFile = Lexer::Stringify(File); - Buf.insert(Buf.end(), EscapedFile.begin(), EscapedFile.end()); - Buf.push_back('"'); + AddQuotedIncludePath(Buf, File); Buf.push_back('\n'); // Marker token to stop the __include_macros fetch loop. const char *Marker = "##\n"; // ##?