aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/PPDirectives.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Lex/PPDirectives.cpp')
-rw-r--r--lib/Lex/PPDirectives.cpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
index 417724b777..15ab049d26 100644
--- a/lib/Lex/PPDirectives.cpp
+++ b/lib/Lex/PPDirectives.cpp
@@ -19,6 +19,7 @@
#include "clang/Basic/FileManager.h"
#include "clang/Basic/SourceManager.h"
#include "llvm/ADT/APInt.h"
+#include "llvm/System/Path.h"
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -416,33 +417,49 @@ const FileEntry *Preprocessor::LookupFile(llvm::StringRef Filename,
const DirectoryLookup *&CurDir) {
// If the header lookup mechanism may be relative to the current file, pass in
// info about where the current file is.
- const FileEntry *CurFileEnt = 0;
+ llvm::sys::Path RelSearchPath;
+
if (!FromDir) {
FileID FID = getCurrentFileLexer()->getFileID();
- CurFileEnt = SourceMgr.getFileEntryForID(FID);
+ const FileEntry *CurFileEnt = SourceMgr.getFileEntryForID(FID);
// If there is no file entry associated with this file, it must be the
// predefines buffer. Any other file is not lexed with a normal lexer, so
- // it won't be scanned for preprocessor directives. If we have the
- // predefines buffer, resolve #include references (which come from the
- // -include command line argument) as if they came from the main file, this
- // affects file lookup etc.
- if (CurFileEnt == 0) {
+ // it won't be scanned for preprocessor directives.
+ //
+ // If we have the predefines buffer, resolve #include references (which
+ // come from the -include command line argument) as if they came from the
+ // main file. When the main file is actually stdin, resolve references
+ // as if they came from the current working directory.
+ if (CurFileEnt) {
+ if (!RelSearchPath.set(CurFileEnt->getDir()->getName())) {
+ assert("Main file somehow invalid path?");
+ }
+ } else {
FID = SourceMgr.getMainFileID();
CurFileEnt = SourceMgr.getFileEntryForID(FID);
+
+ if (CurFileEnt) {
+ // 'main file' case
+ RelSearchPath.set(CurFileEnt->getDir()->getName());
+ } else {
+ // stdin case
+ RelSearchPath = llvm::sys::Path::GetCurrentDirectory();
+ }
}
}
// Do a standard file entry lookup.
CurDir = CurDirLookup;
const FileEntry *FE =
- HeaderInfo.LookupFile(Filename, isAngled, FromDir, CurDir, CurFileEnt);
+ HeaderInfo.LookupFile(Filename, isAngled, FromDir, CurDir, RelSearchPath);
if (FE) return FE;
// Otherwise, see if this is a subframework header. If so, this is relative
// to one of the headers on the #include stack. Walk the list of the current
// headers on the #include stack and pass them to HeaderInfo.
if (IsFileLexer()) {
+ const FileEntry *CurFileEnt = 0;
if ((CurFileEnt = SourceMgr.getFileEntryForID(CurPPLexer->getFileID())))
if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt)))
return FE;
@@ -451,6 +468,7 @@ const FileEntry *Preprocessor::LookupFile(llvm::StringRef Filename,
for (unsigned i = 0, e = IncludeMacroStack.size(); i != e; ++i) {
IncludeStackInfo &ISEntry = IncludeMacroStack[e-i-1];
if (IsFileLexer(ISEntry)) {
+ const FileEntry *CurFileEnt = 0;
if ((CurFileEnt =
SourceMgr.getFileEntryForID(ISEntry.ThePPLexer->getFileID())))
if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt)))