[clang] [clang][ssaf] Remove VFS support from SerializationFormat (PR #180891)
Aviral Goel via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 10 22:03:57 PST 2026
https://github.com/aviralg created https://github.com/llvm/llvm-project/pull/180891
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.
>From c88f2d46365c6e63a70e65a5b9952a2211281e8b Mon Sep 17 00:00:00 2001
From: Aviral Goel <agoel26 at apple.com>
Date: Tue, 10 Feb 2026 21:52:28 -0800
Subject: [PATCH] Remove VFS support from SerializationFormat
---
.../Serialization/SerializationFormat.h | 6 +--
.../SerializationFormatRegistry.h | 11 ++----
.../Serialization/SerializationFormat.cpp | 4 --
.../SerializationFormatRegistry.cpp | 8 ++--
.../Registries/MockSerializationFormat.cpp | 11 +++---
.../Registries/MockSerializationFormat.h | 3 +-
.../SerializationFormatRegistryTest.cpp | 37 ++++++++++++++-----
7 files changed, 42 insertions(+), 38 deletions(-)
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); });
More information about the cfe-commits
mailing list