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

via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 11 03:22:16 PST 2026


Author: Balázs Benics
Date: 2026-02-11T11:22:11Z
New Revision: 7e34aaeb91cfd537f8510c94c51df31ecd310ba5

URL: https://github.com/llvm/llvm-project/commit/7e34aaeb91cfd537f8510c94c51df31ecd310ba5
DIFF: https://github.com/llvm/llvm-project/commit/7e34aaeb91cfd537f8510c94c51df31ecd310ba5.diff

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

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

Assisted-By: claude

Added: 
    clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def

Modified: 
    clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
    clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
    clang/unittests/Analysis/Scalable/Registries/MockSerializationFormat.cpp

Removed: 
    


################################################################################
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..866fe8bfdcee0 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,6 +44,13 @@ 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;
 };
 

diff  --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
index 1d62ea837616f..75ec263a1051f 100644
--- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -7,70 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #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;
 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.


        


More information about the cfe-commits mailing list