[clang] [clang][ssaf] Remove VFS support from SerializationFormat (PR #180891)

via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 10 22:04:25 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis

@llvm/pr-subscribers-clang

Author: Aviral Goel (aviralg)

<details>
<summary>Changes</summary>

This change removes support for `VFS` in `SerializationFormat` that was introduced in https://github.com/llvm/llvm-project/pull/179516/. `VFS` only provides a virtual input backend and its matched pair, `VirtualOutputBackend`, does not provide support for an `InMemoryOutputBackend`. There was an attempt from our end to implement this support in https://github.com/llvm/llvm-project/pull/179515 but it did not succeed. Supporting virtual reads but not virtual writes makes the SerializationFormat APIs asymmetric. So we have decided to remove `VFS` support altogether. 

---
Full diff: https://github.com/llvm/llvm-project/pull/180891.diff


7 Files Affected:

- (modified) clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h (+1-5) 
- (modified) clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h (+3-8) 
- (modified) clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp (-4) 
- (modified) clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp (+3-5) 
- (modified) clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp (+6-5) 
- (modified) clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h (+1-2) 
- (modified) clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp (+28-9) 


``````````diff
diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
index c7438e2859da0..5a787d86adbcd 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -54,8 +54,7 @@ class SerializationFormat
   static const decltype(TUSummary::Data) &getData(const TUSummary &S);
 
 public:
-  explicit SerializationFormat(
-      llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS);
+  explicit SerializationFormat() = default;
   virtual ~SerializationFormat() = default;
 
   virtual TUSummary readTUSummary(llvm::StringRef Path) = 0;
@@ -64,9 +63,6 @@ class SerializationFormat
                               llvm::StringRef OutputDir) = 0;
 
   static char ID; // For RTTIExtends.
-
-protected:
-  llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
 };
 
 template <class SerializerFn, class DeserializerFn> struct FormatInfoEntry {
diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h
index 40281d549b402..d7e77b9b18f77 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h
@@ -51,21 +51,16 @@ bool isFormatRegistered(llvm::StringRef FormatName);
 /// This might return null if the construction of the desired
 /// SerializationFormat failed.
 /// It's a fatal error if there is no format registered with the name.
-std::unique_ptr<SerializationFormat>
-makeFormat(llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
-           llvm::StringRef FormatName);
+std::unique_ptr<SerializationFormat> makeFormat(llvm::StringRef FormatName);
 
 // Registry for adding new SerializationFormat implementations.
-using SerializationFormatRegistry =
-    llvm::Registry<SerializationFormat,
-                   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>;
+using SerializationFormatRegistry = llvm::Registry<SerializationFormat>;
 
 } // namespace clang::ssaf
 
 namespace llvm {
 extern template class CLANG_TEMPLATE_ABI
-    Registry<clang::ssaf::SerializationFormat,
-             llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>;
+    Registry<clang::ssaf::SerializationFormat>;
 } // namespace llvm
 
 #endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_REGISTRY_H
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index 1d62ea837616f..ca733c1b07051 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -14,10 +14,6 @@
 
 using namespace clang::ssaf;
 
-SerializationFormat::SerializationFormat(
-    llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
-    : FS(FS) {}
-
 EntityIdTable &SerializationFormat::getIdTableForDeserialization(TUSummary &S) {
   return S.IdTable;
 }
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp
index f31a154866238..ed216b7691933 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp
@@ -15,8 +15,7 @@ using namespace ssaf;
 // FIXME: LLVM_INSTANTIATE_REGISTRY can't be used here because it drops extra
 // type parameters.
 template class CLANG_EXPORT_TEMPLATE
-    llvm::Registry<clang::ssaf::SerializationFormat,
-                   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>;
+    llvm::Registry<clang::ssaf::SerializationFormat>;
 
 bool ssaf::isFormatRegistered(llvm::StringRef FormatName) {
   for (const auto &Entry : SerializationFormatRegistry::entries())
@@ -26,11 +25,10 @@ bool ssaf::isFormatRegistered(llvm::StringRef FormatName) {
 }
 
 std::unique_ptr<SerializationFormat>
-ssaf::makeFormat(llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
-                 llvm::StringRef FormatName) {
+ssaf::makeFormat(llvm::StringRef FormatName) {
   for (const auto &Entry : SerializationFormatRegistry::entries())
     if (Entry.getName() == FormatName)
-      return Entry.instantiate(std::move(FS));
+      return Entry.instantiate();
   assert(false && "Unknown SerializationFormat name");
   return nullptr;
 }
diff --git a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
index 03328e8bd9742..ec37f0e579518 100644
--- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
+++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
@@ -17,6 +17,7 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cassert>
 #include <functional>
@@ -28,9 +29,8 @@ using namespace ssaf;
 
 char MockSerializationFormat::ID = 0;
 
-MockSerializationFormat::MockSerializationFormat(
-    llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
-    : llvm::RTTIExtends<MockSerializationFormat, SerializationFormat>(FS) {
+MockSerializationFormat::MockSerializationFormat()
+    : llvm::RTTIExtends<MockSerializationFormat, SerializationFormat>() {
   for (const auto &FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) {
     std::unique_ptr<FormatInfo> Info = FormatInfoEntry.instantiate();
     bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second;
@@ -46,7 +46,7 @@ TUSummary MockSerializationFormat::readTUSummary(llvm::StringRef Path) {
   BuildNamespace NS(BuildNamespaceKind::CompilationUnit, "Mock.cpp");
   TUSummary Summary(NS);
 
-  auto ManifestFile = FS->getBufferForFile(Path + "/analyses.txt");
+  auto ManifestFile = llvm::MemoryBuffer::getFile(Path + "/analyses.txt");
   assert(ManifestFile); // TODO Handle error.
   llvm::StringRef ManifestFileContent = (*ManifestFile)->getBuffer();
 
@@ -56,7 +56,8 @@ TUSummary MockSerializationFormat::readTUSummary(llvm::StringRef Path) {
 
   for (llvm::StringRef Analysis : Analyses) {
     SummaryName Name(Analysis.str());
-    auto InputFile = FS->getBufferForFile(Path + "/" + Name.str() + ".special");
+    auto InputFile =
+        llvm::MemoryBuffer::getFile(Path + "/" + Name.str() + ".special");
     assert(InputFile);
     auto InfoIt = FormatInfos.find(Name);
     if (InfoIt == FormatInfos.end()) {
diff --git a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h
index 25fb2f3b20551..c46d4e7288704 100644
--- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h
+++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.h
@@ -20,8 +20,7 @@ namespace clang::ssaf {
 class MockSerializationFormat final
     : public llvm::RTTIExtends<MockSerializationFormat, SerializationFormat> {
 public:
-  explicit MockSerializationFormat(
-      llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS);
+  explicit MockSerializationFormat();
 
   TUSummary readTUSummary(llvm::StringRef Path) override;
 
diff --git a/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp b/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp
index 484c38309e3d8..7f17cdda5a082 100644
--- a/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp
+++ b/clang/unittests/Analysis/Scalable/Registries/SerializationFormatRegistryTest.cpp
@@ -13,7 +13,7 @@
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
-#include "llvm/Support/VirtualFileSystem.h"
+#include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 #include <memory>
 
@@ -58,21 +58,40 @@ TEST(SerializationFormatRegistryTest, EnumeratingRegistryEntries) {
 }
 
 TEST(SerializationFormatRegistryTest, Roundtrip) {
-  auto Inputs = makeIntrusiveRefCnt<vfs::InMemoryFileSystem>();
-  Inputs->addFile("input/analyses.txt", /*ModificationTime=*/{},
-                  MemoryBuffer::getMemBufferCopy("FancyAnalysis\n"));
-  Inputs->addFile("input/FancyAnalysis.special", /*ModificationTime=*/{},
-                  MemoryBuffer::getMemBufferCopy("Some FancyAnalysisData..."));
+  // Create temporary input directory
+  SmallString<128> InputDir;
+  std::error_code EC = sys::fs::createUniqueDirectory("ssaf-input", InputDir);
+  ASSERT_FALSE(EC) << "Failed to create input directory: " << EC.message();
+  llvm::scope_exit CleanupInputOnExit(
+      [&] { sys::fs::remove_directories(InputDir); });
+
+  // Create input files
+  SmallString<128> AnalysesFile = InputDir;
+  sys::path::append(AnalysesFile, "analyses.txt");
+  {
+    raw_fd_ostream OS(AnalysesFile, EC);
+    ASSERT_FALSE(EC) << "Failed to create analyses.txt: " << EC.message();
+    OS << "FancyAnalysis\n";
+  }
+
+  SmallString<128> FancyAnalysisFile = InputDir;
+  sys::path::append(FancyAnalysisFile, "FancyAnalysis.special");
+  {
+    raw_fd_ostream OS(FancyAnalysisFile, EC);
+    ASSERT_FALSE(EC) << "Failed to create FancyAnalysis.special: "
+                     << EC.message();
+    OS << "Some FancyAnalysisData...";
+  }
 
   std::unique_ptr<SerializationFormat> Format =
-      makeFormat(Inputs, "MockSerializationFormat");
+      makeFormat("MockSerializationFormat");
   ASSERT_TRUE(Format);
 
-  TUSummary LoadedSummary = Format->readTUSummary("input");
+  TUSummary LoadedSummary = Format->readTUSummary(InputDir);
 
   // Create a temporary output directory
   SmallString<128> OutputDir;
-  std::error_code EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir);
+  EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir);
   ASSERT_FALSE(EC) << "Failed to create temporary directory: " << EC.message();
   llvm::scope_exit CleanupOnExit(
       [&] { sys::fs::remove_directories(OutputDir); });

``````````

</details>


https://github.com/llvm/llvm-project/pull/180891


More information about the cfe-commits mailing list