summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2018-11-09 00:26:10 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2018-11-09 00:26:10 +0000
commitf5b6d11cf226cd62af2cdd1f28c8d3da6c4dbd59 (patch)
tree3b6fa96f54efa2986815c770cbad24160118860a
parent4680386c34ab5475d3ea5fdeca2735f36c8b9112 (diff)
downloadbcm5719-llvm-f5b6d11cf226cd62af2cdd1f28c8d3da6c4dbd59.tar.gz
bcm5719-llvm-f5b6d11cf226cd62af2cdd1f28c8d3da6c4dbd59.zip
[VFS] Add "expand tilde" argument to getRealPath.
Add an optional argument to expand tildes in the path to mirror llvm's implementation of the corresponding function. llvm-svn: 346453
-rw-r--r--llvm/include/llvm/Support/VirtualFileSystem.h17
-rw-r--r--llvm/lib/Support/VirtualFileSystem.cpp27
-rw-r--r--llvm/unittests/Support/VirtualFileSystemTest.cpp4
3 files changed, 25 insertions, 23 deletions
diff --git a/llvm/include/llvm/Support/VirtualFileSystem.h b/llvm/include/llvm/Support/VirtualFileSystem.h
index b3326bbbe48..123cc2bce54 100644
--- a/llvm/include/llvm/Support/VirtualFileSystem.h
+++ b/llvm/include/llvm/Support/VirtualFileSystem.h
@@ -274,7 +274,8 @@ public:
/// symlinks. For real file system, this uses `llvm::sys::fs::real_path`.
/// This returns errc::operation_not_permitted if not implemented by subclass.
virtual std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const;
+ SmallVectorImpl<char> &Output,
+ bool ExpandTilde = false) const;
/// Check whether a file exists. Provided for convenience.
bool exists(const Twine &Path);
@@ -330,8 +331,8 @@ public:
llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override;
std::error_code setCurrentWorkingDirectory(const Twine &Path) override;
std::error_code isLocal(const Twine &Path, bool &Result) override;
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override;
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde = false) const override;
using iterator = FileSystemList::reverse_iterator;
using const_iterator = FileSystemList::const_reverse_iterator;
@@ -370,9 +371,9 @@ public:
std::error_code setCurrentWorkingDirectory(const Twine &Path) override {
return FS->setCurrentWorkingDirectory(Path);
}
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override {
- return FS->getRealPath(Path, Output);
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde = false) const override {
+ return FS->getRealPath(Path, Output, ExpandTilde);
}
protected:
@@ -465,8 +466,8 @@ public:
///
/// This doesn't resolve symlinks as they are not supported in in-memory file
/// system.
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override;
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde = false) const override;
std::error_code isLocal(const Twine &Path, bool &Result) override;
std::error_code setCurrentWorkingDirectory(const Twine &Path) override;
};
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index e8b0435b9cd..eeac88383aa 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -132,7 +132,8 @@ std::error_code FileSystem::makeAbsolute(SmallVectorImpl<char> &Path) const {
}
std::error_code FileSystem::getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const {
+ SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const {
return errc::operation_not_permitted;
}
@@ -238,8 +239,8 @@ public:
llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override;
std::error_code setCurrentWorkingDirectory(const Twine &Path) override;
std::error_code isLocal(const Twine &Path, bool &Result) override;
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override;
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde = false) const override;
private:
mutable std::mutex CWDMutex;
@@ -297,9 +298,9 @@ std::error_code RealFileSystem::isLocal(const Twine &Path, bool &Result) {
return llvm::sys::fs::is_local(Path, Result);
}
-std::error_code
-RealFileSystem::getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const {
+std::error_code RealFileSystem::getRealPath(const Twine &Path,
+ SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const {
return llvm::sys::fs::real_path(Path, Output);
}
@@ -393,12 +394,12 @@ std::error_code OverlayFileSystem::isLocal(const Twine &Path, bool &Result) {
return errc::no_such_file_or_directory;
}
-std::error_code
-OverlayFileSystem::getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const {
+std::error_code OverlayFileSystem::getRealPath(const Twine &Path,
+ SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const {
for (auto &FS : FSList)
if (FS->exists(Path))
- return FS->getRealPath(Path, Output);
+ return FS->getRealPath(Path, Output, ExpandTilde);
return errc::no_such_file_or_directory;
}
@@ -916,9 +917,9 @@ std::error_code InMemoryFileSystem::setCurrentWorkingDirectory(const Twine &P) {
return {};
}
-std::error_code
-InMemoryFileSystem::getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const {
+std::error_code InMemoryFileSystem::getRealPath(const Twine &Path,
+ SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const {
auto CWD = getCurrentWorkingDirectory();
if (!CWD || CWD->empty())
return errc::operation_not_permitted;
diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp
index 466cd117a50..3bbb5089c99 100644
--- a/llvm/unittests/Support/VirtualFileSystemTest.cpp
+++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp
@@ -73,8 +73,8 @@ public:
return std::error_code();
}
// Map any symlink to "/symlink".
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override {
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const override {
auto I = FilesAndDirs.find(Path.str());
if (I == FilesAndDirs.end())
return make_error_code(llvm::errc::no_such_file_or_directory);
OpenPOWER on IntegriCloud