On Mon, Oct 5, 2015 at 9:55 AM, Benjamin Kramer via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: d0k > Date: Mon Oct 5 08:55:20 2015 > New Revision: 249316 > > URL: http://llvm.org/viewvc/llvm-project?rev=249316&view=rev > Log: > [VFS] Add working directories to every virtual file system. > > For RealFileSystem this is getcwd()/chdir(), the synthetic file systems can > make up one for themselves. OverlayFileSystem now synchronizes the working > directories when a new FS is added to the overlay or the overlay working > directory is set. This allows purely artificial file systems that have zero > ties to the underlying disks. > > Differential Revision: http://reviews.llvm.org/D13430 > > Modified: > cfe/trunk/include/clang/Basic/VirtualFileSystem.h > cfe/trunk/lib/Basic/VirtualFileSystem.cpp > cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp > > Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=249316&r1=249315&r2=249316&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original) > +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Mon Oct 5 08:55:20 > 2015 > @@ -199,6 +199,25 @@ public: > /// \note The 'end' iterator is directory_iterator(). > virtual directory_iterator dir_begin(const Twine &Dir, > std::error_code &EC) = 0; > + > + /// Set the working directory. This will affect all following > operations on > + /// this file system and may propagate down for nested file systems. > + virtual std::error_code setCurrentWorkingDirectory(const Twine &Path) = > 0; > + /// Get the working directory of this file system. > + virtual llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const = > 0; > + > + /// Make \a Path an absolute path. > + /// > + /// Makes \a Path absolute using the current directory if it is not > already. > + /// An empty \a Path will result in the current directory. > + /// > + /// /absolute/path => /absolute/path > + /// relative/../path => <current-directory>/relative/../path > + /// > + /// \param Path A path that is modified to be an absolute path. > + /// \returns success if \a path has been made absolute, otherwise a > + /// platform-specific error_code. > + std::error_code makeAbsolute(SmallVectorImpl<char> &Path) const; > }; > > /// \brief Gets an \p vfs::FileSystem for the 'real' file system, as seen > by > @@ -230,6 +249,8 @@ public: > llvm::ErrorOr<std::unique_ptr<File>> > openFileForRead(const Twine &Path) override; > directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) > override; > + llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override; > + std::error_code setCurrentWorkingDirectory(const Twine &Path) override; > > typedef FileSystemList::reverse_iterator iterator; > > @@ -248,6 +269,7 @@ class InMemoryDirectory; > /// An in-memory file system. > class InMemoryFileSystem : public FileSystem { > std::unique_ptr<detail::InMemoryDirectory> Root; > + std::string WorkingDirectory; > > public: > InMemoryFileSystem(); > @@ -260,6 +282,13 @@ public: > llvm::ErrorOr<std::unique_ptr<File>> > openFileForRead(const Twine &Path) override; > directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) > override; > + llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override { > + return WorkingDirectory; > + } > + std::error_code setCurrentWorkingDirectory(const Twine &Path) override { > + WorkingDirectory = Path.str(); > + return std::error_code(); > + } > }; > > /// \brief Get a globally unique ID for a virtual file or directory. > > Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=249316&r1=249315&r2=249316&view=diff > > ============================================================================== > --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original) > +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Mon Oct 5 08:55:20 2015 > @@ -89,6 +89,14 @@ FileSystem::getBufferForFile(const llvm: > return (*F)->getBuffer(Name, FileSize, RequiresNullTerminator, > IsVolatile); > } > > +std::error_code FileSystem::makeAbsolute(SmallVectorImpl<char> &Path) > const { > + auto WorkingDir = getCurrentWorkingDirectory(); > + if (!WorkingDir) > + return WorkingDir.getError(); > + > + return llvm::sys::fs::make_absolute(WorkingDir.get(), Path); > +} > Ben, This is causing: tools/clang/lib/Basic/VirtualFileSystem.cpp:105:57: error: too many arguments to function call, expected single argument 'path', have 2 arguments return llvm::sys::fs::make_absolute(WorkingDir.get(), Path); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^~~~ [...]/llvm/llvm/include/llvm/Support/FileSystem.h:280:1: note: 'make_absolute' declared here std::error_code make_absolute(SmallVectorImpl<char> &path); ^ 1 error generated. Not sure which of the two parameters needs to be taken out. Thanks. Diego.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits