Index: lib/Basic/FileManager.cpp =================================================================== --- lib/Basic/FileManager.cpp +++ lib/Basic/FileManager.cpp @@ -218,9 +218,12 @@ bool CacheFailure) { ++NumFileLookups; + SmallString<1024> NativeFilename; + llvm::sys::path::native(Filename, NativeFilename); + // See if there is already an entry in the map. auto &NamedFileEnt = - *SeenFileEntries.insert(std::make_pair(Filename, nullptr)).first; + *SeenFileEntries.insert(std::make_pair(NativeFilename, nullptr)).first; // See if there is already an entry in the map. if (NamedFileEnt.second) @@ -241,11 +244,11 @@ // subdirectory. This will let us avoid having to waste time on known-to-fail // searches when we go to find sys/bar.h, because all the search directories // without a 'sys' subdir will get a cached failure result. - const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, Filename, + const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, NativeFilename, CacheFailure); if (DirInfo == nullptr) { // Directory doesn't exist, file can't exist. if (!CacheFailure) - SeenFileEntries.erase(Filename); + SeenFileEntries.erase(NativeFilename); return nullptr; } @@ -259,7 +262,7 @@ if (getStatValue(InterndFileName, Data, true, openFile ? &F : nullptr)) { // There's no real file at the given path. if (!CacheFailure) - SeenFileEntries.erase(Filename); + SeenFileEntries.erase(NativeFilename); return nullptr; } @@ -272,9 +275,9 @@ NamedFileEnt.second = &UFE; - // If the name returned by getStatValue is different than Filename, re-intern + // If the name returned by getStatValue is different than NativeFilename, re-intern // the name. - if (Data.Name != Filename) { + if (Data.Name != NativeFilename) { auto &NamedFileEnt = *SeenFileEntries.insert(std::make_pair(Data.Name, nullptr)).first; if (!NamedFileEnt.second)