From 18c0403c9a977b47a170fba2d9e6f2956ffcf7c7 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Fri, 24 Aug 2018 08:59:54 +0000 Subject: [PATCH] [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 --- lib/Basic/FileManager.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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; } -- 2.40.0