From: Eric Liu Date: Fri, 24 Aug 2018 08:59:54 +0000 (+0000) Subject: [FileManager] Do not call 'real_path' in getFile(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=18c0403c9a977b47a170fba2d9e6f2956ffcf7c7;p=clang [FileManager] Do not call 'real_path' in getFile(). Summary: This partially rolls back the change in D48903: https://github.com/llvm-mirror/clang/commit/89aa7f45a1f728144935289d4ce69d8522999de0#diff-0025af005307891b5429b6a834823d5eR318 `real_path` can be very expensive on real file systems, and calling it on each opened file can slow down the compilation. This also slows down deserialized ASTs for which real paths need to be recalculated for each input files again. For clangd code completion latency (using preamble): Before {F7039629} After {F7039630} Reviewers: ilya-biryukov, simark Reviewed By: ilya-biryukov Subscribers: kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D51159 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340598 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/FileManager.cpp b/lib/Basic/FileManager.cpp index 5f783a7c0b..060d3a687a 100644 --- a/lib/Basic/FileManager.cpp +++ b/lib/Basic/FileManager.cpp @@ -316,10 +316,14 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile, UFE.File = std::move(F); UFE.IsValid = true; - SmallString<128> RealPathName; - if (!FS->getRealPath(InterndFileName, RealPathName)) - UFE.RealPathName = RealPathName.str(); - + llvm::SmallString<128> AbsPath(InterndFileName); + // This is not the same as `VFS::getRealPath()`, which resolves symlinks but + // can be very expensive on real file systems. + // FIXME: the semantic of RealPathName is unclear, and the name might be + // misleading. We need to clean up the interface here. + makeAbsolutePath(AbsPath); + llvm::sys::path::remove_dots(AbsPath, /*remove_dot_dot=*/true); + UFE.RealPathName = AbsPath.str(); return &UFE; }