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

llvm-svn: 68665
This commit is contained in:
Daniel Dunbar 2009-04-09 00:51:16 +00:00
parent f02d62deeb
commit f67829ac6a
1 changed files with 22 additions and 13 deletions

View 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"; // ##?