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 ea65c0f..3c06ea7 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -1006,28 +1006,37 @@
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"; // ##?