[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