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 <[email protected]> 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 <[email protected]> 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) {} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
