[llvm-branch-commits] [clang] [SSAF][PointerFlow] Drop unused TUSummaryExtractor param from translateDeclPointerLevel (PR #222787)
Ziqing Luo via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Sep 11 17:04:24 PDT 2026
https://github.com/ziqingluo-90 updated https://github.com/llvm/llvm-project/pull/222787
>From f0fe1af8bc077592cd78253d729b1dfcf1cbf4cb Mon Sep 17 00:00:00 2001
From: Ziqing Luo <ziqing_luo at apple.com>
Date: Thu, 10 Sep 2026 14:33:19 -0700
Subject: [PATCH] [SSAF][PointerFlow] Drop unused TUSummaryExtractor param from
translateDeclPointerLevel
TUSummaryExtractor is only needed to mint EntityIds when building an
EntityPointerLevel; translateDeclPointerLevel just walks the Expr and
returns raw DeclPointerLevels, so it never touched Extractor.
This is the second patch the radar below depends on:
rdar://187125348
---
.../EntityPointerLevel/EntityPointerLevel.h | 5 +--
.../Analyses/PointerFlow/PointerFlowPairs.h | 2 +
.../EntityPointerLevel/EntityPointerLevel.cpp | 44 ++++++++++---------
.../PointerFlow/PointerFlowExtractor.cpp | 4 +-
4 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/clang/include/clang/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.h b/clang/include/clang/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.h
index 6a4e4c2879ae1..1a6bf072cb0e1 100644
--- a/clang/include/clang/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.h
+++ b/clang/include/clang/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.h
@@ -110,9 +110,8 @@ translateEntityPointerLevel(const Expr *E, ASTContext &Ctx,
/// Same as \c translateEntityPointerLevel, except it returns raw
/// `(NamedDecl *, pointer level, is-return)` tuples (a.k.a. DeclPointerLevels)
/// instead of assembling an `EntityPointerLevelSet` directly.
-llvm::Expected<DeclPointerLevelVec>
-translateDeclPointerLevel(const Expr *E, ASTContext &Ctx,
- TUSummaryExtractor &Extractor);
+llvm::Expected<DeclPointerLevelVec> translateDeclPointerLevel(const Expr *E,
+ ASTContext &Ctx);
/// Assemble `DeclPointerLevels` into an `EntityPointerLevelSet`.
Expected<EntityPointerLevelSet>
diff --git a/clang/include/clang/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowPairs.h b/clang/include/clang/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowPairs.h
index 06f892a7333cc..5bebbfa5a93c2 100644
--- a/clang/include/clang/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowPairs.h
+++ b/clang/include/clang/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowPairs.h
@@ -85,6 +85,8 @@ class PointerFlowPairMatcher {
// pointer.
// - Structured bindings (`auto [a, b] = pair;`) -- the per-element
// `BindingDecl`s are neither `VarDecl` nor `FieldDecl`.
+ // - Compound literals (`(T){...}`) -- not handled, and not covered by
+ // tests.
/// Match and collect pointer flow.
/// The macth function 'F' can be described by the following rules:
diff --git a/clang/lib/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.cpp b/clang/lib/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.cpp
index 299f1be30dcef..6646cf7364836 100644
--- a/clang/lib/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Analyses/EntityPointerLevel/EntityPointerLevel.cpp
@@ -60,7 +60,8 @@ class EntityPointerLevelTranslator
}
Expected<EntityPointerLevel>
- createEntityPointerLevelFor(const NamedDecl *ND) {
+ createEntityPointerLevelFor(const NamedDecl *ND,
+ TUSummaryExtractor &Extractor) {
std::optional<EntityId> Id = Extractor.addEntity(ND);
if (!Id)
return makeErrAtNode(Ctx, ND, "failed to create EntityId for %s",
@@ -69,7 +70,8 @@ class EntityPointerLevelTranslator
}
Expected<EntityPointerLevel>
- createEntityPointerLevelForReturn(const FunctionDecl *FD) {
+ createEntityPointerLevelForReturn(const FunctionDecl *FD,
+ TUSummaryExtractor &Extractor) {
std::optional<EntityId> Id = Extractor.addEntityForReturn(FD);
if (!Id) {
return makeErrAtNode(Ctx, FD, "failed to create EntityId for function %s",
@@ -91,28 +93,30 @@ class EntityPointerLevelTranslator
return SubResult;
}
- TUSummaryExtractor &Extractor;
ASTContext &Ctx;
public:
- EntityPointerLevelTranslator(TUSummaryExtractor &Extractor, ASTContext &Ctx)
- : Extractor(Extractor), Ctx(Ctx) {}
+ EntityPointerLevelTranslator(ASTContext &Ctx) : Ctx(Ctx) {}
Expected<DeclPointerLevelVec> translate(const Expr *E) { return Visit(E); }
- Expected<EntityPointerLevel> translate(const NamedDecl *D, bool IsRet) {
+ Expected<EntityPointerLevel> translate(const NamedDecl *D, bool IsRet,
+ TUSummaryExtractor &Extractor) {
if (!IsRet)
- return createEntityPointerLevelFor(D);
+ return createEntityPointerLevelFor(D, Extractor);
if (const auto *FD = dyn_cast<FunctionDecl>(D))
- return createEntityPointerLevelForReturn(FD);
+ return createEntityPointerLevelForReturn(FD, Extractor);
return makeErrAtNode(Ctx, D, "attempt to get entity for return of %s",
D->getDeclKindName());
}
// Converts a `DeclPointerLevel` to an `EntityPointerLevel`
- Expected<EntityPointerLevel> toEntityPointerLevel(const DeclPointerLevel &D) {
- Expected<EntityPointerLevel> Base = translate(D.Decl, D.IsReturn);
+ Expected<EntityPointerLevel>
+ toEntityPointerLevel(const DeclPointerLevel &D,
+ TUSummaryExtractor &Extractor) {
+ Expected<EntityPointerLevel> Base =
+ translate(D.Decl, D.IsReturn, Extractor);
if (!Base)
return Base.takeError();
return buildEntityPointerLevel(Base->getEntity(), D.PointerLevel);
@@ -334,9 +338,8 @@ class EntityPointerLevelTranslator
} // namespace clang::ssaf
Expected<DeclPointerLevelVec>
-clang::ssaf::translateDeclPointerLevel(const Expr *E, ASTContext &Ctx,
- TUSummaryExtractor &Extractor) {
- EntityPointerLevelTranslator Translator(Extractor, Ctx);
+clang::ssaf::translateDeclPointerLevel(const Expr *E, ASTContext &Ctx) {
+ EntityPointerLevelTranslator Translator(Ctx);
return Translator.translate(E);
}
@@ -344,7 +347,7 @@ clang::ssaf::translateDeclPointerLevel(const Expr *E, ASTContext &Ctx,
Expected<EntityPointerLevelSet>
clang::ssaf::translateEntityPointerLevel(const Expr *E, ASTContext &Ctx,
TUSummaryExtractor &Extractor) {
- EntityPointerLevelTranslator Translator(Extractor, Ctx);
+ EntityPointerLevelTranslator Translator(Ctx);
auto DPLs = Translator.translate(E);
if (!DPLs)
return DPLs.takeError();
@@ -359,9 +362,9 @@ DeclPointerLevel clang::ssaf::createDeclPointerLevel(const NamedDecl *ND,
/// Create an EntityPointerLevel from a ValueDecl of a pointer type.
Expected<EntityPointerLevel> clang::ssaf::createEntityPointerLevel(
const NamedDecl *ND, TUSummaryExtractor &Extractor, bool IsFunRet) {
- EntityPointerLevelTranslator Translator(Extractor, ND->getASTContext());
+ EntityPointerLevelTranslator Translator(ND->getASTContext());
- return Translator.translate(ND, IsFunRet);
+ return Translator.translate(ND, IsFunRet, Extractor);
}
DeclPointerLevelVec
@@ -400,11 +403,12 @@ Expected<EntityPointerLevelSet>
clang::ssaf::toEntityPointerLevels(const DeclPointerLevelVec &DPLs,
ASTContext &Ctx,
TUSummaryExtractor &Extractor) {
- EntityPointerLevelTranslator Translator(Extractor, Ctx);
+ EntityPointerLevelTranslator Translator(Ctx);
EntityPointerLevelSet Result;
for (const auto &DPL : DPLs) {
- Expected<EntityPointerLevel> EPL = Translator.toEntityPointerLevel(DPL);
+ Expected<EntityPointerLevel> EPL =
+ Translator.toEntityPointerLevel(DPL, Extractor);
if (!EPL)
return EPL.takeError();
Result.insert(*EPL);
@@ -415,8 +419,8 @@ clang::ssaf::toEntityPointerLevels(const DeclPointerLevelVec &DPLs,
Expected<EntityPointerLevel>
clang::ssaf::toEntityPointerLevel(const DeclPointerLevel &DPL, ASTContext &Ctx,
TUSummaryExtractor &Extractor) {
- EntityPointerLevelTranslator Translator(Extractor, Ctx);
- return Translator.toEntityPointerLevel(DPL);
+ EntityPointerLevelTranslator Translator(Ctx);
+ return Translator.toEntityPointerLevel(DPL, Extractor);
}
EntityPointerLevel clang::ssaf::buildEntityPointerLevel(EntityId Id,
diff --git a/clang/lib/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowExtractor.cpp b/clang/lib/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowExtractor.cpp
index 8b34c76965770..be5089b634e37 100644
--- a/clang/lib/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Analyses/PointerFlow/PointerFlowExtractor.cpp
@@ -119,7 +119,7 @@ llvm::Error PointerFlowEdgeBuilder::handleRHSAndAddEdges(
for (DeclPointerLevel &DPL : Copy)
DPL.PointerLevel += ArrayElementIndirectLevel;
- return addEdges(Copy, translateDeclPointerLevel(RHS, Ctx, Extractor));
+ return addEdges(Copy, translateDeclPointerLevel(RHS, Ctx));
}
llvm::Error Err = llvm::Error::success();
@@ -134,7 +134,7 @@ llvm::Error PointerFlowEdgeBuilder::handleRHSAndAddEdges(
llvm::Error PointerFlowEdgeBuilder::operator()(const Expr *LHS,
const Expr *RHS) {
- auto LVec = translateDeclPointerLevel(LHS, Ctx, Extractor);
+ auto LVec = translateDeclPointerLevel(LHS, Ctx);
if (!LVec)
return LVec.takeError();
return handleRHSAndAddEdges(*LVec, RHS);
More information about the llvm-branch-commits
mailing list