r250036 - [VFS] Don't try to be heroic with '.' in paths.

Manuel Klimek via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 12 07:13:22 PDT 2015


I believe we need a more principled approach here :)

1. The first thing we need is to actually produce nice errors when we hit
an addFile() with the same path (normalized or non-normalized)
I'd propose the following approach: we compare the buffers; if the buffer
contents are equal, we declare success; otherwise we return a nice
descriptive error ("trying to add the same file with different content").

2. I think we'll want 2 different modes in InMemoryFileSystem: Normalize
should be either on or off; if on, we should normalize everything, and
return an error if we hop up over /. if off, we should not normalize
anything.

On Mon, Oct 12, 2015 at 3:32 PM Benjamin Kramer via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: d0k
> Date: Mon Oct 12 08:30:38 2015
> New Revision: 250036
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250036&view=rev
> Log:
> [VFS] Don't try to be heroic with '.' in paths.
>
> Actually the only special path we have to handle is ./foo, the rest is
> tricky to get right so do the same thing as the existing YAML vfs here.
>
> Modified:
>     cfe/trunk/lib/Basic/VirtualFileSystem.cpp
>     cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp
>
> Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=250036&r1=250035&r2=250036&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original)
> +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Mon Oct 12 08:30:38 2015
> @@ -10,7 +10,6 @@
>
>  //===----------------------------------------------------------------------===//
>
>  #include "clang/Basic/VirtualFileSystem.h"
> -#include "clang/Basic/FileManager.h"
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/StringExtras.h"
> @@ -497,12 +496,14 @@ void InMemoryFileSystem::addFile(const T
>    assert(!EC);
>    (void)EC;
>
> -  FileManager::removeDotPaths(Path, /*RemoveDotDot=*/false);
> -  if (Path.empty())
> -    return;
> -
>    detail::InMemoryDirectory *Dir = Root.get();
>    auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
> +  if (*I == ".")
> +    ++I;
> +
> +  if (I == E)
> +    return;
> +
>    while (true) {
>      StringRef Name = *I;
>      detail::InMemoryNode *Node = Dir->getChild(Name);
> @@ -556,11 +557,13 @@ lookupInMemoryNode(const InMemoryFileSys
>    assert(!EC);
>    (void)EC;
>
> -  FileManager::removeDotPaths(Path, /*RemoveDotDot=*/false);
> -  if (Path.empty())
> +  auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
> +  if (*I == ".")
> +    ++I;
> +
> +  if (I == E)
>      return Dir;
>
> -  auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
>    while (true) {
>      detail::InMemoryNode *Node = Dir->getChild(*I);
>      ++I;
>
> Modified: cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp?rev=250036&r1=250035&r2=250036&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp (original)
> +++ cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp Mon Oct 12
> 08:30:38 2015
> @@ -551,8 +551,6 @@ TEST_F(InMemoryFileSystemTest, OverlayFi
>    FS.addFile("/a", 0, MemoryBuffer::getMemBuffer("a"));
>    auto Stat = FS.status("/");
>    ASSERT_FALSE(Stat.getError()) << Stat.getError() << FS.toString();
> -  Stat = FS.status("/.");
> -  ASSERT_FALSE(Stat.getError()) << Stat.getError() << FS.toString();
>    Stat = FS.status("/a");
>    ASSERT_FALSE(Stat.getError()) << Stat.getError() << "\n" <<
> FS.toString();
>    ASSERT_EQ("/a", Stat->getName());
> @@ -568,18 +566,18 @@ TEST_F(InMemoryFileSystemTest, OverlayFi
>
>  TEST_F(InMemoryFileSystemTest, OpenFileForRead) {
>    FS.addFile("/a", 0, MemoryBuffer::getMemBuffer("a"));
> -  FS.addFile("././c", 0, MemoryBuffer::getMemBuffer("c"));
> +  FS.addFile("./c", 0, MemoryBuffer::getMemBuffer("c"));
>    auto File = FS.openFileForRead("/a");
>    ASSERT_EQ("a", (*(*File)->getBuffer("ignored"))->getBuffer());
>    File = FS.openFileForRead("/a"); // Open again.
>    ASSERT_EQ("a", (*(*File)->getBuffer("ignored"))->getBuffer());
> -  File = FS.openFileForRead("/././a"); // Open again.
> +  File = FS.openFileForRead("./a"); // Open again.
>    ASSERT_EQ("a", (*(*File)->getBuffer("ignored"))->getBuffer());
>    File = FS.openFileForRead("/");
>    ASSERT_EQ(File.getError(), errc::invalid_argument) << FS.toString();
>    File = FS.openFileForRead("/b");
>    ASSERT_EQ(File.getError(), errc::no_such_file_or_directory) <<
> FS.toString();
> -  File = FS.openFileForRead("./c");
> +  File = FS.openFileForRead("c");
>    ASSERT_EQ("c", (*(*File)->getBuffer("ignored"))->getBuffer());
>  }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151012/998bb2c6/attachment.html>


More information about the cfe-commits mailing list