[clang] [analyzer][NFC] Merge `BlockInvocationContext` class into `StackFrameContext` (PR #194857)

via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 29 06:23:40 PDT 2026


=?utf-8?b?R8OhYm9yIFTDs3RodsOhcmk=?=,=?utf-8?b?R8OhYm9yIFTDs3RodsOhcmk=?=,
=?utf-8?b?R8OhYm9yIFTDs3RodsOhcmk=?=,=?utf-8?b?R8OhYm9yIFTDs3RodsOhcmk=?Message-ID: <llvm.org/llvm/llvm-project/pull/194857 at github.com>
In-Reply-To:


https://github.com/tigbr created https://github.com/llvm/llvm-project/pull/194857

At the moment, the execution stack in the analyzer is represented with the `LocationContext` base class and two of its sub-classes `StackFrameContext` and `BlockInvocationContext`. This hierarchy, however, is more complicated than necessary and, in issue #190973, a roadmap was created to reduce this hierarchy down to just a single `StackFrame` class.

This patch implements the first five steps of that roadmap. Specifically, the functionality of `BlockInvocationContext` was merged into the `StackFrameContext` class and the `BlockInvocationContext` class was removed together with its usages.

>From ffdbfea41dc02f1c846e11e788fe56b9c4dc2a06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=A1bor=20T=C3=B3thv=C3=A1ri?=
 <gabor.tothvari at ericsson.com>
Date: Tue, 28 Apr 2026 14:56:28 +0200
Subject: [PATCH 1/5] Step 1. of LocationContext refactoring

Introduce new field `const BlockDataRegion *BlockInvocationData` in
`StackFrameContext`.

Propagate this new field to `Profile` methods and constructors.
---
 clang/include/clang/Analysis/AnalysisDeclContext.h | 14 +++++++++++---
 clang/lib/Analysis/AnalysisDeclContext.cpp         |  6 +++---
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/include/clang/Analysis/AnalysisDeclContext.h b/clang/include/clang/Analysis/AnalysisDeclContext.h
index 00785d6d1db51..606d9c3b425cc 100644
--- a/clang/include/clang/Analysis/AnalysisDeclContext.h
+++ b/clang/include/clang/Analysis/AnalysisDeclContext.h
@@ -46,6 +46,10 @@ class StackFrameContext;
 class Stmt;
 class VarDecl;
 
+namespace ento {
+class BlockDataRegion;
+}
+
 /// The base class of a hierarchy of objects representing analyses tied
 /// to AnalysisDeclContext.
 class ManagedAnalysis {
@@ -299,6 +303,9 @@ class LocationContext : public llvm::FoldingSetNode {
 class StackFrameContext : public LocationContext {
   friend class LocationContextManager;
 
+  // Extra data for BlockInvocations
+  const ento::BlockDataRegion *BlockInvocationData;
+
   // The call site where this stack frame is established.
   const Expr *CallSite;
 
@@ -314,9 +321,9 @@ class StackFrameContext : public LocationContext {
   const unsigned Index;
 
   StackFrameContext(AnalysisDeclContext *ADC, const LocationContext *ParentLC,
-                    const Expr *E, const CFGBlock *Block, unsigned BlockCount,
+                    const ento::BlockDataRegion *BlockInvocationData, const Expr *E, const CFGBlock *Block, unsigned BlockCount,
                     unsigned Index, int64_t ID)
-      : LocationContext(StackFrame, ADC, ParentLC, ID), CallSite(E),
+      : LocationContext(StackFrame, ADC, ParentLC, ID), BlockInvocationData(BlockInvocationData), CallSite(E),
         Block(Block), BlockCount(BlockCount), Index(Index) {}
 
 public:
@@ -335,10 +342,11 @@ class StackFrameContext : public LocationContext {
   void Profile(llvm::FoldingSetNodeID &ID) override;
 
   static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ADC,
-                      const LocationContext *ParentLC, const Expr *E,
+                      const LocationContext *ParentLC, const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
                       const CFGBlock *Block, unsigned BlockCount,
                       unsigned Index) {
     ProfileCommon(ID, StackFrame, ADC, ParentLC, E);
+    ID.AddPointer(BlockInvocationData);
     ID.AddPointer(Block);
     ID.AddInteger(BlockCount);
     ID.AddInteger(Index);
diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp
index 266d20632e3cc..47df3a1a0e2b5 100644
--- a/clang/lib/Analysis/AnalysisDeclContext.cpp
+++ b/clang/lib/Analysis/AnalysisDeclContext.cpp
@@ -415,7 +415,7 @@ void LocationContext::ProfileCommon(llvm::FoldingSetNodeID &ID,
 }
 
 void StackFrameContext::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getAnalysisDeclContext(), getParent(), CallSite, Block,
+  Profile(ID, getAnalysisDeclContext(), getParent(), BlockInvocationData, CallSite, Block,
           BlockCount, Index);
 }
 
@@ -431,12 +431,12 @@ const StackFrameContext *LocationContextManager::getStackFrame(
     AnalysisDeclContext *Ctx, const LocationContext *Parent, const Expr *E,
     const CFGBlock *Blk, unsigned BlockCount, unsigned StmtIdx) {
   llvm::FoldingSetNodeID ID;
-  StackFrameContext::Profile(ID, Ctx, Parent, E, Blk, BlockCount, StmtIdx);
+  StackFrameContext::Profile(ID, Ctx, Parent, nullptr, E, Blk, BlockCount, StmtIdx);
   void *InsertPos;
   auto *L =
    cast_or_null<StackFrameContext>(Contexts.FindNodeOrInsertPos(ID, InsertPos));
   if (!L) {
-    L = new StackFrameContext(Ctx, Parent, E, Blk, BlockCount, StmtIdx,
+    L = new StackFrameContext(Ctx, Parent, nullptr, E, Blk, BlockCount, StmtIdx,
                               ++NewID);
     Contexts.InsertNode(L, InsertPos);
   }

>From 4d23469520f866763ab9fb9f232c6aa98dcf9d8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=A1bor=20T=C3=B3thv=C3=A1ri?=
 <gabor.tothvari at ericsson.com>
Date: Wed, 29 Apr 2026 11:06:30 +0200
Subject: [PATCH 2/5] Step 2. of `LocationContext` Refactoring

Now whenever a `BlockInvocationContext` is created the related `BlockInvocation`
data (`BlockDataRegion`) is put inside the `StackFrameContext` as well.

Updated factory methods for `StackFrameContext` and `ExprEngine::inlineCall`.
---
 .../clang/Analysis/AnalysisDeclContext.h      | 20 +++++++++++--------
 clang/lib/Analysis/AnalysisDeclContext.cpp    |  9 +++++----
 clang/lib/StaticAnalyzer/Core/CallEvent.cpp   |  2 +-
 .../Core/ExprEngineCallAndReturn.cpp          |  4 +++-
 4 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/clang/include/clang/Analysis/AnalysisDeclContext.h b/clang/include/clang/Analysis/AnalysisDeclContext.h
index 606d9c3b425cc..1db287163c8fb 100644
--- a/clang/include/clang/Analysis/AnalysisDeclContext.h
+++ b/clang/include/clang/Analysis/AnalysisDeclContext.h
@@ -183,6 +183,7 @@ class AnalysisDeclContext {
 
   /// \copydoc LocationContextManager::getStackFrame()
   const StackFrameContext *getStackFrame(LocationContext const *ParentLC,
+                                         const ento::BlockDataRegion *BlockInvocationData,
                                          const Expr *E, const CFGBlock *Blk,
                                          unsigned BlockCount, unsigned Index);
 
@@ -403,16 +404,19 @@ class LocationContextManager {
 
   /// Obtain a context of the call stack using its parent context.
   ///
-  /// \param ADC        The AnalysisDeclContext.
-  /// \param ParentLC   The parent context of this newly created context.
-  /// \param E          The call expression.
-  /// \param Block      The basic block.
-  /// \param BlockCount The current count of entering into \p Block.
-  /// \param StmtIdx    The index of the call expression \p E among the
-  ///                   statements of the CFGBlock \p Block.
+  /// \param ADC                 The AnalysisDeclContext.
+  /// \param ParentLC            The parent context of this newly created context.
+  /// \param BlockInvocationData Extra data in case this StackFrameContext is
+  ///                            created for a BlockInvocation.
+  /// \param E                   The call expression.
+  /// \param Block               The basic block.
+  /// \param BlockCount          The current count of entering into \p Block.
+  /// \param StmtIdx             The index of the call expression \p E among the
+  ///                            statements of the CFGBlock \p Block.
   /// \returns The stack frame context corresponding to the call.
   const StackFrameContext *getStackFrame(AnalysisDeclContext *ADC,
                                          const LocationContext *ParentLC,
+                                         const ento::BlockDataRegion *BlockInvocationData,
                                          const Expr *E, const CFGBlock *Block,
                                          unsigned BlockCount, unsigned StmtIdx);
 
@@ -477,7 +481,7 @@ class AnalysisDeclContextManager {
   ///
   /// \returns The top level stack frame for \p D.
   const StackFrameContext *getStackFrame(const Decl *D) {
-    return LocCtxMgr.getStackFrame(getContext(D), nullptr, nullptr, nullptr, 0,
+    return LocCtxMgr.getStackFrame(getContext(D), nullptr, nullptr, nullptr, nullptr, 0,
                                    0);
   }
 
diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp
index 47df3a1a0e2b5..15e824ef5e7dd 100644
--- a/clang/lib/Analysis/AnalysisDeclContext.cpp
+++ b/clang/lib/Analysis/AnalysisDeclContext.cpp
@@ -312,9 +312,10 @@ BodyFarm &AnalysisDeclContextManager::getBodyFarm() { return FunctionBodyFarm; }
 
 const StackFrameContext *
 AnalysisDeclContext::getStackFrame(const LocationContext *ParentLC,
+                                   const ento::BlockDataRegion *BlockInvocationData,
                                    const Expr *E, const CFGBlock *Blk,
                                    unsigned BlockCount, unsigned Index) {
-  return getLocationContextManager().getStackFrame(this, ParentLC, E, Blk,
+  return getLocationContextManager().getStackFrame(this, ParentLC, BlockInvocationData, E, Blk,
                                                    BlockCount, Index);
 }
 
@@ -428,15 +429,15 @@ void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) {
 //===----------------------------------------------------------------------===//
 
 const StackFrameContext *LocationContextManager::getStackFrame(
-    AnalysisDeclContext *Ctx, const LocationContext *Parent, const Expr *E,
+    AnalysisDeclContext *Ctx, const LocationContext *Parent, const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
     const CFGBlock *Blk, unsigned BlockCount, unsigned StmtIdx) {
   llvm::FoldingSetNodeID ID;
-  StackFrameContext::Profile(ID, Ctx, Parent, nullptr, E, Blk, BlockCount, StmtIdx);
+  StackFrameContext::Profile(ID, Ctx, Parent, BlockInvocationData, E, Blk, BlockCount, StmtIdx);
   void *InsertPos;
   auto *L =
    cast_or_null<StackFrameContext>(Contexts.FindNodeOrInsertPos(ID, InsertPos));
   if (!L) {
-    L = new StackFrameContext(Ctx, Parent, nullptr, E, Blk, BlockCount, StmtIdx,
+    L = new StackFrameContext(Ctx, Parent, BlockInvocationData, E, Blk, BlockCount, StmtIdx,
                               ++NewID);
     Contexts.InsertNode(L, InsertPos);
   }
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index eb32b9e581291..911ffdf1d4eab 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -186,7 +186,7 @@ CallEvent::getCalleeStackFrame(unsigned BlockCount) const {
         break;
   assert(Idx < Sz);
 
-  return ADC->getStackFrame(LCtx, E, B, BlockCount, Idx);
+  return ADC->getStackFrame(LCtx, nullptr, E, B, BlockCount, Idx);
 }
 
 const ParamVarRegion
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
index 3dc3c9d05f24e..7837be494fa01 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -536,9 +536,11 @@ void ExprEngine::inlineCall(WorkList *WList, const CallEvent &Call,
   const LocationContext *CurLC = Pred->getLocationContext();
   const StackFrameContext *CallerSFC = CurLC->getStackFrame();
   const LocationContext *ParentOfCallee = CallerSFC;
+  const BlockDataRegion *BlockInvocationData = nullptr;
   if (Call.getKind() == CE_Block &&
       !cast<BlockCall>(Call).isConversionFromLambda()) {
     const BlockDataRegion *BR = cast<BlockCall>(Call).getBlockRegion();
+    BlockInvocationData = BR;
     assert(BR && "If we have the block definition we should have its region");
     AnalysisDeclContext *BlockCtx = AMgr.getAnalysisDeclContext(D);
     ParentOfCallee = BlockCtx->getBlockInvocationContext(CallerSFC,
@@ -552,7 +554,7 @@ void ExprEngine::inlineCall(WorkList *WList, const CallEvent &Call,
   // Construct a new stack frame for the callee.
   AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(D);
   const StackFrameContext *CalleeSFC =
-      CalleeADC->getStackFrame(ParentOfCallee, CallE, getCurrBlock(),
+      CalleeADC->getStackFrame(ParentOfCallee, BlockInvocationData, CallE, getCurrBlock(),
                                getNumVisitedCurrent(), currStmtIdx);
 
   CallEnter Loc(CallE, CalleeSFC, CurLC);

>From b64608f3055a34b1de089fafe9b326dd0c9448b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=A1bor=20T=C3=B3thv=C3=A1ri?=
 <gabor.tothvari at ericsson.com>
Date: Wed, 29 Apr 2026 12:02:39 +0200
Subject: [PATCH 3/5] Step 3. of `LocationContext` Refactoring

Now `BlockInvocationContext` is not used anymore in
`getStackOrCaptureRegionForDeclContext` in `MemRegion.cpp`.
---
 .../clang/Analysis/AnalysisDeclContext.h      |  2 ++
 clang/lib/StaticAnalyzer/Core/MemRegion.cpp   | 19 +++++++++----------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/Analysis/AnalysisDeclContext.h b/clang/include/clang/Analysis/AnalysisDeclContext.h
index 1db287163c8fb..2e9b486f52913 100644
--- a/clang/include/clang/Analysis/AnalysisDeclContext.h
+++ b/clang/include/clang/Analysis/AnalysisDeclContext.h
@@ -330,6 +330,8 @@ class StackFrameContext : public LocationContext {
 public:
   ~StackFrameContext() override = default;
 
+  const ento::BlockDataRegion* getBlockInvocationData() const { return BlockInvocationData; }
+
   const Expr *getCallSite() const { return CallSite; }
 
   const CFGBlock *getCallSiteBlock() const { return Block; }
diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
index 941cb2fa2a103..6d00ea67c3e99 100644
--- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
+++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
@@ -1004,16 +1004,15 @@ getStackOrCaptureRegionForDeclContext(const LocationContext *LC,
     if (const auto *SFC = dyn_cast<StackFrameContext>(LC)) {
       if (cast<DeclContext>(SFC->getDecl()) == DC)
         return SFC;
-    }
-    if (const auto *BC = dyn_cast<BlockInvocationContext>(LC)) {
-      const auto *BR = static_cast<const BlockDataRegion *>(BC->getData());
-      // FIXME: This can be made more efficient.
-      for (auto Var : BR->referenced_vars()) {
-        const TypedValueRegion *OrigR = Var.getOriginalRegion();
-        if (const auto *VR = dyn_cast<VarRegion>(OrigR)) {
-          if (VR->getDecl() == VD)
-            return cast<VarRegion>(Var.getCapturedRegion());
-        }
+      if (SFC->getBlockInvocationData()) {
+        // FIXME: This can be made more efficient.
+        for (auto Var : SFC->getBlockInvocationData()->referenced_vars()) {
+          const TypedValueRegion *OrigR = Var.getOriginalRegion();
+          if (const auto *VR = dyn_cast<VarRegion>(OrigR)) {
+            if (VR->getDecl() == VD)
+              return cast<VarRegion>(Var.getCapturedRegion());
+          }
+        } 
       }
     }
 

>From 69ada24c9c54783217175fcb0df557396d4348d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=A1bor=20T=C3=B3thv=C3=A1ri?=
 <gabor.tothvari at ericsson.com>
Date: Wed, 29 Apr 2026 12:12:51 +0200
Subject: [PATCH 4/5] Step 4. of `LocationContext` Refactoring

Stop creating `BlockInvocationContext` instances.
---
 .../lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp  | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
index 7837be494fa01..5dbf32fdfb2d4 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -539,13 +539,10 @@ void ExprEngine::inlineCall(WorkList *WList, const CallEvent &Call,
   const BlockDataRegion *BlockInvocationData = nullptr;
   if (Call.getKind() == CE_Block &&
       !cast<BlockCall>(Call).isConversionFromLambda()) {
-    const BlockDataRegion *BR = cast<BlockCall>(Call).getBlockRegion();
-    BlockInvocationData = BR;
-    assert(BR && "If we have the block definition we should have its region");
+    BlockInvocationData = cast<BlockCall>(Call).getBlockRegion();
+    assert(BlockInvocationData && "If we have the block definition we should have its region");
     AnalysisDeclContext *BlockCtx = AMgr.getAnalysisDeclContext(D);
-    ParentOfCallee = BlockCtx->getBlockInvocationContext(CallerSFC,
-                                                         cast<BlockDecl>(D),
-                                                         BR);
+    ParentOfCallee = CallerSFC;
   }
 
   // This may be NULL, but that's fine.

>From fa23528d1eebff52f2e71848acece261fec3419b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=A1bor=20T=C3=B3thv=C3=A1ri?=
 <gabor.tothvari at ericsson.com>
Date: Wed, 29 Apr 2026 14:56:48 +0200
Subject: [PATCH 5/5] Step 5. of `LocationContext` Refactoring

`BlockInvocationContext` and its usages are removed entirely.
---
 .../clang/Analysis/AnalysisDeclContext.h      | 95 +++++--------------
 clang/lib/Analysis/AnalysisDeclContext.cpp    | 68 +++----------
 .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 12 ---
 .../Core/ExprEngineCallAndReturn.cpp          |  9 +-
 clang/lib/StaticAnalyzer/Core/MemRegion.cpp   |  2 +-
 5 files changed, 44 insertions(+), 142 deletions(-)

diff --git a/clang/include/clang/Analysis/AnalysisDeclContext.h b/clang/include/clang/Analysis/AnalysisDeclContext.h
index 2e9b486f52913..e5cf0e65222a0 100644
--- a/clang/include/clang/Analysis/AnalysisDeclContext.h
+++ b/clang/include/clang/Analysis/AnalysisDeclContext.h
@@ -36,7 +36,6 @@ namespace clang {
 class AnalysisDeclContextManager;
 class ASTContext;
 class BlockDecl;
-class BlockInvocationContext;
 class CFGReverseBlockReachabilityAnalysis;
 class ImplicitParamDecl;
 class LocationContext;
@@ -182,15 +181,10 @@ class AnalysisDeclContext {
   const ImplicitParamDecl *getSelfDecl() const;
 
   /// \copydoc LocationContextManager::getStackFrame()
-  const StackFrameContext *getStackFrame(LocationContext const *ParentLC,
-                                         const ento::BlockDataRegion *BlockInvocationData,
-                                         const Expr *E, const CFGBlock *Blk,
-                                         unsigned BlockCount, unsigned Index);
-
-  /// \copydoc LocationContextManager::getBlockInvocationContext()
-  const BlockInvocationContext *
-  getBlockInvocationContext(const LocationContext *ParentLC,
-                            const BlockDecl *BD, const void *Data);
+  const StackFrameContext *
+  getStackFrame(LocationContext const *ParentLC,
+                const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
+                const CFGBlock *Blk, unsigned BlockCount, unsigned Index);
 
   /// \returns The specified analysis object, lazily running the analysis if
   /// necessary or nullptr if the analysis could not run.
@@ -219,7 +213,7 @@ class AnalysisDeclContext {
 /// model entering, leaving or inlining function calls.
 class LocationContext : public llvm::FoldingSetNode {
 public:
-  enum ContextKind { StackFrame, Block };
+  enum ContextKind { StackFrame };
 
 private:
   ContextKind Kind;
@@ -322,15 +316,19 @@ class StackFrameContext : public LocationContext {
   const unsigned Index;
 
   StackFrameContext(AnalysisDeclContext *ADC, const LocationContext *ParentLC,
-                    const ento::BlockDataRegion *BlockInvocationData, const Expr *E, const CFGBlock *Block, unsigned BlockCount,
+                    const ento::BlockDataRegion *BlockInvocationData,
+                    const Expr *E, const CFGBlock *Block, unsigned BlockCount,
                     unsigned Index, int64_t ID)
-      : LocationContext(StackFrame, ADC, ParentLC, ID), BlockInvocationData(BlockInvocationData), CallSite(E),
-        Block(Block), BlockCount(BlockCount), Index(Index) {}
+      : LocationContext(StackFrame, ADC, ParentLC, ID),
+        BlockInvocationData(BlockInvocationData), CallSite(E), Block(Block),
+        BlockCount(BlockCount), Index(Index) {}
 
 public:
   ~StackFrameContext() override = default;
 
-  const ento::BlockDataRegion* getBlockInvocationData() const { return BlockInvocationData; }
+  const ento::BlockDataRegion *getBlockInvocationData() const {
+    return BlockInvocationData;
+  }
 
   const Expr *getCallSite() const { return CallSite; }
 
@@ -345,8 +343,9 @@ class StackFrameContext : public LocationContext {
   void Profile(llvm::FoldingSetNodeID &ID) override;
 
   static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ADC,
-                      const LocationContext *ParentLC, const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
-                      const CFGBlock *Block, unsigned BlockCount,
+                      const LocationContext *ParentLC,
+                      const ento::BlockDataRegion *BlockInvocationData,
+                      const Expr *E, const CFGBlock *Block, unsigned BlockCount,
                       unsigned Index) {
     ProfileCommon(ID, StackFrame, ADC, ParentLC, E);
     ID.AddPointer(BlockInvocationData);
@@ -360,41 +359,6 @@ class StackFrameContext : public LocationContext {
   }
 };
 
-/// It represents a block invocation (based on BlockCall).
-class BlockInvocationContext : public LocationContext {
-  friend class LocationContextManager;
-
-  const BlockDecl *BD;
-
-  // FIXME: Come up with a more type-safe way to model context-sensitivity.
-  const void *Data;
-
-  BlockInvocationContext(AnalysisDeclContext *ADC,
-                         const LocationContext *ParentLC, const BlockDecl *BD,
-                         const void *Data, int64_t ID)
-      : LocationContext(Block, ADC, ParentLC, ID), BD(BD), Data(Data) {}
-
-public:
-  ~BlockInvocationContext() override = default;
-
-  const BlockDecl *getBlockDecl() const { return BD; }
-
-  const void *getData() const { return Data; }
-
-  void Profile(llvm::FoldingSetNodeID &ID) override;
-
-  static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ADC,
-                      const LocationContext *ParentLC, const BlockDecl *BD,
-                      const void *Data) {
-    ProfileCommon(ID, Block, ADC, ParentLC, BD);
-    ID.AddPointer(Data);
-  }
-
-  static bool classof(const LocationContext *LC) {
-    return LC->getKind() == Block;
-  }
-};
-
 class LocationContextManager {
   llvm::FoldingSet<LocationContext> Contexts;
 
@@ -407,7 +371,8 @@ class LocationContextManager {
   /// Obtain a context of the call stack using its parent context.
   ///
   /// \param ADC                 The AnalysisDeclContext.
-  /// \param ParentLC            The parent context of this newly created context.
+  /// \param ParentLC            The parent context of this newly created
+  /// context.
   /// \param BlockInvocationData Extra data in case this StackFrameContext is
   ///                            created for a BlockInvocation.
   /// \param E                   The call expression.
@@ -416,22 +381,10 @@ class LocationContextManager {
   /// \param StmtIdx             The index of the call expression \p E among the
   ///                            statements of the CFGBlock \p Block.
   /// \returns The stack frame context corresponding to the call.
-  const StackFrameContext *getStackFrame(AnalysisDeclContext *ADC,
-                                         const LocationContext *ParentLC,
-                                         const ento::BlockDataRegion *BlockInvocationData,
-                                         const Expr *E, const CFGBlock *Block,
-                                         unsigned BlockCount, unsigned StmtIdx);
-
-  /// Obtain a context of the block invocation using its parent context.
-  ///
-  /// \param ADC      The AnalysisDeclContext.
-  /// \param ParentLC The parent context of this newly created context.
-  /// \param BD       The BlockDecl.
-  /// \param Data     The raw data to store as part of the context.
-  const BlockInvocationContext *
-  getBlockInvocationContext(AnalysisDeclContext *ADC,
-                            const LocationContext *ParentLC,
-                            const BlockDecl *BD, const void *Data);
+  const StackFrameContext *
+  getStackFrame(AnalysisDeclContext *ADC, const LocationContext *ParentLC,
+                const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
+                const CFGBlock *Block, unsigned BlockCount, unsigned StmtIdx);
 
   /// Discard all previously created LocationContext objects.
   void clear();
@@ -483,8 +436,8 @@ class AnalysisDeclContextManager {
   ///
   /// \returns The top level stack frame for \p D.
   const StackFrameContext *getStackFrame(const Decl *D) {
-    return LocCtxMgr.getStackFrame(getContext(D), nullptr, nullptr, nullptr, nullptr, 0,
-                                   0);
+    return LocCtxMgr.getStackFrame(getContext(D), nullptr, nullptr, nullptr,
+                                   nullptr, 0, 0);
   }
 
   BodyFarm &getBodyFarm();
diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp
index 15e824ef5e7dd..0503291457887 100644
--- a/clang/lib/Analysis/AnalysisDeclContext.cpp
+++ b/clang/lib/Analysis/AnalysisDeclContext.cpp
@@ -310,19 +310,12 @@ AnalysisDeclContext *AnalysisDeclContextManager::getContext(const Decl *D) {
 
 BodyFarm &AnalysisDeclContextManager::getBodyFarm() { return FunctionBodyFarm; }
 
-const StackFrameContext *
-AnalysisDeclContext::getStackFrame(const LocationContext *ParentLC,
-                                   const ento::BlockDataRegion *BlockInvocationData,
-                                   const Expr *E, const CFGBlock *Blk,
-                                   unsigned BlockCount, unsigned Index) {
-  return getLocationContextManager().getStackFrame(this, ParentLC, BlockInvocationData, E, Blk,
-                                                   BlockCount, Index);
-}
-
-const BlockInvocationContext *AnalysisDeclContext::getBlockInvocationContext(
-    const LocationContext *ParentLC, const BlockDecl *BD, const void *Data) {
-  return getLocationContextManager().getBlockInvocationContext(this, ParentLC,
-                                                               BD, Data);
+const StackFrameContext *AnalysisDeclContext::getStackFrame(
+    const LocationContext *ParentLC,
+    const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
+    const CFGBlock *Blk, unsigned BlockCount, unsigned Index) {
+  return getLocationContextManager().getStackFrame(
+      this, ParentLC, BlockInvocationData, E, Blk, BlockCount, Index);
 }
 
 bool AnalysisDeclContext::isInStdNamespace(const Decl *D) {
@@ -416,12 +409,8 @@ void LocationContext::ProfileCommon(llvm::FoldingSetNodeID &ID,
 }
 
 void StackFrameContext::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getAnalysisDeclContext(), getParent(), BlockInvocationData, CallSite, Block,
-          BlockCount, Index);
-}
-
-void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getAnalysisDeclContext(), getParent(), BD, Data);
+  Profile(ID, getAnalysisDeclContext(), getParent(), BlockInvocationData,
+          CallSite, Block, BlockCount, Index);
 }
 
 //===----------------------------------------------------------------------===//
@@ -429,32 +418,18 @@ void BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) {
 //===----------------------------------------------------------------------===//
 
 const StackFrameContext *LocationContextManager::getStackFrame(
-    AnalysisDeclContext *Ctx, const LocationContext *Parent, const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
+    AnalysisDeclContext *Ctx, const LocationContext *Parent,
+    const ento::BlockDataRegion *BlockInvocationData, const Expr *E,
     const CFGBlock *Blk, unsigned BlockCount, unsigned StmtIdx) {
   llvm::FoldingSetNodeID ID;
-  StackFrameContext::Profile(ID, Ctx, Parent, BlockInvocationData, E, Blk, BlockCount, StmtIdx);
+  StackFrameContext::Profile(ID, Ctx, Parent, BlockInvocationData, E, Blk,
+                             BlockCount, StmtIdx);
   void *InsertPos;
   auto *L =
    cast_or_null<StackFrameContext>(Contexts.FindNodeOrInsertPos(ID, InsertPos));
   if (!L) {
-    L = new StackFrameContext(Ctx, Parent, BlockInvocationData, E, Blk, BlockCount, StmtIdx,
-                              ++NewID);
-    Contexts.InsertNode(L, InsertPos);
-  }
-  return L;
-}
-
-const BlockInvocationContext *LocationContextManager::getBlockInvocationContext(
-    AnalysisDeclContext *ADC, const LocationContext *ParentLC,
-    const BlockDecl *BD, const void *Data) {
-  llvm::FoldingSetNodeID ID;
-  BlockInvocationContext::Profile(ID, ADC, ParentLC, BD, Data);
-  void *InsertPos;
-  auto *L =
-    cast_or_null<BlockInvocationContext>(Contexts.FindNodeOrInsertPos(ID,
-                                                                    InsertPos));
-  if (!L) {
-    L = new BlockInvocationContext(ADC, ParentLC, BD, Data, ++NewID);
+    L = new StackFrameContext(Ctx, Parent, BlockInvocationData, E, Blk,
+                              BlockCount, StmtIdx, ++NewID);
     Contexts.InsertNode(L, InsertPos);
   }
   return L;
@@ -521,13 +496,6 @@ void LocationContext::dumpStack(raw_ostream &Out) const {
         printLocation(Out, SM, E->getBeginLoc());
       }
       break;
-    case Block:
-      Out << "Invoking block";
-      if (const Decl *D = cast<BlockInvocationContext>(LCtx)->getDecl()) {
-        Out << " defined at line ";
-        printLocation(Out, SM, D->getBeginLoc());
-      }
-      break;
     }
     Out << '\n';
   }
@@ -566,14 +534,6 @@ void LocationContext::printJson(raw_ostream &Out, const char *NL,
 
       Out << ", \"items\": ";
       break;
-    case Block:
-      Out << "Invoking block\" ";
-      if (const Decl *D = cast<BlockInvocationContext>(LCtx)->getDecl()) {
-        Out << ", \"location\": ";
-        printSourceLocationAsJson(Out, D->getBeginLoc(), SM);
-        Out << ' ';
-      }
-      break;
     }
 
     printMoreInfoPerContext(LCtx);
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
index 5807b4db61fef..72394817da326 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
@@ -222,12 +222,6 @@ SVal ExprEngine::computeObjectUnderConstruction(
           // able to find construction context at all.
           break;
         }
-        if (isa<BlockInvocationContext>(CallerLCtx)) {
-          // Unwrap block invocation contexts. They're mostly part of
-          // the current stack frame.
-          CallerLCtx = CallerLCtx->getParent();
-          assert(!isa<BlockInvocationContext>(CallerLCtx));
-        }
 
         unsigned NVCaller = getNumVisited(CallerLCtx, SFC->getCallSiteBlock());
         return computeObjectUnderConstruction(
@@ -447,12 +441,6 @@ ProgramStateRef ExprEngine::updateObjectsUnderConstruction(
       auto RTC = (*SFC->getCallSiteBlock())[SFC->getIndex()]
                      .getAs<CFGCXXRecordTypedCall>();
       assert(RTC && "Could not have had a target region without it");
-      if (isa<BlockInvocationContext>(CallerLCtx)) {
-        // Unwrap block invocation contexts. They're mostly part of
-        // the current stack frame.
-        CallerLCtx = CallerLCtx->getParent();
-        assert(!isa<BlockInvocationContext>(CallerLCtx));
-      }
 
       return updateObjectsUnderConstruction(
           V, SFC->getCallSite(), State, CallerLCtx,
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
index 5dbf32fdfb2d4..6c5fe71af1840 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -540,7 +540,8 @@ void ExprEngine::inlineCall(WorkList *WList, const CallEvent &Call,
   if (Call.getKind() == CE_Block &&
       !cast<BlockCall>(Call).isConversionFromLambda()) {
     BlockInvocationData = cast<BlockCall>(Call).getBlockRegion();
-    assert(BlockInvocationData && "If we have the block definition we should have its region");
+    assert(BlockInvocationData &&
+           "If we have the block definition we should have its region");
     AnalysisDeclContext *BlockCtx = AMgr.getAnalysisDeclContext(D);
     ParentOfCallee = CallerSFC;
   }
@@ -550,9 +551,9 @@ void ExprEngine::inlineCall(WorkList *WList, const CallEvent &Call,
 
   // Construct a new stack frame for the callee.
   AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(D);
-  const StackFrameContext *CalleeSFC =
-      CalleeADC->getStackFrame(ParentOfCallee, BlockInvocationData, CallE, getCurrBlock(),
-                               getNumVisitedCurrent(), currStmtIdx);
+  const StackFrameContext *CalleeSFC = CalleeADC->getStackFrame(
+      ParentOfCallee, BlockInvocationData, CallE, getCurrBlock(),
+      getNumVisitedCurrent(), currStmtIdx);
 
   CallEnter Loc(CallE, CalleeSFC, CurLC);
 
diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
index 6d00ea67c3e99..0e74ffc6c021b 100644
--- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
+++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
@@ -1012,7 +1012,7 @@ getStackOrCaptureRegionForDeclContext(const LocationContext *LC,
             if (VR->getDecl() == VD)
               return cast<VarRegion>(Var.getCapturedRegion());
           }
-        } 
+        }
       }
     }
 



More information about the cfe-commits mailing list