File indexing completed on 2026-05-10 08:44:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_SUPPORT_SMTAPI_H
0015 #define LLVM_SUPPORT_SMTAPI_H
0016
0017 #include "llvm/ADT/APFloat.h"
0018 #include "llvm/ADT/APSInt.h"
0019 #include "llvm/ADT/FoldingSet.h"
0020 #include "llvm/Support/raw_ostream.h"
0021 #include <memory>
0022
0023 namespace llvm {
0024
0025
0026 class SMTSort {
0027 public:
0028 SMTSort() = default;
0029 virtual ~SMTSort() = default;
0030
0031
0032 virtual bool isBitvectorSort() const { return isBitvectorSortImpl(); }
0033
0034
0035 virtual bool isFloatSort() const { return isFloatSortImpl(); }
0036
0037
0038 virtual bool isBooleanSort() const { return isBooleanSortImpl(); }
0039
0040
0041
0042 virtual unsigned getBitvectorSortSize() const {
0043 assert(isBitvectorSort() && "Not a bitvector sort!");
0044 unsigned Size = getBitvectorSortSizeImpl();
0045 assert(Size && "Size is zero!");
0046 return Size;
0047 };
0048
0049
0050
0051 virtual unsigned getFloatSortSize() const {
0052 assert(isFloatSort() && "Not a floating-point sort!");
0053 unsigned Size = getFloatSortSizeImpl();
0054 assert(Size && "Size is zero!");
0055 return Size;
0056 };
0057
0058 virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0;
0059
0060 bool operator<(const SMTSort &Other) const {
0061 llvm::FoldingSetNodeID ID1, ID2;
0062 Profile(ID1);
0063 Other.Profile(ID2);
0064 return ID1 < ID2;
0065 }
0066
0067 friend bool operator==(SMTSort const &LHS, SMTSort const &RHS) {
0068 return LHS.equal_to(RHS);
0069 }
0070
0071 virtual void print(raw_ostream &OS) const = 0;
0072
0073 LLVM_DUMP_METHOD void dump() const;
0074
0075 protected:
0076
0077
0078 virtual bool equal_to(SMTSort const &other) const = 0;
0079
0080
0081 virtual bool isBitvectorSortImpl() const = 0;
0082
0083
0084 virtual bool isFloatSortImpl() const = 0;
0085
0086
0087 virtual bool isBooleanSortImpl() const = 0;
0088
0089
0090 virtual unsigned getBitvectorSortSizeImpl() const = 0;
0091
0092
0093 virtual unsigned getFloatSortSizeImpl() const = 0;
0094 };
0095
0096
0097 using SMTSortRef = const SMTSort *;
0098
0099
0100 class SMTExpr {
0101 public:
0102 SMTExpr() = default;
0103 virtual ~SMTExpr() = default;
0104
0105 bool operator<(const SMTExpr &Other) const {
0106 llvm::FoldingSetNodeID ID1, ID2;
0107 Profile(ID1);
0108 Other.Profile(ID2);
0109 return ID1 < ID2;
0110 }
0111
0112 virtual void Profile(llvm::FoldingSetNodeID &ID) const = 0;
0113
0114 friend bool operator==(SMTExpr const &LHS, SMTExpr const &RHS) {
0115 return LHS.equal_to(RHS);
0116 }
0117
0118 virtual void print(raw_ostream &OS) const = 0;
0119
0120 LLVM_DUMP_METHOD void dump() const;
0121
0122 protected:
0123
0124
0125 virtual bool equal_to(SMTExpr const &other) const = 0;
0126 };
0127
0128 class SMTSolverStatistics {
0129 public:
0130 SMTSolverStatistics() = default;
0131 virtual ~SMTSolverStatistics() = default;
0132
0133 virtual double getDouble(llvm::StringRef) const = 0;
0134 virtual unsigned getUnsigned(llvm::StringRef) const = 0;
0135
0136 virtual void print(raw_ostream &OS) const = 0;
0137
0138 LLVM_DUMP_METHOD void dump() const;
0139 };
0140
0141
0142 using SMTExprRef = const SMTExpr *;
0143
0144
0145
0146
0147
0148
0149 class SMTSolver {
0150 public:
0151 SMTSolver() = default;
0152 virtual ~SMTSolver() = default;
0153
0154 LLVM_DUMP_METHOD void dump() const;
0155
0156
0157 SMTSortRef getFloatSort(unsigned BitWidth) {
0158 switch (BitWidth) {
0159 case 16:
0160 return getFloat16Sort();
0161 case 32:
0162 return getFloat32Sort();
0163 case 64:
0164 return getFloat64Sort();
0165 case 128:
0166 return getFloat128Sort();
0167 default:;
0168 }
0169 llvm_unreachable("Unsupported floating-point bitwidth!");
0170 }
0171
0172
0173 virtual SMTSortRef getBoolSort() = 0;
0174
0175
0176 virtual SMTSortRef getBitvectorSort(const unsigned BitWidth) = 0;
0177
0178
0179 virtual SMTSortRef getFloat16Sort() = 0;
0180
0181
0182 virtual SMTSortRef getFloat32Sort() = 0;
0183
0184
0185 virtual SMTSortRef getFloat64Sort() = 0;
0186
0187
0188 virtual SMTSortRef getFloat128Sort() = 0;
0189
0190
0191 virtual SMTSortRef getSort(const SMTExprRef &AST) = 0;
0192
0193
0194 virtual void addConstraint(const SMTExprRef &Exp) const = 0;
0195
0196
0197 virtual SMTExprRef mkBVAdd(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0198
0199
0200 virtual SMTExprRef mkBVSub(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0201
0202
0203 virtual SMTExprRef mkBVMul(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0204
0205
0206 virtual SMTExprRef mkBVSRem(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0207
0208
0209 virtual SMTExprRef mkBVURem(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0210
0211
0212 virtual SMTExprRef mkBVSDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0213
0214
0215 virtual SMTExprRef mkBVUDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0216
0217
0218 virtual SMTExprRef mkBVShl(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0219
0220
0221 virtual SMTExprRef mkBVAshr(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0222
0223
0224 virtual SMTExprRef mkBVLshr(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0225
0226
0227 virtual SMTExprRef mkBVNeg(const SMTExprRef &Exp) = 0;
0228
0229
0230 virtual SMTExprRef mkBVNot(const SMTExprRef &Exp) = 0;
0231
0232
0233 virtual SMTExprRef mkBVXor(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0234
0235
0236 virtual SMTExprRef mkBVOr(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0237
0238
0239 virtual SMTExprRef mkBVAnd(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0240
0241
0242 virtual SMTExprRef mkBVUlt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0243
0244
0245 virtual SMTExprRef mkBVSlt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0246
0247
0248 virtual SMTExprRef mkBVUgt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0249
0250
0251 virtual SMTExprRef mkBVSgt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0252
0253
0254 virtual SMTExprRef mkBVUle(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0255
0256
0257 virtual SMTExprRef mkBVSle(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0258
0259
0260 virtual SMTExprRef mkBVUge(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0261
0262
0263 virtual SMTExprRef mkBVSge(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0264
0265
0266 virtual SMTExprRef mkNot(const SMTExprRef &Exp) = 0;
0267
0268
0269 virtual SMTExprRef mkEqual(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0270
0271
0272 virtual SMTExprRef mkAnd(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0273
0274
0275 virtual SMTExprRef mkOr(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0276
0277
0278 virtual SMTExprRef mkIte(const SMTExprRef &Cond, const SMTExprRef &T,
0279 const SMTExprRef &F) = 0;
0280
0281
0282 virtual SMTExprRef mkBVSignExt(unsigned i, const SMTExprRef &Exp) = 0;
0283
0284
0285 virtual SMTExprRef mkBVZeroExt(unsigned i, const SMTExprRef &Exp) = 0;
0286
0287
0288 virtual SMTExprRef mkBVExtract(unsigned High, unsigned Low,
0289 const SMTExprRef &Exp) = 0;
0290
0291
0292 virtual SMTExprRef mkBVConcat(const SMTExprRef &LHS,
0293 const SMTExprRef &RHS) = 0;
0294
0295
0296
0297 virtual SMTExprRef mkBVAddNoOverflow(const SMTExprRef &LHS,
0298 const SMTExprRef &RHS,
0299 bool isSigned) = 0;
0300
0301
0302
0303 virtual SMTExprRef mkBVAddNoUnderflow(const SMTExprRef &LHS,
0304 const SMTExprRef &RHS) = 0;
0305
0306
0307
0308 virtual SMTExprRef mkBVSubNoOverflow(const SMTExprRef &LHS,
0309 const SMTExprRef &RHS) = 0;
0310
0311
0312
0313 virtual SMTExprRef mkBVSubNoUnderflow(const SMTExprRef &LHS,
0314 const SMTExprRef &RHS,
0315 bool isSigned) = 0;
0316
0317
0318
0319 virtual SMTExprRef mkBVSDivNoOverflow(const SMTExprRef &LHS,
0320 const SMTExprRef &RHS) = 0;
0321
0322
0323
0324 virtual SMTExprRef mkBVNegNoOverflow(const SMTExprRef &Exp) = 0;
0325
0326
0327
0328 virtual SMTExprRef mkBVMulNoOverflow(const SMTExprRef &LHS,
0329 const SMTExprRef &RHS,
0330 bool isSigned) = 0;
0331
0332
0333
0334 virtual SMTExprRef mkBVMulNoUnderflow(const SMTExprRef &LHS,
0335 const SMTExprRef &RHS) = 0;
0336
0337
0338 virtual SMTExprRef mkFPNeg(const SMTExprRef &Exp) = 0;
0339
0340
0341 virtual SMTExprRef mkFPIsInfinite(const SMTExprRef &Exp) = 0;
0342
0343
0344 virtual SMTExprRef mkFPIsNaN(const SMTExprRef &Exp) = 0;
0345
0346
0347 virtual SMTExprRef mkFPIsNormal(const SMTExprRef &Exp) = 0;
0348
0349
0350 virtual SMTExprRef mkFPIsZero(const SMTExprRef &Exp) = 0;
0351
0352
0353 virtual SMTExprRef mkFPMul(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0354
0355
0356 virtual SMTExprRef mkFPDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0357
0358
0359 virtual SMTExprRef mkFPRem(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0360
0361
0362 virtual SMTExprRef mkFPAdd(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0363
0364
0365 virtual SMTExprRef mkFPSub(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0366
0367
0368 virtual SMTExprRef mkFPLt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0369
0370
0371 virtual SMTExprRef mkFPGt(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0372
0373
0374 virtual SMTExprRef mkFPLe(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0375
0376
0377 virtual SMTExprRef mkFPGe(const SMTExprRef &LHS, const SMTExprRef &RHS) = 0;
0378
0379
0380 virtual SMTExprRef mkFPEqual(const SMTExprRef &LHS,
0381 const SMTExprRef &RHS) = 0;
0382
0383
0384
0385 virtual SMTExprRef mkFPtoFP(const SMTExprRef &From, const SMTSortRef &To) = 0;
0386
0387
0388
0389 virtual SMTExprRef mkSBVtoFP(const SMTExprRef &From,
0390 const SMTSortRef &To) = 0;
0391
0392
0393
0394 virtual SMTExprRef mkUBVtoFP(const SMTExprRef &From,
0395 const SMTSortRef &To) = 0;
0396
0397
0398
0399 virtual SMTExprRef mkFPtoSBV(const SMTExprRef &From, unsigned ToWidth) = 0;
0400
0401
0402
0403 virtual SMTExprRef mkFPtoUBV(const SMTExprRef &From, unsigned ToWidth) = 0;
0404
0405
0406 virtual SMTExprRef mkSymbol(const char *Name, SMTSortRef Sort) = 0;
0407
0408
0409 virtual SMTExprRef getFloatRoundingMode() = 0;
0410
0411
0412 virtual llvm::APSInt getBitvector(const SMTExprRef &Exp, unsigned BitWidth,
0413 bool isUnsigned) = 0;
0414
0415
0416 virtual bool getBoolean(const SMTExprRef &Exp) = 0;
0417
0418
0419 virtual SMTExprRef mkBoolean(const bool b) = 0;
0420
0421
0422 virtual SMTExprRef mkFloat(const llvm::APFloat Float) = 0;
0423
0424
0425 virtual SMTExprRef mkBitvector(const llvm::APSInt Int, unsigned BitWidth) = 0;
0426
0427
0428 virtual bool getInterpretation(const SMTExprRef &Exp, llvm::APSInt &Int) = 0;
0429
0430
0431 virtual bool getInterpretation(const SMTExprRef &Exp,
0432 llvm::APFloat &Float) = 0;
0433
0434
0435 virtual std::optional<bool> check() const = 0;
0436
0437
0438 virtual void push() = 0;
0439
0440
0441 virtual void pop(unsigned NumStates = 1) = 0;
0442
0443
0444 virtual void reset() = 0;
0445
0446
0447 virtual bool isFPSupported() = 0;
0448
0449 virtual void print(raw_ostream &OS) const = 0;
0450
0451
0452 virtual void setBoolParam(StringRef Key, bool Value) = 0;
0453 virtual void setUnsignedParam(StringRef Key, unsigned Value) = 0;
0454
0455 virtual std::unique_ptr<SMTSolverStatistics> getStatistics() const = 0;
0456 };
0457
0458
0459 using SMTSolverRef = std::shared_ptr<SMTSolver>;
0460
0461
0462 SMTSolverRef CreateZ3Solver();
0463
0464 }
0465
0466 #endif