From cf94c52e35f2daf4e4caaeb93648f4b5413b557a Mon Sep 17 00:00:00 2001 From: Wei Yi Tee Date: Mon, 19 Sep 2022 17:36:50 +0000 Subject: [PATCH] [clang][dataflow] Replace `transfer(const Stmt *, ...)` with `transfer(const CFGElement *, ...)` in `clang/Analysis/FlowSensitive`. Reviewed By: gribozavr2, sgatev Differential Revision: https://reviews.llvm.org/D133931 --- .../clang/Analysis/FlowSensitive/NoopAnalysis.h | 4 ++-- .../FlowSensitive/ChromiumCheckModelTest.cpp | 7 +++++-- .../MultiVarConstantPropagationTest.cpp | 7 ++++++- .../SingleVarConstantPropagationTest.cpp | 8 ++++++-- .../FlowSensitive/TypeErasedDataflowAnalysisTest.cpp | 20 ++++++++++++++++---- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h index 4f05f5f..bf27ec3 100644 --- a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h @@ -14,7 +14,7 @@ #define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_NOOPANALYSIS_H #include "clang/AST/ASTContext.h" -#include "clang/AST/Stmt.h" +#include "clang/Analysis/CFG.h" #include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/Analysis/FlowSensitive/NoopLattice.h" @@ -38,7 +38,7 @@ public: static NoopLattice initialElement() { return {}; } - void transfer(const Stmt *S, NoopLattice &E, Environment &Env) {} + void transfer(const CFGElement *E, NoopLattice &L, Environment &Env) {} }; } // namespace dataflow diff --git a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp index ea171f7..5743669 100644 --- a/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/ChromiumCheckModelTest.cpp @@ -11,6 +11,7 @@ #include "TestingSupport.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Analysis/CFG.h" #include "clang/Analysis/FlowSensitive/NoopLattice.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/ArrayRef.h" @@ -117,8 +118,10 @@ public: static NoopLattice initialElement() { return NoopLattice(); } - void transfer(const Stmt *S, NoopLattice &, Environment &Env) { - M.transfer(S, Env); + void transfer(const CFGElement *E, NoopLattice &, Environment &Env) { + if (auto S = E->getAs()) { + M.transfer(S->getStmt(), Env); + } } private: diff --git a/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp b/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp index d2e774d..39a1e1d 100644 --- a/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/MultiVarConstantPropagationTest.cpp @@ -19,6 +19,7 @@ #include "clang/AST/Stmt.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Analysis/CFG.h" #include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/Analysis/FlowSensitive/DataflowLattice.h" @@ -132,8 +133,12 @@ public: return ConstantPropagationLattice::bottom(); } - void transfer(const Stmt *S, ConstantPropagationLattice &Vars, + void transfer(const CFGElement *E, ConstantPropagationLattice &Vars, Environment &Env) { + auto CS = E->getAs(); + if (!CS) + return; + auto S = CS->getStmt(); auto matcher = stmt(anyOf(declStmt(hasSingleDecl( varDecl(decl().bind(kVar), hasType(isInteger()), diff --git a/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp b/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp index 67c86f1..60b7860 100644 --- a/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/SingleVarConstantPropagationTest.cpp @@ -19,10 +19,10 @@ #include "clang/AST/Stmt.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Analysis/CFG.h" #include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/Analysis/FlowSensitive/DataflowLattice.h" -#include "clang/Tooling/Tooling.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" @@ -123,8 +123,12 @@ public: return ConstantPropagationLattice::bottom(); } - void transfer(const Stmt *S, ConstantPropagationLattice &Element, + void transfer(const CFGElement *E, ConstantPropagationLattice &Element, Environment &Env) { + auto CS = E->getAs(); + if (!CS) + return; + auto S = CS->getStmt(); auto matcher = stmt( anyOf(declStmt(hasSingleDecl(varDecl(hasType(isInteger()), hasInitializer(expr().bind(kInit))) diff --git a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp index 988475572..90f898e 100644 --- a/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp @@ -111,7 +111,7 @@ public: static NonConvergingLattice initialElement() { return {0}; } - void transfer(const Stmt *S, NonConvergingLattice &E, Environment &Env) { + void transfer(const CFGElement *, NonConvergingLattice &E, Environment &) { ++E.State; } }; @@ -162,7 +162,11 @@ public: static FunctionCallLattice initialElement() { return {}; } - void transfer(const Stmt *S, FunctionCallLattice &E, Environment &Env) { + void transfer(const CFGElement *Elt, FunctionCallLattice &E, Environment &) { + auto CS = Elt->getAs(); + if (!CS) + return; + auto S = CS->getStmt(); if (auto *C = dyn_cast(S)) { if (auto *F = dyn_cast(C->getCalleeDecl())) { E.CalledFunctions.insert(F->getNameInfo().getAsString()); @@ -314,7 +318,11 @@ public: static NoopLattice initialElement() { return {}; } - void transfer(const Stmt *S, NoopLattice &, Environment &Env) { + void transfer(const CFGElement *Elt, NoopLattice &, Environment &Env) { + auto CS = Elt->getAs(); + if (!CS) + return; + auto S = CS->getStmt(); auto SpecialBoolRecordDecl = recordDecl(hasName("SpecialBool")); auto HasSpecialBoolType = hasType(SpecialBoolRecordDecl); @@ -466,7 +474,11 @@ public: static NoopLattice initialElement() { return {}; } - void transfer(const Stmt *S, NoopLattice &, Environment &Env) { + void transfer(const CFGElement *Elt, NoopLattice &, Environment &Env) { + auto CS = Elt->getAs(); + if (!CS) + return; + auto S = CS->getStmt(); auto OptionalIntRecordDecl = recordDecl(hasName("OptionalInt")); auto HasOptionalIntType = hasType(OptionalIntRecordDecl); -- 2.7.4