diff options
author | Yitzhak Mandelbaum <yitzhakm@google.com> | 2022-12-27 17:34:30 +0000 |
---|---|---|
committer | Yitzhak Mandelbaum <yitzhakm@google.com> | 2023-01-10 14:17:25 +0000 |
commit | 264976d98e785fa061ce6ac06db4a9bda2590506 (patch) | |
tree | 9578ef790dcdac83a715d7bed4c25cd729006515 /clang/lib/Analysis/FlowSensitive | |
parent | e2e5d5923604db30089c551ba2f469d245887585 (diff) | |
download | llvm-264976d98e785fa061ce6ac06db4a9bda2590506.zip llvm-264976d98e785fa061ce6ac06db4a9bda2590506.tar.gz llvm-264976d98e785fa061ce6ac06db4a9bda2590506.tar.bz2 |
[clang][dataflow] Unify `TransferOptions` and `DataflowAnalysisContext::Options`.
Merges `TransferOptions` into the newly-introduced
`DataflowAnalysisContext::Options` and removes explicit parameter for
`TransferOptions`, relying instead on the common options carried by the analysis
context. Given that there was no intent to allow different options between calls
to `transfer`, a common value for the options is preferable.
Differential Revision: https://reviews.llvm.org/D140703
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive')
3 files changed, 15 insertions, 24 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp index 6b7b2dc..4632305 100644 --- a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp @@ -48,9 +48,8 @@ StorageLocation &DataflowAnalysisContext::createStorageLocation(QualType Type) { // context-sensitive analysis. But, this only applies to storage locations, // since fields access it not allowed to fail. In contrast, field *values* // don't need this allowance, since the API allows for uninitialized fields. - auto Fields = Options.EnableContextSensitiveAnalysis - ? getObjectFields(Type) - : getReferencedFields(Type); + auto Fields = Opts.ContextSensitiveOpts ? getObjectFields(Type) + : getReferencedFields(Type); for (const FieldDecl *Field : Fields) FieldLocs.insert({Field, &createStorageLocation(Field->getType())}); return takeOwnership( diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp index 465dbc9..c2bf187 100644 --- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -128,9 +128,8 @@ static Value *maybeUnpackLValueExpr(const Expr &E, Environment &Env) { class TransferVisitor : public ConstStmtVisitor<TransferVisitor> { public: - TransferVisitor(const StmtToEnvMap &StmtToEnv, Environment &Env, - TransferOptions Options) - : StmtToEnv(StmtToEnv), Env(Env), Options(Options) {} + TransferVisitor(const StmtToEnvMap &StmtToEnv, Environment &Env) + : StmtToEnv(StmtToEnv), Env(Env) {} void VisitBinaryOperator(const BinaryOperator *S) { const Expr *LHS = S->getLHS(); @@ -429,7 +428,7 @@ public: } void VisitReturnStmt(const ReturnStmt *S) { - if (!Options.ContextSensitiveOpts) + if (!Env.getAnalysisOptions().ContextSensitiveOpts) return; auto *Ret = S->getRetValue(); @@ -760,6 +759,7 @@ private: // `F` of `S`. The type `E` must be either `CallExpr` or `CXXConstructExpr`. template <typename E> void transferInlineCall(const E *S, const FunctionDecl *F) { + const auto &Options = Env.getAnalysisOptions(); if (!(Options.ContextSensitiveOpts && Env.canDescend(Options.ContextSensitiveOpts->Depth, F))) return; @@ -804,12 +804,10 @@ private: const StmtToEnvMap &StmtToEnv; Environment &Env; - TransferOptions Options; }; -void transfer(const StmtToEnvMap &StmtToEnv, const Stmt &S, Environment &Env, - TransferOptions Options) { - TransferVisitor(StmtToEnv, Env, Options).Visit(&S); +void transfer(const StmtToEnvMap &StmtToEnv, const Stmt &S, Environment &Env) { + TransferVisitor(StmtToEnv, Env).Visit(&S); } } // namespace dataflow diff --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp index ced016f..685df7b 100644 --- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp +++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp @@ -95,9 +95,8 @@ class TerminatorVisitor : public ConstStmtVisitor<TerminatorVisitor, TerminatorVisitorRetTy> { public: TerminatorVisitor(const StmtToEnvMap &StmtToEnv, Environment &Env, - int BlockSuccIdx, TransferOptions TransferOpts) - : StmtToEnv(StmtToEnv), Env(Env), - BlockSuccIdx(BlockSuccIdx), TransferOpts(TransferOpts) {} + int BlockSuccIdx) + : StmtToEnv(StmtToEnv), Env(Env), BlockSuccIdx(BlockSuccIdx) {} TerminatorVisitorRetTy VisitIfStmt(const IfStmt *S) { auto *Cond = S->getCond(); @@ -142,7 +141,7 @@ private: TerminatorVisitorRetTy extendFlowCondition(const Expr &Cond) { // The terminator sub-expression might not be evaluated. if (Env.getStorageLocation(Cond, SkipPast::None) == nullptr) - transfer(StmtToEnv, Cond, Env, TransferOpts); + transfer(StmtToEnv, Cond, Env); // FIXME: The flow condition must be an r-value, so `SkipPast::None` should // suffice. @@ -178,7 +177,6 @@ private: const StmtToEnvMap &StmtToEnv; Environment &Env; int BlockSuccIdx; - TransferOptions TransferOpts; }; /// Holds data structures required for running dataflow analysis. @@ -248,8 +246,6 @@ computeBlockInputState(const CFGBlock &Block, AnalysisContext &AC) { llvm::Optional<TypeErasedDataflowAnalysisState> MaybeState; auto &Analysis = AC.Analysis; - auto BuiltinTransferOpts = Analysis.builtinTransferOptions(); - for (const CFGBlock *Pred : Preds) { // Skip if the `Block` is unreachable or control flow cannot get past it. if (!Pred || Pred->hasNoReturnElement()) @@ -263,13 +259,12 @@ computeBlockInputState(const CFGBlock &Block, AnalysisContext &AC) { continue; TypeErasedDataflowAnalysisState PredState = *MaybePredState; - if (BuiltinTransferOpts) { + if (Analysis.builtinOptions()) { if (const Stmt *PredTerminatorStmt = Pred->getTerminatorStmt()) { const StmtToEnvMapImpl StmtToEnv(AC.CFCtx, AC.BlockStates); auto [Cond, CondValue] = TerminatorVisitor(StmtToEnv, PredState.Env, - blockIndexInPredecessor(*Pred, Block), - *BuiltinTransferOpts) + blockIndexInPredecessor(*Pred, Block)) .Visit(PredTerminatorStmt); if (Cond != nullptr) // FIXME: Call transferBranchTypeErased even if BuiltinTransferOpts @@ -301,8 +296,7 @@ void builtinTransferStatement(const CFGStmt &Elt, AnalysisContext &AC) { const Stmt *S = Elt.getStmt(); assert(S != nullptr); - transfer(StmtToEnvMapImpl(AC.CFCtx, AC.BlockStates), *S, InputState.Env, - *AC.Analysis.builtinTransferOptions()); + transfer(StmtToEnvMapImpl(AC.CFCtx, AC.BlockStates), *S, InputState.Env); } /// Built-in transfer function for `CFGInitializer`. @@ -373,7 +367,7 @@ transferCFGBlock(const CFGBlock &Block, AnalysisContext &AC, auto State = computeBlockInputState(Block, AC); for (const auto &Element : Block) { // Built-in analysis - if (AC.Analysis.builtinTransferOptions()) { + if (AC.Analysis.builtinOptions()) { builtinTransfer(Element, State, AC); } |