Skip to content

Commit

Permalink
[FileManager] Do not call 'real_path' in getFile().
Browse files Browse the repository at this point in the history
Summary:
This partially rolls back the change in D48903:
llvm-mirror/clang@89aa7f4#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

llvm-svn: 340598
  • Loading branch information
Eric Liu committed Aug 24, 2018
1 parent 562811a commit 411e710
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions clang/lib/Basic/FileManager.cpp
Expand Up @@ -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;
}

Expand Down

0 comments on commit 411e710

Please sign in to comment.