[PATCH] D97850: Fix PCM read from ModuleCache for ext4 filesystem

Raphael Isemann via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 4 05:04:58 PST 2021


teemperor added a comment.

If I understand this correctly, then the inode caching logic in FileManager isn't just breaking PCMs but all file operations:

  TEST_F(FileManagerTest, InodeReuse) {
    {
      std::ofstream myfile;
      myfile.open("a.cpp");
      myfile << "content\n";
    }
    llvm::ErrorOr<const FileEntry*> fe1 = manager.getFile("a.cpp");
    EXPECT_TRUE(fe1);
    const FileEntry *f1 = *fe1;
    remove("a.cpp");
    {
      std::ofstream myfile;
      myfile.open("b.cpp");
      myfile << "different content\n";
    }
    llvm::ErrorOr<const FileEntry*> fe2 = manager.getFile("b.cpp");
    EXPECT_TRUE(fe2);
    const FileEntry *f2 = *fe2;
    EXPECT_NE(f2->getSize(), f1->getSize());
    EXPECT_NE(f2->getUniqueID().getFile(), f1->getUniqueID().getFile());
  }

This fails consistently for me when running in an empty ext4 directory with:

  Expected: (f2->getSize()) != (f1->getSize()), actual: 8 vs 8
  Expected: (f2->getUniqueID().getFile()) != (f1->getUniqueID().getFile()), actual: 57855544 vs 57855544

I guess this wasn't considered a valid use case for the normal `#include` logic within Clang (which I believe is the primary beneficiary of this cache and doesn't really care about a changing file system). But with PCMs and Clang REPLs this is probably causing some strange bugs.

Anyway, I don't think I know the FileManager code well enough to come up with a real fix (beside just removing the inode cache).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97850/new/

https://reviews.llvm.org/D97850



More information about the cfe-commits mailing list