]> granicus.if.org Git - clang/commitdiff
Make -include, -imacros paths absolute in Frontend.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 9 Apr 2009 00:51:16 +0000 (00:51 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 9 Apr 2009 00:51:16 +0000 (00:51 +0000)
 - 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

tools/clang-cc/clang-cc.cpp

index ea65c0f8cf72caa3c381d79cbc54f2f1f7b5694e..3c06ea736caf9a5cc5dd4433e9e25971468385d4 100644 (file)
@@ -1006,28 +1006,37 @@ static void DefineBuiltinMacro(std::vector<char> &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<char> &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<char> &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<char> &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<char> &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"; // ##?