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 <[email protected]> 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); _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
