[PATCH] D131614: [clang][dataflow] Extend transfer functions for other `CFGElement`s

Stanislav Gatev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 22 03:00:13 PDT 2022


sgatev added inline comments.


================
Comment at: clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h:103
+  /// code being analysed.
+  virtual void transferCFGElement(const CFGElement *Element, Lattice &L,
+                                  Environment &Env) {}
----------------
Any reason not to call this one `transfer` too?


================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:157
 
+// Holds data structures required for running dataflow analysis.
+struct AnalysisContext {
----------------
Let's start struct and member comments with `///`.


================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:184
 ///   All predecessors of `Block` except those with loop back edges must have
-///   already been transferred. States in `BlockStates` that are set to
+///   already been transferred. States in `TC.BlockStates` that are set to
 ///   `llvm::None` represent basic blocks that are not evaluated yet.
----------------



================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:312
+/// Transfers `State` by evaluating each element in the `Block` based on the
+/// `TC.Analysis` specified.
+///
----------------



================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:314
+///
+/// Built in transfer functions (if the option for `ApplyBuiltinTransfer` is set
+/// by the analysis) will be applied to the element before evaluation by the
----------------



================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:328-340
+      switch (Element.getKind()) {
+      case CFGElement::Statement: {
+        builtinTransfer(Element.castAs<CFGStmt>(), State, AC);
+        break;
+      }
+      case CFGElement::Initializer: {
+        builtinTransfer(Element.castAs<CFGInitializer>(), State);
----------------
The level of abstraction for built-in and user code is different in this function which makes it hard to follow. Let's move this in a `builtinTransfer(const CFGElement &, TypeErasedDataflowAnalysisState &)` function that dispatches to one of the other built-in transfer functions. This way `transferCFGBlock` won't mix implementation details with the high level algorithm.


================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:341-347
+    }
+    // User-provided analysis
+    AC.Analysis.transferTypeErased(&Element, State.Lattice, State.Env);
+    // Post processing
+    if (PostVisitCFG) {
+      PostVisitCFG(Element, State);
+    }
----------------



================
Comment at: clang/unittests/Analysis/FlowSensitive/TestingSupport.h:164-170
+    std::function<void(AnalysisData)> VerifyResults, ArrayRef<std::string> Args,
+    const tooling::FileContentMappings &VirtualMappedFiles = {}) {
+
+  std::function<void(ASTContext & Context, const CFGElement &,
+                     const TypeErasedDataflowAnalysisState &)>
+      PostVisitCFG = nullptr;
+  if (PostVisitStmt) {
----------------



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D131614/new/

https://reviews.llvm.org/D131614



More information about the cfe-commits mailing list