[clang] 41c6aa6 - [clang][ssaf] Add EntityLinkage data structure (#181718)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 16 14:03:19 PST 2026
Author: Aviral Goel
Date: 2026-02-16T22:03:14Z
New Revision: 41c6aa67a343021fd2453443b2eb5964a4029a08
URL: https://github.com/llvm/llvm-project/commit/41c6aa67a343021fd2453443b2eb5964a4029a08
DIFF: https://github.com/llvm/llvm-project/commit/41c6aa67a343021fd2453443b2eb5964a4029a08.diff
LOG: [clang][ssaf] Add EntityLinkage data structure (#181718)
This commit introduces the `EntityLinkage` class to represent the
linkage properties (`None`, `Internal`, `External`) of entities in the
SSAF framework and integrates it into the `TUSummary` class to enable
tracking this information across translation units.
rdar://162571047
Assisted-By: Claude
Added:
clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
Modified:
clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
clang/unittests/Analysis/Scalable/CMakeLists.txt
Removed:
################################################################################
diff --git a/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
new file mode 100644
index 0000000000000..ba5f7d3073a30
--- /dev/null
+++ b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
@@ -0,0 +1,39 @@
+//===- EntityLinkage.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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ANALYSIS_SCALABLE_MODEL_ENTITYLINKAGE_H
+#define LLVM_CLANG_ANALYSIS_SCALABLE_MODEL_ENTITYLINKAGE_H
+
+namespace clang::ssaf {
+
+/// Represents the linkage properties of an entity in the program model.
+///
+/// EntityLinkage captures whether an entity has no linkage, internal linkage,
+/// or external linkage, which determines its visibility and accessibility
+/// across translation units.
+class EntityLinkage {
+ friend class SerializationFormat;
+
+public:
+ enum class LinkageType {
+ None, ///< local variables, function parameters
+ Internal, ///< static functions/variables, anonymous namespace
+ External ///< globally visible across translation units
+ };
+
+ explicit EntityLinkage(LinkageType L) : Linkage(L) {}
+
+ LinkageType getLinkage() const { return Linkage; }
+
+private:
+ LinkageType Linkage;
+};
+
+} // namespace clang::ssaf
+
+#endif // LLVM_CLANG_ANALYSIS_SCALABLE_MODEL_ENTITYLINKAGE_H
diff --git a/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def b/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
index 2d4bf05eff924..f4e952c04ed2f 100644
--- a/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
+++ b/clang/include/clang/Analysis/Scalable/Model/PrivateFieldNames.def
@@ -21,12 +21,14 @@ FIELD(BuildNamespace, Kind)
FIELD(BuildNamespace, Name)
FIELD(EntityId, Index)
FIELD(EntityIdTable, Entities)
+FIELD(EntityLinkage, Linkage)
FIELD(EntityName, Namespace)
FIELD(EntityName, Suffix)
FIELD(EntityName, USR)
FIELD(NestedBuildNamespace, Namespaces)
FIELD(TUSummary, Data)
FIELD(TUSummary, IdTable)
+FIELD(TUSummary, LinkageTable)
FIELD(TUSummary, TUNamespace)
#undef FIELD
diff --git a/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h b/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
index 4af1c70e1a488..2520ce87f3959 100644
--- a/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
+++ b/clang/include/clang/Analysis/Scalable/TUSummary/TUSummary.h
@@ -12,6 +12,7 @@
#include "clang/Analysis/Scalable/Model/BuildNamespace.h"
#include "clang/Analysis/Scalable/Model/EntityId.h"
#include "clang/Analysis/Scalable/Model/EntityIdTable.h"
+#include "clang/Analysis/Scalable/Model/EntityLinkage.h"
#include "clang/Analysis/Scalable/Model/SummaryName.h"
#include "clang/Analysis/Scalable/TUSummary/EntitySummary.h"
#include <map>
@@ -23,8 +24,11 @@ namespace clang::ssaf {
class TUSummary {
/// Identifies the translation unit.
BuildNamespace TUNamespace;
+
EntityIdTable IdTable;
+ std::map<EntityId, EntityLinkage> LinkageTable;
+
std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
Data;
diff --git a/clang/unittests/Analysis/Scalable/CMakeLists.txt b/clang/unittests/Analysis/Scalable/CMakeLists.txt
index b3920c2d902ad..f1e1c874cc5cd 100644
--- a/clang/unittests/Analysis/Scalable/CMakeLists.txt
+++ b/clang/unittests/Analysis/Scalable/CMakeLists.txt
@@ -3,6 +3,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests
BuildNamespaceTest.cpp
EntityIdTest.cpp
EntityIdTableTest.cpp
+ EntityLinkageTest.cpp
EntityNameTest.cpp
Registries/FancyAnalysisData.cpp
Registries/MockSerializationFormat.cpp
diff --git a/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
new file mode 100644
index 0000000000000..efd804de0af5f
--- /dev/null
+++ b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
@@ -0,0 +1,48 @@
+//===- unittests/Analysis/Scalable/EntityLinkageTest.cpp -----------------===//
+//
+// 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/Model/EntityLinkage.h"
+#include "gtest/gtest.h"
+
+using clang::ssaf::EntityLinkage;
+
+namespace {
+
+constexpr inline auto None = EntityLinkage::LinkageType::None;
+constexpr inline auto Internal = EntityLinkage::LinkageType::Internal;
+constexpr inline auto External = EntityLinkage::LinkageType::External;
+
+TEST(EntityLinkageTest, Constructor) {
+ EntityLinkage NoneLinkage(None);
+ EntityLinkage InternalLinkage(Internal);
+ EntityLinkage ExternalLinkage(External);
+
+ EXPECT_EQ(NoneLinkage.getLinkage(), None);
+ EXPECT_EQ(InternalLinkage.getLinkage(), Internal);
+ EXPECT_EQ(ExternalLinkage.getLinkage(), External);
+}
+
+TEST(EntityLinkageTest, CopyConstructor) {
+ EntityLinkage Original(External);
+ EntityLinkage Copy = Original;
+
+ EXPECT_EQ(Copy.getLinkage(), External);
+ EXPECT_EQ(Copy.getLinkage(), Original.getLinkage());
+}
+
+TEST(EntityLinkageTest, AssignmentOperator) {
+ EntityLinkage Linkage1(None);
+ EntityLinkage Linkage2(External);
+
+ Linkage1 = Linkage2;
+
+ EXPECT_EQ(Linkage1.getLinkage(), External);
+ EXPECT_EQ(Linkage1.getLinkage(), Linkage2.getLinkage());
+}
+
+} // namespace
More information about the cfe-commits
mailing list