Skip to content

Commit

Permalink
[clang][dataflow] Refactor ApplyBuiltinTransfer field out into Datafl…
Browse files Browse the repository at this point in the history
…owAnalysisOptions struct

Depends On D130304

This patch pulls the `ApplyBuiltinTransfer` from the `TypeErasedDataflowAnalysis` class into a new `DataflowAnalysisOptions` struct, to allow us to add additional options later without breaking existing code.

Reviewed By: gribozavr2, sgatev

Differential Revision: https://reviews.llvm.org/D130305
  • Loading branch information
samestep committed Jul 22, 2022
1 parent 661577b commit aed1ab8
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 11 deletions.
6 changes: 6 additions & 0 deletions clang/include/clang/Analysis/FlowSensitive/DataflowAnalysis.h
Expand Up @@ -63,9 +63,15 @@ class DataflowAnalysis : public TypeErasedDataflowAnalysis {
using Lattice = LatticeT;

explicit DataflowAnalysis(ASTContext &Context) : Context(Context) {}

/// Deprecated. Use the `DataflowAnalysisOptions` constructor instead.
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; }

TypeErasedLattice typeErasedInitialElement() final {
Expand Down
10 changes: 7 additions & 3 deletions clang/include/clang/Analysis/FlowSensitive/NoopAnalysis.h
Expand Up @@ -24,13 +24,17 @@ namespace dataflow {

class NoopAnalysis : public DataflowAnalysis<NoopAnalysis, NoopLattice> {
public:
/// Deprecated. Use the `DataflowAnalysisOptions` constructor instead.
NoopAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer)
: DataflowAnalysis<NoopAnalysis, NoopLattice>(Context,
ApplyBuiltinTransfer) {}

/// `ApplyBuiltinTransfer` controls whether to run the built-in transfer
/// functions that model memory during the analysis. Their results are not
/// used by `NoopAnalysis`, but tests that need to inspect the environment
/// should enable them.
NoopAnalysis(ASTContext &Context, bool ApplyBuiltinTransfer)
: DataflowAnalysis<NoopAnalysis, NoopLattice>(Context,
ApplyBuiltinTransfer) {}
NoopAnalysis(ASTContext &Context, DataflowAnalysisOptions Options)
: DataflowAnalysis<NoopAnalysis, NoopLattice>(Context, Options) {}

static NoopLattice initialElement() { return {}; }

Expand Down
Expand Up @@ -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 = true;
};

/// Type-erased lattice element container.
///
/// Requirements:
Expand All @@ -42,16 +50,17 @@ struct TypeErasedLattice {

/// 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() : Options({}) {}

/// Deprecated. Use the `DataflowAnalysisOptions` constructor instead.
TypeErasedDataflowAnalysis(bool ApplyBuiltinTransfer)
: ApplyBuiltinTransfer(ApplyBuiltinTransfer) {}
: Options({ApplyBuiltinTransfer}) {}

TypeErasedDataflowAnalysis(DataflowAnalysisOptions Options)
: Options(Options) {}

virtual ~TypeErasedDataflowAnalysis() {}

Expand Down Expand Up @@ -80,7 +89,7 @@ class TypeErasedDataflowAnalysis : public Environment::ValueModel {

/// 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.
Expand Down

0 comments on commit aed1ab8

Please sign in to comment.