From 5437a4c5e90886c6688da90eaf70617d50e64895 Mon Sep 17 00:00:00 2001 From: Ben Langmuir Date: Tue, 25 Apr 2023 11:04:06 -0700 Subject: [llvm][vfs] Avoid silent fallback to process-wide working directory In createPhysicalFileSystem, preserve the per-instance working directory, even after the first call to getcwd fails. rdar://108213753 Differential Revision: https://reviews.llvm.org/D149173 --- llvm/lib/Support/VirtualFileSystem.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'llvm/lib/Support/VirtualFileSystem.cpp') diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp index a167e0a76795..bcf5389db6a0 100644 --- a/llvm/lib/Support/VirtualFileSystem.cpp +++ b/llvm/lib/Support/VirtualFileSystem.cpp @@ -257,12 +257,12 @@ public: explicit RealFileSystem(bool LinkCWDToProcess) { if (!LinkCWDToProcess) { SmallString<128> PWD, RealPWD; - if (llvm::sys::fs::current_path(PWD)) - return; // Awful, but nothing to do here. - if (llvm::sys::fs::real_path(PWD, RealPWD)) - WD = {PWD, PWD}; + if (std::error_code EC = llvm::sys::fs::current_path(PWD)) + WD = EC; + else if (llvm::sys::fs::real_path(PWD, RealPWD)) + WD = WorkingDirectory{PWD, PWD}; else - WD = {PWD, RealPWD}; + WD = WorkingDirectory{PWD, RealPWD}; } } @@ -284,10 +284,10 @@ private: // If this FS has its own working dir, use it to make Path absolute. // The returned twine is safe to use as long as both Storage and Path live. Twine adjustPath(const Twine &Path, SmallVectorImpl &Storage) const { - if (!WD) + if (!WD || !*WD) return Path; Path.toVector(Storage); - sys::fs::make_absolute(WD->Resolved, Storage); + sys::fs::make_absolute(WD->get().Resolved, Storage); return Storage; } @@ -297,7 +297,7 @@ private: // The current working directory, with links resolved. (readlink .). SmallString<128> Resolved; }; - std::optional WD; + std::optional> WD; }; } // namespace @@ -323,8 +323,10 @@ RealFileSystem::openFileForRead(const Twine &Name) { } llvm::ErrorOr RealFileSystem::getCurrentWorkingDirectory() const { + if (WD && *WD) + return std::string(WD->get().Specified.str()); if (WD) - return std::string(WD->Specified.str()); + return WD->getError(); SmallString<128> Dir; if (std::error_code EC = llvm::sys::fs::current_path(Dir)) @@ -345,7 +347,7 @@ std::error_code RealFileSystem::setCurrentWorkingDirectory(const Twine &Path) { return std::make_error_code(std::errc::not_a_directory); if (auto Err = llvm::sys::fs::real_path(Absolute, Resolved)) return Err; - WD = {Absolute, Resolved}; + WD = WorkingDirectory{Absolute, Resolved}; return std::error_code(); } -- cgit v1.2.3