r249316 - [VFS] Add working directories to every virtual file system.

Diego Novillo via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 5 08:24:17 PDT 2015


Never mind.  My llvm and clang trees were out of sync.


Diego.

On Mon, Oct 5, 2015 at 11:15 AM, Diego Novillo <dnovillo at google.com> wrote:

>
>
> On Mon, Oct 5, 2015 at 9:55 AM, Benjamin Kramer via cfe-commits <
> cfe-commits at 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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151005/cc064ef7/attachment-0001.html>


More information about the cfe-commits mailing list