diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h @@ -65,6 +65,9 @@ explicit DataflowAnalysis(ASTContext &Context) : Context(Context) {} explicit DataflowAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer) : TypeErasedDataflowAnalysis(ApplyBuiltinTransfer), Context(Context) {} + explicit DataflowAnalysis(ASTContext &Context, + DataflowAnalysisOptions Options) + : TypeErasedDataflowAnalysis(Options), Context(Context) {} ASTContext &getASTContext() final { return Context; } diff --git a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h @@ -32,6 +32,9 @@ : DataflowAnalysis(Context, ApplyBuiltinTransfer) {} + NoopAnalysis(ASTContext &Context, DataflowAnalysisOptions Options) + : DataflowAnalysis(Context, Options) {} + static NoopLattice initialElement() { return {}; } void transfer(const Stmt *S, NoopLattice &E, Environment &Env) {} diff --git a/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h b/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h --- a/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h +++ b/clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h @@ -30,6 +30,14 @@ namespace clang { namespace dataflow { +struct DataflowAnalysisOptions { + /// Determines whether to apply the built-in transfer functions. + // FIXME: Remove this option once the framework supports composing analyses + // (at which point the built-in transfer functions can be simply a standalone + // analysis). + bool ApplyBuiltinTransfer; +}; + /// Type-erased lattice element container. /// /// Requirements: @@ -42,16 +50,15 @@ /// Type-erased base class for dataflow analyses built on a single lattice type. class TypeErasedDataflowAnalysis : public Environment::ValueModel { - /// Determines whether to apply the built-in transfer functions. - // FIXME: Remove this option once the framework supports composing analyses - // (at which point the built-in transfer functions can be simply a standalone - // analysis). - bool ApplyBuiltinTransfer; + DataflowAnalysisOptions Options; public: - TypeErasedDataflowAnalysis() : ApplyBuiltinTransfer(true) {} + TypeErasedDataflowAnalysis() + : TypeErasedDataflowAnalysis(/*ApplyBuiltinTransfer=*/true) {} TypeErasedDataflowAnalysis(bool ApplyBuiltinTransfer) - : ApplyBuiltinTransfer(ApplyBuiltinTransfer) {} + : Options({ApplyBuiltinTransfer}) {} + TypeErasedDataflowAnalysis(DataflowAnalysisOptions Options) + : Options(Options) {} virtual ~TypeErasedDataflowAnalysis() {} @@ -80,7 +87,7 @@ /// Determines whether to apply the built-in transfer functions, which model /// the heap and stack in the `Environment`. - bool applyBuiltinTransfer() const { return ApplyBuiltinTransfer; } + bool applyBuiltinTransfer() const { return Options.ApplyBuiltinTransfer; } }; /// Type-erased model of the program at a given program point.