Author: Aviral Goel
Date: 2026-01-29T09:19:07-08:00
New Revision: 69c0f929e06535effb368fa237eabafa51f50158

URL: 
https://github.com/llvm/llvm-project/commit/69c0f929e06535effb368fa237eabafa51f50158
DIFF: 
https://github.com/llvm/llvm-project/commit/69c0f929e06535effb368fa237eabafa51f50158.diff

LOG: [SSAF] Add SerializationFormat Interface (#177719)

To support multiple serialization formats in SSAF this PR adds a common
serialization format interface. We will separately implement a
serialization format registry similar to
[this](https://github.com/llvm/llvm-project/pull/173290) PR, followed by
a JSON-based serialization format.

Added: 
    clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
    clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp

Modified: 
    clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
    clang/lib/Analysis/Scalable/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git 
a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h 
b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
new file mode 100644
index 0000000000000..a53a315f461df
--- /dev/null
+++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormat.h
@@ -0,0 +1,61 @@
+//===- SerializationFormat.h ------------------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// Abstract SerializationFormat interface for reading and writing
+// TUSummary and LinkUnitResolution data.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
+#define CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H
+
+#include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
+#include <vector>
+
+namespace clang::ssaf {
+
+class EntityId;
+class EntityIdTable;
+class EntityName;
+class TUSummary;
+class TUSummaryData;
+
+/// Abstract base class for serialization formats.
+class SerializationFormat {
+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);
+
+public:
+  virtual ~SerializationFormat() = default;
+
+  virtual TUSummary readTUSummary(llvm::StringRef Path) = 0;
+
+  virtual void writeTUSummary(const TUSummary &Summary,
+                              llvm::StringRef OutputDir) = 0;
+};
+
+} // namespace clang::ssaf
+
+#endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_SERIALIZATION_FORMAT_H

diff  --git a/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h 
b/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
index 928d285fa764e..4af1c70e1a488 100644
--- a/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
+++ b/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
@@ -30,6 +30,8 @@ class TUSummary {
 
 public:
   TUSummary(BuildNamespace TUNamespace) : TUNamespace(std::move(TUNamespace)) 
{}
+
+  friend class SerializationFormat;
 };
 
 } // namespace clang::ssaf

diff  --git a/clang/lib/Analysis/Scalable/CMakeLists.txt 
b/clang/lib/Analysis/Scalable/CMakeLists.txt
index 566edca552388..36365b1fb87e1 100644
--- a/clang/lib/Analysis/Scalable/CMakeLists.txt
+++ b/clang/lib/Analysis/Scalable/CMakeLists.txt
@@ -7,6 +7,7 @@ add_clang_library(clangAnalysisScalable
   Model/BuildNamespace.cpp
   Model/EntityIdTable.cpp
   Model/EntityName.cpp
+  Serialization/SerializationFormat.cpp
   TUSummary/ExtractorRegistry.cpp
 
   LINK_LIBS

diff  --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp 
b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
new file mode 100644
index 0000000000000..ee155d22afa9b
--- /dev/null
+++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormat.cpp
@@ -0,0 +1,61 @@
+//===- SerializationFormat.cpp ----------------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+
+#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;
+
+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;
+}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to