From 1c3ac8dfa16c42a631968aadd0396cfe7f7778e0 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Wed, 5 Jul 2023 11:35:06 +0200 Subject: Reland "[dataflow] Add dedicated representation of boolean formulas" This reverts commit 7a72ce98224be76d9328e65eee472381f7c8e7fe. Test problems were due to unspecified order of function arg evaluation. --- .../FlowSensitive/DataflowAnalysisContext.cpp | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp') diff --git a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp index 37bcc8b..42cc6d4 100644 --- a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp @@ -15,6 +15,7 @@ #include "clang/Analysis/FlowSensitive/DataflowAnalysisContext.h" #include "clang/AST/ExprCXX.h" #include "clang/Analysis/FlowSensitive/DebugSupport.h" +#include "clang/Analysis/FlowSensitive/Formula.h" #include "clang/Analysis/FlowSensitive/Logger.h" #include "clang/Analysis/FlowSensitive/Value.h" #include "llvm/ADT/SetOperations.h" @@ -23,9 +24,12 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" #include #include +#include #include +#include static llvm::cl::opt DataflowLog( "dataflow-log", llvm::cl::Hidden, llvm::cl::ValueOptional, @@ -129,7 +133,10 @@ Solver::Result DataflowAnalysisContext::querySolver(llvm::SetVector Constraints) { Constraints.insert(&arena().makeLiteral(true)); Constraints.insert(&arena().makeNot(arena().makeLiteral(false))); - return S->solve(Constraints.getArrayRef()); + std::vector Formulas; + for (const BoolValue *Constraint : Constraints) + Formulas.push_back(&arena().getFormula(*Constraint)); + return S->solve(Formulas); } bool DataflowAnalysisContext::flowConditionImplies(AtomicBoolValue &Token, @@ -191,15 +198,21 @@ void DataflowAnalysisContext::addTransitiveFlowConditionConstraints( void DataflowAnalysisContext::dumpFlowCondition(AtomicBoolValue &Token, llvm::raw_ostream &OS) { + // TODO: accumulate formulas directly instead llvm::SetVector Constraints; Constraints.insert(&Token); llvm::DenseSet VisitedTokens; addTransitiveFlowConditionConstraints(Token, Constraints, VisitedTokens); - llvm::DenseMap AtomNames = { - {&arena().makeLiteral(false), "False"}, - {&arena().makeLiteral(true), "True"}}; - OS << debugString(Constraints.getArrayRef(), AtomNames); + // TODO: have formulas know about true/false directly instead + Atom True = arena().getFormula(arena().makeLiteral(true)).getAtom(); + Atom False = arena().getFormula(arena().makeLiteral(false)).getAtom(); + Formula::AtomNames Names = {{False, "false"}, {True, "true"}}; + + for (const auto *Constraint : Constraints) { + arena().getFormula(*Constraint).print(OS, &Names); + OS << "\n"; + } } const ControlFlowContext * -- cgit v1.1