Since we're stuck with realpath for the header <-> module mapping,

factor the realpath calls into FileManager::getCanonicalName() so we
can cache the results of this epically slow operation. 5% speedup on
my modules test, and realpath drops out of the profile.

llvm-svn: 173542
This commit is contained in:
Douglas Gregor
2013-01-26 00:55:12 +00:00
parent d0c842d7a4
commit e00c8b205e
4 changed files with 67 additions and 43 deletions

View File

@@ -40,6 +40,11 @@
#define S_ISFIFO(x) (0)
#endif
#endif
#if defined(LLVM_ON_UNIX)
#if defined(__linux__)
#include <linux/limits.h>
#endif
#endif
using namespace clang;
// FIXME: Enhance libsystem to support inode and other fields.
@@ -620,6 +625,29 @@ void FileManager::modifyFileEntry(FileEntry *File,
File->ModTime = ModificationTime;
}
StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) {
// FIXME: use llvm::sys::fs::canonical() when it gets implemented
#ifdef LLVM_ON_UNIX
llvm::DenseMap<const DirectoryEntry *, llvm::StringRef>::iterator Known
= CanonicalDirNames.find(Dir);
if (Known != CanonicalDirNames.end())
return Known->second;
StringRef CanonicalName(Dir->getName());
char CanonicalNameBuf[PATH_MAX];
if (realpath(Dir->getName(), CanonicalNameBuf)) {
unsigned Len = strlen(CanonicalNameBuf);
char *Mem = static_cast<char *>(CanonicalNameStorage.Allocate(Len, 1));
memcpy(Mem, CanonicalNameBuf, Len);
CanonicalName = StringRef(Mem, Len);
}
CanonicalDirNames.insert(std::make_pair(Dir, CanonicalName));
return CanonicalName;
#else
return StringRef(Dir->getName());
#endif
}
void FileManager::PrintStats() const {
llvm::errs() << "\n*** File Manager Stats:\n";