Index: clang-tidy/ClangTidy.cpp
===================================================================
--- clang-tidy/ClangTidy.cpp
+++ clang-tidy/ClangTidy.cpp
@@ -39,6 +39,7 @@
 #include "clang/Tooling/Refactoring.h"
 #include "clang/Tooling/ReplacementsYaml.h"
 #include "clang/Tooling/Tooling.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/Support/Process.h"
 #include "llvm/Support/Signals.h"
 #include <algorithm>
@@ -237,8 +238,12 @@
     if (FilePath.empty())
       return SourceLocation();
 
-    const FileEntry *File = SourceMgr.getFileManager().getFile(FilePath);
-    FileID ID = SourceMgr.createFileID(File, SourceLocation(), SrcMgr::C_User);
+    if (Path2FileID.find(FilePath) == Path2FileID.end()) {
+      const FileEntry *File = SourceMgr.getFileManager().getFile(FilePath);
+      Path2FileID[FilePath] =
+          SourceMgr.createFileID(File, SourceLocation(), SrcMgr::C_User);
+    }
+    FileID ID = Path2FileID[FilePath];
     return SourceMgr.getLocForStartOfFile(ID).getLocWithOffset(Offset);
   }
 
@@ -248,6 +253,7 @@
         << Message.Message;
   }
 
+  DenseMap<StringRef, FileID> Path2FileID;
   FileManager Files;
   LangOptions LangOpts; // FIXME: use langopts from each original file
   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;