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
