[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-05 Thread Balázs Benics via llvm-branch-commits

https://github.com/steakhal updated 
https://github.com/llvm/llvm-project/pull/179517

From 0c75c1554e8aed06f0a3ea269138b8c8be6af023 Mon Sep 17 00:00:00 2001
From: Balazs Benics 
Date: Wed, 4 Feb 2026 13:36:01 +0100
Subject: [PATCH 1/8] Satisfy clang-format

---
 .../Analysis/Scalable/Registries/MockSerializationFormat.cpp| 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git 
a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp 
b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
index d9f5eebce1f0e..69afa0fc439f0 100644
--- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
+++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
@@ -30,7 +30,7 @@ TUSummary 
MockSerializationFormat::readTUSummary(llvm::StringRef Path) {
 
 void MockSerializationFormat::writeTUSummary(const TUSummary &Summary,
  llvm::StringRef OutputDir) {
-  // TODO: Implement this.
+  // TODO: Implement this.
 }
 
 static SerializationFormatRegistry::Add

From 3fcdac9224dcd4b736e5d5769e6235ea6714f424 Mon Sep 17 00:00:00 2001
From: Balazs Benics 
Date: Tue, 3 Feb 2026 18:55:24 +0100
Subject: [PATCH 2/8] [clang][ssaf] Add FormatInfo sub-registry and tests [3/3]

Add `FormatInfoEntry` template to support per-analysis-type serialization
within a `SerializationFormat`.
This allows to implement different formats for the different analyses in
a decoupled way.

For testing, this patch also implements the MockSerializationFormat
demonstrating the FormatInfo sub-registry pattern.

Assisted-by: claude
---
 .../Serialization/SerializationFormat.h   |  17 ++-
 .../Serialization/SerializationFormat.cpp |   9 ++
 .../Analysis/Scalable/CMakeLists.txt  |   1 +
 .../Scalable/Registries/FancyAnalysisData.cpp |  87 ++
 .../Registries/MockSerializationFormat.cpp| 107 +-
 .../Registries/MockSerializationFormat.h  |  15 +++
 .../SerializationFormatRegistryTest.cpp   |  64 +++
 7 files changed, 295 insertions(+), 5 deletions(-)
 create mode 100644 
clang/unittests/Analysis/Scalable/Registries/FancyAnalysisData.cpp

diff --git 
a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h 
b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
index 36efc6c273bd5..d648ba60fc160 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -15,6 +15,7 @@
 #define CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
 
 #include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "clang/Analysis/Scalable/Model/SummaryName.h"
 #include "clang/Analysis/Scalable/TUSummary/TUSummary.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringRef.h"
@@ -26,8 +27,7 @@ namespace clang::ssaf {
 class EntityId;
 class EntityIdTable;
 class EntityName;
-class TUSummary;
-class TUSummaryData;
+class EntitySummary;
 
 /// Abstract base class for serialization formats.
 class SerializationFormat {
@@ -48,6 +48,8 @@ class SerializationFormat {
   static const llvm::SmallString<16> &getEntityNameSuffix(const EntityName 
&EN);
   static const NestedBuildNamespace &
   getEntityNameNamespace(const EntityName &EN);
+  static decltype(TUSummary::Data) &getData(TUSummary &S);
+  static const decltype(TUSummary::Data) &getData(const TUSummary &S);
 
 public:
   explicit SerializationFormat(
@@ -63,6 +65,17 @@ class SerializationFormat {
   llvm::IntrusiveRefCntPtr FS;
 };
 
+template  struct FormatInfoEntry {
+  FormatInfoEntry(SummaryName ForSummary, SerializerFn Serialize,
+  DeserializerFn Deserialize)
+  : ForSummary(ForSummary), Serialize(Serialize), Deserialize(Deserialize) 
{
+  }
+
+  SummaryName ForSummary;
+  SerializerFn Serialize;
+  DeserializerFn Deserialize;
+};
+
 } // namespace clang::ssaf
 
 #endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp 
b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index 6bb05747058fa..224ad0c40cc2d 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -63,3 +63,12 @@ const NestedBuildNamespace &
 SerializationFormat::getEntityNameNamespace(const EntityName &EN) {
   return EN.Namespace;
 }
+
+const decltype(TUSummary::Data) &
+SerializationFormat::getData(const TUSummary &S) {
+  return S.Data;
+}
+
+decltype(TUSummary::Data) &SerializationFormat::getData(TUSummary &S) {
+  return S.Data;
+}
diff --git a/clang/unittests/Analysis/Scalable/CMakeLists.txt 
b/clang/unittests/Analysis/Scalable/CMakeLists.txt
index 33e1dcc87deba..601845b4ab77a 100644
--- a/clang/unittests/Analysis/Scalable/CMakeList

[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-05 Thread Balázs Benics via llvm-branch-commits

https://github.com/steakhal updated 
https://github.com/llvm/llvm-project/pull/179517

From 0c75c1554e8aed06f0a3ea269138b8c8be6af023 Mon Sep 17 00:00:00 2001
From: Balazs Benics 
Date: Wed, 4 Feb 2026 13:36:01 +0100
Subject: [PATCH 1/4] Satisfy clang-format

---
 .../Analysis/Scalable/Registries/MockSerializationFormat.cpp| 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git 
a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp 
b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
index d9f5eebce1f0e..69afa0fc439f0 100644
--- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
+++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
@@ -30,7 +30,7 @@ TUSummary 
MockSerializationFormat::readTUSummary(llvm::StringRef Path) {
 
 void MockSerializationFormat::writeTUSummary(const TUSummary &Summary,
  llvm::StringRef OutputDir) {
-  // TODO: Implement this.
+  // TODO: Implement this.
 }
 
 static SerializationFormatRegistry::Add

From 3fcdac9224dcd4b736e5d5769e6235ea6714f424 Mon Sep 17 00:00:00 2001
From: Balazs Benics 
Date: Tue, 3 Feb 2026 18:55:24 +0100
Subject: [PATCH 2/4] [clang][ssaf] Add FormatInfo sub-registry and tests [3/3]

Add `FormatInfoEntry` template to support per-analysis-type serialization
within a `SerializationFormat`.
This allows to implement different formats for the different analyses in
a decoupled way.

For testing, this patch also implements the MockSerializationFormat
demonstrating the FormatInfo sub-registry pattern.

Assisted-by: claude
---
 .../Serialization/SerializationFormat.h   |  17 ++-
 .../Serialization/SerializationFormat.cpp |   9 ++
 .../Analysis/Scalable/CMakeLists.txt  |   1 +
 .../Scalable/Registries/FancyAnalysisData.cpp |  87 ++
 .../Registries/MockSerializationFormat.cpp| 107 +-
 .../Registries/MockSerializationFormat.h  |  15 +++
 .../SerializationFormatRegistryTest.cpp   |  64 +++
 7 files changed, 295 insertions(+), 5 deletions(-)
 create mode 100644 
clang/unittests/Analysis/Scalable/Registries/FancyAnalysisData.cpp

diff --git 
a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h 
b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
index 36efc6c273bd5..d648ba60fc160 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -15,6 +15,7 @@
 #define CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
 
 #include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "clang/Analysis/Scalable/Model/SummaryName.h"
 #include "clang/Analysis/Scalable/TUSummary/TUSummary.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringRef.h"
@@ -26,8 +27,7 @@ namespace clang::ssaf {
 class EntityId;
 class EntityIdTable;
 class EntityName;
-class TUSummary;
-class TUSummaryData;
+class EntitySummary;
 
 /// Abstract base class for serialization formats.
 class SerializationFormat {
@@ -48,6 +48,8 @@ class SerializationFormat {
   static const llvm::SmallString<16> &getEntityNameSuffix(const EntityName 
&EN);
   static const NestedBuildNamespace &
   getEntityNameNamespace(const EntityName &EN);
+  static decltype(TUSummary::Data) &getData(TUSummary &S);
+  static const decltype(TUSummary::Data) &getData(const TUSummary &S);
 
 public:
   explicit SerializationFormat(
@@ -63,6 +65,17 @@ class SerializationFormat {
   llvm::IntrusiveRefCntPtr FS;
 };
 
+template  struct FormatInfoEntry {
+  FormatInfoEntry(SummaryName ForSummary, SerializerFn Serialize,
+  DeserializerFn Deserialize)
+  : ForSummary(ForSummary), Serialize(Serialize), Deserialize(Deserialize) 
{
+  }
+
+  SummaryName ForSummary;
+  SerializerFn Serialize;
+  DeserializerFn Deserialize;
+};
+
 } // namespace clang::ssaf
 
 #endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp 
b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index 6bb05747058fa..224ad0c40cc2d 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -63,3 +63,12 @@ const NestedBuildNamespace &
 SerializationFormat::getEntityNameNamespace(const EntityName &EN) {
   return EN.Namespace;
 }
+
+const decltype(TUSummary::Data) &
+SerializationFormat::getData(const TUSummary &S) {
+  return S.Data;
+}
+
+decltype(TUSummary::Data) &SerializationFormat::getData(TUSummary &S) {
+  return S.Data;
+}
diff --git a/clang/unittests/Analysis/Scalable/CMakeLists.txt 
b/clang/unittests/Analysis/Scalable/CMakeLists.txt
index 33e1dcc87deba..601845b4ab77a 100644
--- a/clang/unittests/Analysis/Scalable/CMakeList

[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-04 Thread Aviral Goel via llvm-branch-commits


@@ -26,4 +57,37 @@ TEST(SerializationFormatRegistryTest, 
EnumeratingRegistryEntries) {
   EXPECT_EQ(Formats.begin()->getName(), "MockSerializationFormat");
 }
 
+TEST(SerializationFormatRegistryTest, Roundtrip) {
+  StringLiteral FancyAnalysisFileData = "FancyAnalysisData{\n"
+"  SomeInternalList: zed, vayne, lux\n"
+"}\n";
+
+  auto Inputs = makeIntrusiveRefCnt();
+  Inputs->addFile("input/analyses.txt", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy("FancyAnalysis\n"));
+  Inputs->addFile("input/FancyAnalysis.special", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy(FancyAnalysisFileData));
+
+  std::unique_ptr Format =
+  makeFormat(Inputs, "MockSerializationFormat");
+  ASSERT_TRUE(Format);
+
+  TUSummary LoadedSummary = Format->readTUSummary("input");
+
+  // Create a temporary output directory
+  SmallString<128> OutputDir;
+  std::error_code EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir);

aviralg wrote:

My initial thought was:

1. Use `sys::fs::createUniqueDirectory` to create a directory and populate it 
with the two input files.
2. Use readTUSummary to read from this input directory.
3. Use `sys::fs::createUniqueDirectory` to create an output directory 
4. Use writeTUSummary to populate this output directory.
5. Check that the file contents in the output directory match the data used to 
populate the corresponding input files.

However, I realized later that you want to use InMemoryFileSystem here by 
design since we are introducing support for virtualizing input-reading in the 
other PR. So what you have is reasonable.

https://github.com/llvm/llvm-project/pull/179517
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-04 Thread Aviral Goel via llvm-branch-commits


@@ -26,4 +57,37 @@ TEST(SerializationFormatRegistryTest, 
EnumeratingRegistryEntries) {
   EXPECT_EQ(Formats.begin()->getName(), "MockSerializationFormat");
 }
 
+TEST(SerializationFormatRegistryTest, Roundtrip) {
+  StringLiteral FancyAnalysisFileData = "FancyAnalysisData{\n"
+"  SomeInternalList: zed, vayne, lux\n"
+"}\n";
+
+  auto Inputs = makeIntrusiveRefCnt();
+  Inputs->addFile("input/analyses.txt", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy("FancyAnalysis\n"));
+  Inputs->addFile("input/FancyAnalysis.special", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy(FancyAnalysisFileData));
+
+  std::unique_ptr Format =
+  makeFormat(Inputs, "MockSerializationFormat");
+  ASSERT_TRUE(Format);
+
+  TUSummary LoadedSummary = Format->readTUSummary("input");
+
+  // Create a temporary output directory
+  SmallString<128> OutputDir;
+  std::error_code EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir);

aviralg wrote:

I realized we are using InMemoryFileSystem here because this tests both the 
feature introduced in this PR and 
https://github.com/llvm/llvm-project/pull/179516. I guess it can stay.

https://github.com/llvm/llvm-project/pull/179517
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-04 Thread Aviral Goel via llvm-branch-commits

https://github.com/aviralg edited 
https://github.com/llvm/llvm-project/pull/179517
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] [clang][ssaf] Add FormatInfo sub-registry and tests [2/2] (PR #179517)

2026-02-04 Thread Aviral Goel via llvm-branch-commits


@@ -26,4 +57,37 @@ TEST(SerializationFormatRegistryTest, 
EnumeratingRegistryEntries) {
   EXPECT_EQ(Formats.begin()->getName(), "MockSerializationFormat");
 }
 
+TEST(SerializationFormatRegistryTest, Roundtrip) {
+  StringLiteral FancyAnalysisFileData = "FancyAnalysisData{\n"
+"  SomeInternalList: zed, vayne, lux\n"
+"}\n";
+
+  auto Inputs = makeIntrusiveRefCnt();
+  Inputs->addFile("input/analyses.txt", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy("FancyAnalysis\n"));
+  Inputs->addFile("input/FancyAnalysis.special", /*ModificationTime=*/{},
+  MemoryBuffer::getMemBufferCopy(FancyAnalysisFileData));
+
+  std::unique_ptr Format =
+  makeFormat(Inputs, "MockSerializationFormat");
+  ASSERT_TRUE(Format);
+
+  TUSummary LoadedSummary = Format->readTUSummary("input");
+
+  // Create a temporary output directory
+  SmallString<128> OutputDir;
+  std::error_code EC = sys::fs::createUniqueDirectory("ssaf-test", OutputDir);

aviralg wrote:

It will be simpler to use the filesystem for input files as well. Using the 
InMemoryFileSystem in the test case makes it more mysterious and involved than 
it should be. We can probably present this as an example in the documentation.

https://github.com/llvm/llvm-project/pull/179517
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits