File indexing completed on 2026-05-10 08:36:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_SOLVER_H
0015 #define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_SOLVER_H
0016
0017 #include "clang/Analysis/FlowSensitive/Formula.h"
0018 #include "clang/Basic/LLVM.h"
0019 #include "llvm/ADT/ArrayRef.h"
0020 #include "llvm/ADT/DenseMap.h"
0021 #include <optional>
0022 #include <vector>
0023
0024 namespace clang {
0025 namespace dataflow {
0026
0027
0028 class Solver {
0029 public:
0030 struct Result {
0031 enum class Status {
0032
0033
0034 Satisfiable,
0035
0036
0037
0038 Unsatisfiable,
0039
0040
0041
0042 TimedOut,
0043 };
0044
0045
0046 enum class Assignment : uint8_t { AssignedFalse = 0, AssignedTrue = 1 };
0047
0048
0049
0050 static Result Satisfiable(llvm::DenseMap<Atom, Assignment> Solution) {
0051 return Result(Status::Satisfiable, std::move(Solution));
0052 }
0053
0054
0055
0056 static Result Unsatisfiable() { return Result(Status::Unsatisfiable, {}); }
0057
0058
0059
0060 static Result TimedOut() { return Result(Status::TimedOut, {}); }
0061
0062
0063
0064 Status getStatus() const { return SATCheckStatus; }
0065
0066
0067
0068 std::optional<llvm::DenseMap<Atom, Assignment>> getSolution() const {
0069 return Solution;
0070 }
0071
0072 private:
0073 Result(Status SATCheckStatus,
0074 std::optional<llvm::DenseMap<Atom, Assignment>> Solution)
0075 : SATCheckStatus(SATCheckStatus), Solution(std::move(Solution)) {}
0076
0077 Status SATCheckStatus;
0078 std::optional<llvm::DenseMap<Atom, Assignment>> Solution;
0079 };
0080
0081 virtual ~Solver() = default;
0082
0083
0084
0085
0086
0087
0088
0089 virtual Result solve(llvm::ArrayRef<const Formula *> Vals) = 0;
0090
0091
0092 virtual bool reachedLimit() const = 0;
0093 };
0094
0095 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Solver::Result &);
0096 llvm::raw_ostream &operator<<(llvm::raw_ostream &, Solver::Result::Assignment);
0097
0098 }
0099 }
0100
0101 #endif