aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Analysis/FlowSensitive
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2022-12-27 17:34:30 +0000
committerYitzhak Mandelbaum <yitzhakm@google.com>2023-01-10 14:17:25 +0000
commit264976d98e785fa061ce6ac06db4a9bda2590506 (patch)
tree9578ef790dcdac83a715d7bed4c25cd729006515 /clang/lib/Analysis/FlowSensitive
parente2e5d5923604db30089c551ba2f469d245887585 (diff)
downloadllvm-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')
-rw-r--r--clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp5
-rw-r--r--clang/lib/Analysis/FlowSensitive/Transfer.cpp14
-rw-r--r--clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp20
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);
}