[clang] [clang][ssaf][NFC] Refactor SerializationFormat to use macro-based field accessors (PR #180842)

Balázs Benics via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 11 02:53:30 PST 2026


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

>From 2232f02903690b00a821d378fe6093f93c9644a2 Mon Sep 17 00:00:00 2001
From: Balazs Benics <benicsbalazs at gmail.com>
Date: Tue, 10 Feb 2026 15:13:51 +0100
Subject: [PATCH 1/2] [clang][ssaf][NFC] Refactor SerializationFormat to use
 macro-based field accessors

This reduces code duplication and makes it easier to add new field accessors.

Assisted-By: claude
---
 .../Scalable/Model/PrivateFieldNames.def      | 30 +++++++++
 .../Serialization/SerializationFormat.h       | 32 +++-------
 .../Serialization/SerializationFormat.cpp     | 64 +------------------
 .../Registries/MockSerializationFormat.cpp    |  2 +-
 4 files changed, 44 insertions(+), 84 deletions(-)
 create mode 100644 clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def

diff --git a/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def b/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
new file mode 100644
index 0000000000000..59064659996b4
--- /dev/null
+++ b/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
@@ -0,0 +1,30 @@
+//===-- PrivateFieldNames.def -----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines a list of non-static data members of the SSAF objects.
+//  These are used for granting access for:
+//   - SerializationFormat
+//   - TextFixture
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef FIELD
+#define FIELD(CLASS, FIELD_NAME)
+#endif
+
+FIELD(BuildNamespace, Kind)
+FIELD(BuildNamespace, Name)
+FIELD(EntityName, Namespace)
+FIELD(EntityName, Suffix)
+FIELD(EntityName, USR)
+FIELD(NestedBuildNamespace, Namespaces)
+FIELD(TUSummary, Data)
+FIELD(TUSummary, IdTable)
+FIELD(TUSummary, TUNamespace)
+
+#undef FIELD
diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
index c7438e2859da0..2c0ca57f6db46 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -17,11 +17,9 @@
 #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"
 #include "llvm/Support/ExtensibleRTTI.h"
 #include "llvm/Support/VirtualFileSystem.h"
-#include <vector>
 
 namespace clang::ssaf {
 
@@ -33,26 +31,6 @@ class EntitySummary;
 /// Abstract base class for serialization formats.
 class SerializationFormat
     : public llvm::RTTIExtends<SerializationFormat, llvm::RTTIRoot> {
-protected:
-  // Helpers providing access to implementation details of basic data structures
-  // for efficient serialization/deserialization.
-  static EntityIdTable &getIdTableForDeserialization(TUSummary &S);
-  static BuildNamespace &getTUNamespaceForDeserialization(TUSummary &S);
-  static const EntityIdTable &getIdTable(const TUSummary &S);
-  static const BuildNamespace &getTUNamespace(const TUSummary &S);
-
-  static BuildNamespaceKind getBuildNamespaceKind(const BuildNamespace &BN);
-  static llvm::StringRef getBuildNamespaceName(const BuildNamespace &BN);
-  static const std::vector<BuildNamespace> &
-  getNestedBuildNamespaces(const NestedBuildNamespace &NBN);
-
-  static llvm::StringRef getEntityNameUSR(const EntityName &EN);
-  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(
       llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS);
@@ -66,7 +44,17 @@ class SerializationFormat
   static char ID; // For RTTIExtends.
 
 protected:
+  // Helpers providing access to implementation details of basic data structures
+  // for efficient serialization/deserialization.
+#define FIELD(CLASS, FIELD_NAME)                                               \
+  static const auto &get##FIELD_NAME(const CLASS &X) { return X.FIELD_NAME; }  \
+  static auto &get##FIELD_NAME(CLASS &X) { return X.FIELD_NAME; }
+#include "clang/Analysis/Scalable/Model/PrivateFieldNames.def"
+
   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
+
+private:
+  void anchor() override;
 };
 
 template <class SerializerFn, class DeserializerFn> struct FormatInfoEntry {
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index 1d62ea837616f..be2740d7a3e4c 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -7,70 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Serialization/SerializationFormat.h"
-#include "clang/Analysis/Scalable/Model/BuildNamespace.h"
-#include "clang/Analysis/Scalable/Model/EntityId.h"
-#include "clang/Analysis/Scalable/Model/EntityName.h"
-#include "clang/Analysis/Scalable/TUSummary/TUSummary.h"
 
 using namespace clang::ssaf;
 
+char SerializationFormat::ID = 0;
+void SerializationFormat::anchor() {}
+
 SerializationFormat::SerializationFormat(
     llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
     : FS(FS) {}
-
-EntityIdTable &SerializationFormat::getIdTableForDeserialization(TUSummary &S) {
-  return S.IdTable;
-}
-
-BuildNamespace &
-SerializationFormat::getTUNamespaceForDeserialization(TUSummary &S) {
-  return S.TUNamespace;
-}
-
-const EntityIdTable &SerializationFormat::getIdTable(const TUSummary &S) {
-  return S.IdTable;
-}
-
-const BuildNamespace &SerializationFormat::getTUNamespace(const TUSummary &S) {
-  return S.TUNamespace;
-}
-
-BuildNamespaceKind
-SerializationFormat::getBuildNamespaceKind(const BuildNamespace &BN) {
-  return BN.Kind;
-}
-
-llvm::StringRef
-SerializationFormat::getBuildNamespaceName(const BuildNamespace &BN) {
-  return BN.Name;
-}
-
-const std::vector<BuildNamespace> &
-SerializationFormat::getNestedBuildNamespaces(const NestedBuildNamespace &NBN) {
-  return NBN.Namespaces;
-}
-
-llvm::StringRef SerializationFormat::getEntityNameUSR(const EntityName &EN) {
-  return EN.USR;
-}
-
-const llvm::SmallString<16> &
-SerializationFormat::getEntityNameSuffix(const EntityName &EN) {
-  return EN.Suffix;
-}
-
-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;
-}
-
-char SerializationFormat::ID = 0;
diff --git a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
index 03328e8bd9742..127e61b26c0cb 100644
--- a/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
+++ b/clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp
@@ -67,7 +67,7 @@ TUSummary MockSerializationFormat::readTUSummary(llvm::StringRef Path) {
     assert(InfoEntry.ForSummary == Name);
 
     SpecialFileRepresentation Repr{(*InputFile)->getBuffer().str()};
-    auto &Table = getIdTableForDeserialization(Summary);
+    auto &Table = getIdTable(Summary);
 
     std::unique_ptr<EntitySummary> Result = InfoEntry.Deserialize(Repr, Table);
     if (!Result) // TODO: Handle error.

>From cfa2ba421399f91c9afd76a851aee1e66f29d50c Mon Sep 17 00:00:00 2001
From: Balazs Benics <benicsbalazs at gmail.com>
Date: Wed, 11 Feb 2026 11:51:21 +0100
Subject: [PATCH 2/2] Drop the anchor method

---
 .../Analysis/Scalable/Serialization/SerializationFormat.h      | 3 ---
 .../Analysis/Scalable/Serialization/SerializationFormat.cpp    | 2 --
 2 files changed, 5 deletions(-)

diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
index 2c0ca57f6db46..866fe8bfdcee0 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -52,9 +52,6 @@ class SerializationFormat
 #include "clang/Analysis/Scalable/Model/PrivateFieldNames.def"
 
   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
-
-private:
-  void anchor() override;
 };
 
 template <class SerializerFn, class DeserializerFn> struct FormatInfoEntry {
diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index be2740d7a3e4c..75ec263a1051f 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -11,8 +11,6 @@
 using namespace clang::ssaf;
 
 char SerializationFormat::ID = 0;
-void SerializationFormat::anchor() {}
-
 SerializationFormat::SerializationFormat(
     llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
     : FS(FS) {}



More information about the cfe-commits mailing list