diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h --- a/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -178,12 +178,15 @@ /// with a symbolic representation of the `this` pointee. Environment(DataflowAnalysisContext &DACtx, const DeclContext &DeclCtx); + /// Deprecated. Use getDataflowAnalysisContext().getOptions() instead. const DataflowAnalysisContext::Options &getAnalysisOptions() const { return DACtx->getOptions(); } + /// Deprecated. Use getDataflowAnalysisContext().arena() instead. Arena &arena() const { return DACtx->arena(); } + /// Deprecated. Use *getDataflowAnalysisContext().getOptions().Log instead. Logger &logger() const { return *DACtx->getOptions().Log; } /// Creates and returns an environment to use for an inline analysis of the @@ -331,23 +334,23 @@ template std::enable_if_t::value, T &> create(Args &&...args) { - return arena().create(std::forward(args)...); + return DACtx->arena().create(std::forward(args)...); } /// Returns a symbolic boolean value that models a boolean literal equal to /// `Value` AtomicBoolValue &getBoolLiteralValue(bool Value) const { - return arena().makeLiteral(Value); + return DACtx->arena().makeLiteral(Value); } /// Returns an atomic boolean value. BoolValue &makeAtomicBoolValue() const { - return arena().create(); + return DACtx->arena().create(); } /// Returns a unique instance of boolean Top. BoolValue &makeTopBoolValue() const { - return arena().create(); + return DACtx->arena().create(); } /// Returns a boolean value that represents the conjunction of `LHS` and @@ -355,7 +358,7 @@ /// order, will return the same result. If the given boolean values represent /// the same value, the result will be the value itself. BoolValue &makeAnd(BoolValue &LHS, BoolValue &RHS) const { - return arena().makeAnd(LHS, RHS); + return DACtx->arena().makeAnd(LHS, RHS); } /// Returns a boolean value that represents the disjunction of `LHS` and @@ -363,13 +366,13 @@ /// order, will return the same result. If the given boolean values represent /// the same value, the result will be the value itself. BoolValue &makeOr(BoolValue &LHS, BoolValue &RHS) const { - return arena().makeOr(LHS, RHS); + return DACtx->arena().makeOr(LHS, RHS); } /// Returns a boolean value that represents the negation of `Val`. Subsequent /// calls with the same argument will return the same result. BoolValue &makeNot(BoolValue &Val) const { - return arena().makeNot(Val); + return DACtx->arena().makeNot(Val); } /// Returns a boolean value represents `LHS` => `RHS`. Subsequent calls with @@ -377,7 +380,7 @@ /// values represent the same value, the result will be a value that /// represents the true boolean literal. BoolValue &makeImplication(BoolValue &LHS, BoolValue &RHS) const { - return arena().makeImplies(LHS, RHS); + return DACtx->arena().makeImplies(LHS, RHS); } /// Returns a boolean value represents `LHS` <=> `RHS`. Subsequent calls with @@ -385,7 +388,7 @@ /// result. If the given boolean values represent the same value, the result /// will be a value that represents the true boolean literal. BoolValue &makeIff(BoolValue &LHS, BoolValue &RHS) const { - return arena().makeEquals(LHS, RHS); + return DACtx->arena().makeEquals(LHS, RHS); } /// Returns the token that identifies the flow condition of the environment. @@ -407,12 +410,16 @@ /// given `MaxDepth`. bool canDescend(unsigned MaxDepth, const DeclContext *Callee) const; - /// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise, - /// returns null. + /// Deprecated. Use getDataflowAnalysisContext().getControlFlowContext(F) + /// instead. Returns the `ControlFlowContext` registered for `F`, if any. + /// Otherwise, returns null. const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) { return DACtx->getControlFlowContext(F); } + /// Returns the `DataflowAnalysisContext` used by the environment. + DataflowAnalysisContext &getDataflowAnalysisContext() const { return *DACtx; } + LLVM_DUMP_METHOD void dump() const; LLVM_DUMP_METHOD void dump(raw_ostream &OS) const; diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp --- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -381,7 +381,7 @@ QualType ParamType = Param->getType(); if (ParamType->isReferenceType()) { - auto &Val = arena().create(*ArgLoc); + auto &Val = DACtx->arena().create(*ArgLoc); setValue(Loc, Val); } else if (auto *ArgVal = getValue(*ArgLoc)) { setValue(Loc, *ArgVal); @@ -707,7 +707,7 @@ // with integers, and so distinguishing them serves no purpose, but could // prevent convergence. CreatedValuesCount++; - return &arena().create(); + return &DACtx->arena().create(); } if (Type->isReferenceType() || Type->isPointerType()) { @@ -725,9 +725,9 @@ } if (Type->isReferenceType()) - return &arena().create(PointeeLoc); + return &DACtx->arena().create(PointeeLoc); else - return &arena().create(PointeeLoc); + return &DACtx->arena().create(PointeeLoc); } if (Type->isRecordType()) { @@ -747,7 +747,7 @@ Visited.erase(FieldType.getCanonicalType()); } - return &arena().create(std::move(FieldValues)); + return &DACtx->arena().create(std::move(FieldValues)); } return nullptr; diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp --- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -496,7 +496,7 @@ } void VisitReturnStmt(const ReturnStmt *S) { - if (!Env.getAnalysisOptions().ContextSensitiveOpts) + if (!Env.getDataflowAnalysisContext().getOptions().ContextSensitiveOpts) return; auto *Ret = S->getRetValue(); @@ -863,12 +863,13 @@ // `F` of `S`. The type `E` must be either `CallExpr` or `CXXConstructExpr`. template void transferInlineCall(const E *S, const FunctionDecl *F) { - const auto &Options = Env.getAnalysisOptions(); + const auto &Options = Env.getDataflowAnalysisContext().getOptions(); if (!(Options.ContextSensitiveOpts && Env.canDescend(Options.ContextSensitiveOpts->Depth, F))) return; - const ControlFlowContext *CFCtx = Env.getControlFlowContext(F); + const ControlFlowContext *CFCtx = + Env.getDataflowAnalysisContext().getControlFlowContext(F); if (!CFCtx) return; diff --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp --- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp +++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp @@ -168,7 +168,8 @@ llvm::ArrayRef> BlockStates) : CFCtx(CFCtx), Analysis(Analysis), InitEnv(InitEnv), - Log(InitEnv.logger()), BlockStates(BlockStates) { + Log(*InitEnv.getDataflowAnalysisContext().getOptions().Log), + BlockStates(BlockStates) { Log.beginAnalysis(CFCtx, Analysis); } ~AnalysisContext() { Log.endAnalysis(); } diff --git a/clang/unittests/Analysis/FlowSensitive/LoggerTest.cpp b/clang/unittests/Analysis/FlowSensitive/LoggerTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/LoggerTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/LoggerTest.cpp @@ -37,14 +37,16 @@ static TestLattice initialElement() { return TestLattice{}; } void transfer(const CFGElement &, TestLattice &L, Environment &E) { - E.logger().log([](llvm::raw_ostream &OS) { OS << "transfer()"; }); + E.getDataflowAnalysisContext().getOptions().Log->log( + [](llvm::raw_ostream &OS) { OS << "transfer()"; }); ++L.Elements; } void transferBranch(bool Branch, const Stmt *S, TestLattice &L, Environment &E) { - E.logger().log([&](llvm::raw_ostream &OS) { - OS << "transferBranch(" << Branch << ")"; - }); + E.getDataflowAnalysisContext().getOptions().Log->log( + [&](llvm::raw_ostream &OS) { + OS << "transferBranch(" << Branch << ")"; + }); ++L.Branches; } }; diff --git a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp --- a/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ b/clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -53,9 +53,10 @@ [UseBuiltinModel = Options.BuiltinOpts.has_value()](ASTContext &C, Environment &Env) { return NoopAnalysis( - C, DataflowAnalysisOptions{UseBuiltinModel - ? Env.getAnalysisOptions() - : std::optional()}); + C, + DataflowAnalysisOptions{ + UseBuiltinModel ? Env.getDataflowAnalysisContext().getOptions() + : std::optional()}); }); AI.ASTBuildArgs = ASTBuildArgs; if (Options.BuiltinOpts)