forked from OSchip/llvm-project
Use llvm::sys::fs::real_path() in clang.
No expected behavior change. https://reviews.llvm.org/D45165 llvm-svn: 329698
This commit is contained in:
parent
b1cb0b7957
commit
148c8cb4bf
|
@ -534,23 +534,9 @@ StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) {
|
|||
|
||||
StringRef CanonicalName(Dir->getName());
|
||||
|
||||
#ifdef LLVM_ON_UNIX
|
||||
char CanonicalNameBuf[PATH_MAX];
|
||||
if (realpath(Dir->getName().str().c_str(), CanonicalNameBuf))
|
||||
SmallString<PATH_MAX> CanonicalNameBuf;
|
||||
if (!llvm::sys::fs::real_path(Dir->getName(), CanonicalNameBuf))
|
||||
CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage);
|
||||
#else
|
||||
SmallString<256> CanonicalNameBuf(CanonicalName);
|
||||
llvm::sys::fs::make_absolute(CanonicalNameBuf);
|
||||
llvm::sys::path::native(CanonicalNameBuf);
|
||||
// We've run into needing to remove '..' here in the wild though, so
|
||||
// remove it.
|
||||
// On Windows, symlinks are significantly less prevalent, so removing
|
||||
// '..' is pretty safe.
|
||||
// Ideally we'd have an equivalent of `realpath` and could implement
|
||||
// sys::fs::canonical across all the platforms.
|
||||
llvm::sys::path::remove_dots(CanonicalNameBuf, /* remove_dot_dot */ true);
|
||||
CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage);
|
||||
#endif
|
||||
|
||||
CanonicalDirNames.insert(std::make_pair(Dir, CanonicalName));
|
||||
return CanonicalName;
|
||||
|
|
|
@ -97,24 +97,6 @@ struct ModuleDependencyMMCallbacks : public ModuleMapCallbacks {
|
|||
|
||||
}
|
||||
|
||||
// TODO: move this to Support/Path.h and check for HAVE_REALPATH?
|
||||
static bool real_path(StringRef SrcPath, SmallVectorImpl<char> &RealPath) {
|
||||
#ifdef LLVM_ON_UNIX
|
||||
char CanonicalPath[PATH_MAX];
|
||||
|
||||
// TODO: emit a warning in case this fails...?
|
||||
if (!realpath(SrcPath.str().c_str(), CanonicalPath))
|
||||
return false;
|
||||
|
||||
SmallString<256> RPath(CanonicalPath);
|
||||
RealPath.swap(RPath);
|
||||
return true;
|
||||
#else
|
||||
// FIXME: Add support for systems without realpath.
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ModuleDependencyCollector::attachToASTReader(ASTReader &R) {
|
||||
R.addListener(llvm::make_unique<ModuleDependencyListener>(*this));
|
||||
}
|
||||
|
@ -129,7 +111,7 @@ void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) {
|
|||
static bool isCaseSensitivePath(StringRef Path) {
|
||||
SmallString<256> TmpDest = Path, UpperDest, RealDest;
|
||||
// Remove component traversals, links, etc.
|
||||
if (!real_path(Path, TmpDest))
|
||||
if (llvm::sys::fs::real_path(Path, TmpDest))
|
||||
return true; // Current default value in vfs.yaml
|
||||
Path = TmpDest;
|
||||
|
||||
|
@ -139,7 +121,7 @@ static bool isCaseSensitivePath(StringRef Path) {
|
|||
// already expects when sensitivity isn't setup.
|
||||
for (auto &C : Path)
|
||||
UpperDest.push_back(toUppercase(C));
|
||||
if (real_path(UpperDest, RealDest) && Path.equals(RealDest))
|
||||
if (!llvm::sys::fs::real_path(UpperDest, RealDest) && Path.equals(RealDest))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -189,7 +171,7 @@ bool ModuleDependencyCollector::getRealPath(StringRef SrcPath,
|
|||
// Computing the real path is expensive, cache the search through the
|
||||
// parent path directory.
|
||||
if (DirWithSymLink == SymLinkMap.end()) {
|
||||
if (!real_path(Dir, RealPath))
|
||||
if (llvm::sys::fs::real_path(Dir, RealPath))
|
||||
return false;
|
||||
SymLinkMap[Dir] = RealPath.str();
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue