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


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

Reply via email to