Z3Solver.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. //== Z3Solver.cpp -----------------------------------------------*- C++ -*--==//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/ADT/SmallString.h"
  9. #include "llvm/ADT/Twine.h"
  10. #include "llvm/Config/config.h"
  11. #include "llvm/Support/SMTAPI.h"
  12. #include <set>
  13. using namespace llvm;
  14. #if LLVM_WITH_Z3
  15. #error #include <z3.h>
  16. namespace {
  17. /// Configuration class for Z3
  18. class Z3Config {
  19. friend class Z3Context;
  20. Z3_config Config;
  21. public:
  22. Z3Config() : Config(Z3_mk_config()) {
  23. // Enable model finding
  24. Z3_set_param_value(Config, "model", "true");
  25. // Disable proof generation
  26. Z3_set_param_value(Config, "proof", "false");
  27. // Set timeout to 15000ms = 15s
  28. Z3_set_param_value(Config, "timeout", "15000");
  29. }
  30. ~Z3Config() { Z3_del_config(Config); }
  31. }; // end class Z3Config
  32. // Function used to report errors
  33. void Z3ErrorHandler(Z3_context Context, Z3_error_code Error) {
  34. llvm::report_fatal_error("Z3 error: " +
  35. llvm::Twine(Z3_get_error_msg(Context, Error)));
  36. }
  37. /// Wrapper for Z3 context
  38. class Z3Context {
  39. public:
  40. Z3_context Context;
  41. Z3Context() {
  42. Context = Z3_mk_context_rc(Z3Config().Config);
  43. // The error function is set here because the context is the first object
  44. // created by the backend
  45. Z3_set_error_handler(Context, Z3ErrorHandler);
  46. }
  47. virtual ~Z3Context() {
  48. Z3_del_context(Context);
  49. Context = nullptr;
  50. }
  51. }; // end class Z3Context
  52. /// Wrapper for Z3 Sort
  53. class Z3Sort : public SMTSort {
  54. friend class Z3Solver;
  55. Z3Context &Context;
  56. Z3_sort Sort;
  57. public:
  58. /// Default constructor, mainly used by make_shared
  59. Z3Sort(Z3Context &C, Z3_sort ZS) : Context(C), Sort(ZS) {
  60. Z3_inc_ref(Context.Context, reinterpret_cast<Z3_ast>(Sort));
  61. }
  62. /// Override implicit copy constructor for correct reference counting.
  63. Z3Sort(const Z3Sort &Other) : Context(Other.Context), Sort(Other.Sort) {
  64. Z3_inc_ref(Context.Context, reinterpret_cast<Z3_ast>(Sort));
  65. }
  66. /// Override implicit copy assignment constructor for correct reference
  67. /// counting.
  68. Z3Sort &operator=(const Z3Sort &Other) {
  69. Z3_inc_ref(Context.Context, reinterpret_cast<Z3_ast>(Other.Sort));
  70. Z3_dec_ref(Context.Context, reinterpret_cast<Z3_ast>(Sort));
  71. Sort = Other.Sort;
  72. return *this;
  73. }
  74. Z3Sort(Z3Sort &&Other) = delete;
  75. Z3Sort &operator=(Z3Sort &&Other) = delete;
  76. ~Z3Sort() {
  77. if (Sort)
  78. Z3_dec_ref(Context.Context, reinterpret_cast<Z3_ast>(Sort));
  79. }
  80. void Profile(llvm::FoldingSetNodeID &ID) const override {
  81. ID.AddInteger(
  82. Z3_get_ast_id(Context.Context, reinterpret_cast<Z3_ast>(Sort)));
  83. }
  84. bool isBitvectorSortImpl() const override {
  85. return (Z3_get_sort_kind(Context.Context, Sort) == Z3_BV_SORT);
  86. }
  87. bool isFloatSortImpl() const override {
  88. return (Z3_get_sort_kind(Context.Context, Sort) == Z3_FLOATING_POINT_SORT);
  89. }
  90. bool isBooleanSortImpl() const override {
  91. return (Z3_get_sort_kind(Context.Context, Sort) == Z3_BOOL_SORT);
  92. }
  93. unsigned getBitvectorSortSizeImpl() const override {
  94. return Z3_get_bv_sort_size(Context.Context, Sort);
  95. }
  96. unsigned getFloatSortSizeImpl() const override {
  97. return Z3_fpa_get_ebits(Context.Context, Sort) +
  98. Z3_fpa_get_sbits(Context.Context, Sort);
  99. }
  100. bool equal_to(SMTSort const &Other) const override {
  101. return Z3_is_eq_sort(Context.Context, Sort,
  102. static_cast<const Z3Sort &>(Other).Sort);
  103. }
  104. void print(raw_ostream &OS) const override {
  105. OS << Z3_sort_to_string(Context.Context, Sort);
  106. }
  107. }; // end class Z3Sort
  108. static const Z3Sort &toZ3Sort(const SMTSort &S) {
  109. return static_cast<const Z3Sort &>(S);
  110. }
  111. class Z3Expr : public SMTExpr {
  112. friend class Z3Solver;
  113. Z3Context &Context;
  114. Z3_ast AST;
  115. public:
  116. Z3Expr(Z3Context &C, Z3_ast ZA) : SMTExpr(), Context(C), AST(ZA) {
  117. Z3_inc_ref(Context.Context, AST);
  118. }
  119. /// Override implicit copy constructor for correct reference counting.
  120. Z3Expr(const Z3Expr &Copy) : SMTExpr(), Context(Copy.Context), AST(Copy.AST) {
  121. Z3_inc_ref(Context.Context, AST);
  122. }
  123. /// Override implicit copy assignment constructor for correct reference
  124. /// counting.
  125. Z3Expr &operator=(const Z3Expr &Other) {
  126. Z3_inc_ref(Context.Context, Other.AST);
  127. Z3_dec_ref(Context.Context, AST);
  128. AST = Other.AST;
  129. return *this;
  130. }
  131. Z3Expr(Z3Expr &&Other) = delete;
  132. Z3Expr &operator=(Z3Expr &&Other) = delete;
  133. ~Z3Expr() {
  134. if (AST)
  135. Z3_dec_ref(Context.Context, AST);
  136. }
  137. void Profile(llvm::FoldingSetNodeID &ID) const override {
  138. ID.AddInteger(Z3_get_ast_id(Context.Context, AST));
  139. }
  140. /// Comparison of AST equality, not model equivalence.
  141. bool equal_to(SMTExpr const &Other) const override {
  142. assert(Z3_is_eq_sort(Context.Context, Z3_get_sort(Context.Context, AST),
  143. Z3_get_sort(Context.Context,
  144. static_cast<const Z3Expr &>(Other).AST)) &&
  145. "AST's must have the same sort");
  146. return Z3_is_eq_ast(Context.Context, AST,
  147. static_cast<const Z3Expr &>(Other).AST);
  148. }
  149. void print(raw_ostream &OS) const override {
  150. OS << Z3_ast_to_string(Context.Context, AST);
  151. }
  152. }; // end class Z3Expr
  153. static const Z3Expr &toZ3Expr(const SMTExpr &E) {
  154. return static_cast<const Z3Expr &>(E);
  155. }
  156. class Z3Model {
  157. friend class Z3Solver;
  158. Z3Context &Context;
  159. Z3_model Model;
  160. public:
  161. Z3Model(Z3Context &C, Z3_model ZM) : Context(C), Model(ZM) {
  162. Z3_model_inc_ref(Context.Context, Model);
  163. }
  164. Z3Model(const Z3Model &Other) = delete;
  165. Z3Model(Z3Model &&Other) = delete;
  166. Z3Model &operator=(Z3Model &Other) = delete;
  167. Z3Model &operator=(Z3Model &&Other) = delete;
  168. ~Z3Model() {
  169. if (Model)
  170. Z3_model_dec_ref(Context.Context, Model);
  171. }
  172. void print(raw_ostream &OS) const {
  173. OS << Z3_model_to_string(Context.Context, Model);
  174. }
  175. LLVM_DUMP_METHOD void dump() const { print(llvm::errs()); }
  176. }; // end class Z3Model
  177. /// Get the corresponding IEEE floating-point type for a given bitwidth.
  178. static const llvm::fltSemantics &getFloatSemantics(unsigned BitWidth) {
  179. switch (BitWidth) {
  180. default:
  181. llvm_unreachable("Unsupported floating-point semantics!");
  182. break;
  183. case 16:
  184. return llvm::APFloat::IEEEhalf();
  185. case 32:
  186. return llvm::APFloat::IEEEsingle();
  187. case 64:
  188. return llvm::APFloat::IEEEdouble();
  189. case 128:
  190. return llvm::APFloat::IEEEquad();
  191. }
  192. }
  193. // Determine whether two float semantics are equivalent
  194. static bool areEquivalent(const llvm::fltSemantics &LHS,
  195. const llvm::fltSemantics &RHS) {
  196. return (llvm::APFloat::semanticsPrecision(LHS) ==
  197. llvm::APFloat::semanticsPrecision(RHS)) &&
  198. (llvm::APFloat::semanticsMinExponent(LHS) ==
  199. llvm::APFloat::semanticsMinExponent(RHS)) &&
  200. (llvm::APFloat::semanticsMaxExponent(LHS) ==
  201. llvm::APFloat::semanticsMaxExponent(RHS)) &&
  202. (llvm::APFloat::semanticsSizeInBits(LHS) ==
  203. llvm::APFloat::semanticsSizeInBits(RHS));
  204. }
  205. class Z3Solver : public SMTSolver {
  206. friend class Z3ConstraintManager;
  207. Z3Context Context;
  208. Z3_solver Solver;
  209. // Cache Sorts
  210. std::set<Z3Sort> CachedSorts;
  211. // Cache Exprs
  212. std::set<Z3Expr> CachedExprs;
  213. public:
  214. Z3Solver() : Solver(Z3_mk_simple_solver(Context.Context)) {
  215. Z3_solver_inc_ref(Context.Context, Solver);
  216. }
  217. Z3Solver(const Z3Solver &Other) = delete;
  218. Z3Solver(Z3Solver &&Other) = delete;
  219. Z3Solver &operator=(Z3Solver &Other) = delete;
  220. Z3Solver &operator=(Z3Solver &&Other) = delete;
  221. ~Z3Solver() {
  222. if (Solver)
  223. Z3_solver_dec_ref(Context.Context, Solver);
  224. }
  225. void addConstraint(const SMTExprRef &Exp) const override {
  226. Z3_solver_assert(Context.Context, Solver, toZ3Expr(*Exp).AST);
  227. }
  228. // Given an SMTSort, adds/retrives it from the cache and returns
  229. // an SMTSortRef to the SMTSort in the cache
  230. SMTSortRef newSortRef(const SMTSort &Sort) {
  231. auto It = CachedSorts.insert(toZ3Sort(Sort));
  232. return &(*It.first);
  233. }
  234. // Given an SMTExpr, adds/retrives it from the cache and returns
  235. // an SMTExprRef to the SMTExpr in the cache
  236. SMTExprRef newExprRef(const SMTExpr &Exp) {
  237. auto It = CachedExprs.insert(toZ3Expr(Exp));
  238. return &(*It.first);
  239. }
  240. SMTSortRef getBoolSort() override {
  241. return newSortRef(Z3Sort(Context, Z3_mk_bool_sort(Context.Context)));
  242. }
  243. SMTSortRef getBitvectorSort(unsigned BitWidth) override {
  244. return newSortRef(
  245. Z3Sort(Context, Z3_mk_bv_sort(Context.Context, BitWidth)));
  246. }
  247. SMTSortRef getSort(const SMTExprRef &Exp) override {
  248. return newSortRef(
  249. Z3Sort(Context, Z3_get_sort(Context.Context, toZ3Expr(*Exp).AST)));
  250. }
  251. SMTSortRef getFloat16Sort() override {
  252. return newSortRef(Z3Sort(Context, Z3_mk_fpa_sort_16(Context.Context)));
  253. }
  254. SMTSortRef getFloat32Sort() override {
  255. return newSortRef(Z3Sort(Context, Z3_mk_fpa_sort_32(Context.Context)));
  256. }
  257. SMTSortRef getFloat64Sort() override {
  258. return newSortRef(Z3Sort(Context, Z3_mk_fpa_sort_64(Context.Context)));
  259. }
  260. SMTSortRef getFloat128Sort() override {
  261. return newSortRef(Z3Sort(Context, Z3_mk_fpa_sort_128(Context.Context)));
  262. }
  263. SMTExprRef mkBVNeg(const SMTExprRef &Exp) override {
  264. return newExprRef(
  265. Z3Expr(Context, Z3_mk_bvneg(Context.Context, toZ3Expr(*Exp).AST)));
  266. }
  267. SMTExprRef mkBVNot(const SMTExprRef &Exp) override {
  268. return newExprRef(
  269. Z3Expr(Context, Z3_mk_bvnot(Context.Context, toZ3Expr(*Exp).AST)));
  270. }
  271. SMTExprRef mkNot(const SMTExprRef &Exp) override {
  272. return newExprRef(
  273. Z3Expr(Context, Z3_mk_not(Context.Context, toZ3Expr(*Exp).AST)));
  274. }
  275. SMTExprRef mkBVAdd(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  276. return newExprRef(
  277. Z3Expr(Context, Z3_mk_bvadd(Context.Context, toZ3Expr(*LHS).AST,
  278. toZ3Expr(*RHS).AST)));
  279. }
  280. SMTExprRef mkBVSub(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  281. return newExprRef(
  282. Z3Expr(Context, Z3_mk_bvsub(Context.Context, toZ3Expr(*LHS).AST,
  283. toZ3Expr(*RHS).AST)));
  284. }
  285. SMTExprRef mkBVMul(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  286. return newExprRef(
  287. Z3Expr(Context, Z3_mk_bvmul(Context.Context, toZ3Expr(*LHS).AST,
  288. toZ3Expr(*RHS).AST)));
  289. }
  290. SMTExprRef mkBVSRem(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  291. return newExprRef(
  292. Z3Expr(Context, Z3_mk_bvsrem(Context.Context, toZ3Expr(*LHS).AST,
  293. toZ3Expr(*RHS).AST)));
  294. }
  295. SMTExprRef mkBVURem(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  296. return newExprRef(
  297. Z3Expr(Context, Z3_mk_bvurem(Context.Context, toZ3Expr(*LHS).AST,
  298. toZ3Expr(*RHS).AST)));
  299. }
  300. SMTExprRef mkBVSDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  301. return newExprRef(
  302. Z3Expr(Context, Z3_mk_bvsdiv(Context.Context, toZ3Expr(*LHS).AST,
  303. toZ3Expr(*RHS).AST)));
  304. }
  305. SMTExprRef mkBVUDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  306. return newExprRef(
  307. Z3Expr(Context, Z3_mk_bvudiv(Context.Context, toZ3Expr(*LHS).AST,
  308. toZ3Expr(*RHS).AST)));
  309. }
  310. SMTExprRef mkBVShl(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  311. return newExprRef(
  312. Z3Expr(Context, Z3_mk_bvshl(Context.Context, toZ3Expr(*LHS).AST,
  313. toZ3Expr(*RHS).AST)));
  314. }
  315. SMTExprRef mkBVAshr(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  316. return newExprRef(
  317. Z3Expr(Context, Z3_mk_bvashr(Context.Context, toZ3Expr(*LHS).AST,
  318. toZ3Expr(*RHS).AST)));
  319. }
  320. SMTExprRef mkBVLshr(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  321. return newExprRef(
  322. Z3Expr(Context, Z3_mk_bvlshr(Context.Context, toZ3Expr(*LHS).AST,
  323. toZ3Expr(*RHS).AST)));
  324. }
  325. SMTExprRef mkBVXor(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  326. return newExprRef(
  327. Z3Expr(Context, Z3_mk_bvxor(Context.Context, toZ3Expr(*LHS).AST,
  328. toZ3Expr(*RHS).AST)));
  329. }
  330. SMTExprRef mkBVOr(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  331. return newExprRef(
  332. Z3Expr(Context, Z3_mk_bvor(Context.Context, toZ3Expr(*LHS).AST,
  333. toZ3Expr(*RHS).AST)));
  334. }
  335. SMTExprRef mkBVAnd(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  336. return newExprRef(
  337. Z3Expr(Context, Z3_mk_bvand(Context.Context, toZ3Expr(*LHS).AST,
  338. toZ3Expr(*RHS).AST)));
  339. }
  340. SMTExprRef mkBVUlt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  341. return newExprRef(
  342. Z3Expr(Context, Z3_mk_bvult(Context.Context, toZ3Expr(*LHS).AST,
  343. toZ3Expr(*RHS).AST)));
  344. }
  345. SMTExprRef mkBVSlt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  346. return newExprRef(
  347. Z3Expr(Context, Z3_mk_bvslt(Context.Context, toZ3Expr(*LHS).AST,
  348. toZ3Expr(*RHS).AST)));
  349. }
  350. SMTExprRef mkBVUgt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  351. return newExprRef(
  352. Z3Expr(Context, Z3_mk_bvugt(Context.Context, toZ3Expr(*LHS).AST,
  353. toZ3Expr(*RHS).AST)));
  354. }
  355. SMTExprRef mkBVSgt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  356. return newExprRef(
  357. Z3Expr(Context, Z3_mk_bvsgt(Context.Context, toZ3Expr(*LHS).AST,
  358. toZ3Expr(*RHS).AST)));
  359. }
  360. SMTExprRef mkBVUle(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  361. return newExprRef(
  362. Z3Expr(Context, Z3_mk_bvule(Context.Context, toZ3Expr(*LHS).AST,
  363. toZ3Expr(*RHS).AST)));
  364. }
  365. SMTExprRef mkBVSle(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  366. return newExprRef(
  367. Z3Expr(Context, Z3_mk_bvsle(Context.Context, toZ3Expr(*LHS).AST,
  368. toZ3Expr(*RHS).AST)));
  369. }
  370. SMTExprRef mkBVUge(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  371. return newExprRef(
  372. Z3Expr(Context, Z3_mk_bvuge(Context.Context, toZ3Expr(*LHS).AST,
  373. toZ3Expr(*RHS).AST)));
  374. }
  375. SMTExprRef mkBVSge(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  376. return newExprRef(
  377. Z3Expr(Context, Z3_mk_bvsge(Context.Context, toZ3Expr(*LHS).AST,
  378. toZ3Expr(*RHS).AST)));
  379. }
  380. SMTExprRef mkAnd(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  381. Z3_ast Args[2] = {toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST};
  382. return newExprRef(Z3Expr(Context, Z3_mk_and(Context.Context, 2, Args)));
  383. }
  384. SMTExprRef mkOr(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  385. Z3_ast Args[2] = {toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST};
  386. return newExprRef(Z3Expr(Context, Z3_mk_or(Context.Context, 2, Args)));
  387. }
  388. SMTExprRef mkEqual(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  389. return newExprRef(
  390. Z3Expr(Context, Z3_mk_eq(Context.Context, toZ3Expr(*LHS).AST,
  391. toZ3Expr(*RHS).AST)));
  392. }
  393. SMTExprRef mkFPNeg(const SMTExprRef &Exp) override {
  394. return newExprRef(
  395. Z3Expr(Context, Z3_mk_fpa_neg(Context.Context, toZ3Expr(*Exp).AST)));
  396. }
  397. SMTExprRef mkFPIsInfinite(const SMTExprRef &Exp) override {
  398. return newExprRef(Z3Expr(
  399. Context, Z3_mk_fpa_is_infinite(Context.Context, toZ3Expr(*Exp).AST)));
  400. }
  401. SMTExprRef mkFPIsNaN(const SMTExprRef &Exp) override {
  402. return newExprRef(
  403. Z3Expr(Context, Z3_mk_fpa_is_nan(Context.Context, toZ3Expr(*Exp).AST)));
  404. }
  405. SMTExprRef mkFPIsNormal(const SMTExprRef &Exp) override {
  406. return newExprRef(Z3Expr(
  407. Context, Z3_mk_fpa_is_normal(Context.Context, toZ3Expr(*Exp).AST)));
  408. }
  409. SMTExprRef mkFPIsZero(const SMTExprRef &Exp) override {
  410. return newExprRef(Z3Expr(
  411. Context, Z3_mk_fpa_is_zero(Context.Context, toZ3Expr(*Exp).AST)));
  412. }
  413. SMTExprRef mkFPMul(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  414. SMTExprRef RoundingMode = getFloatRoundingMode();
  415. return newExprRef(
  416. Z3Expr(Context,
  417. Z3_mk_fpa_mul(Context.Context, toZ3Expr(*RoundingMode).AST,
  418. toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST)));
  419. }
  420. SMTExprRef mkFPDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  421. SMTExprRef RoundingMode = getFloatRoundingMode();
  422. return newExprRef(
  423. Z3Expr(Context,
  424. Z3_mk_fpa_div(Context.Context, toZ3Expr(*RoundingMode).AST,
  425. toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST)));
  426. }
  427. SMTExprRef mkFPRem(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  428. return newExprRef(
  429. Z3Expr(Context, Z3_mk_fpa_rem(Context.Context, toZ3Expr(*LHS).AST,
  430. toZ3Expr(*RHS).AST)));
  431. }
  432. SMTExprRef mkFPAdd(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  433. SMTExprRef RoundingMode = getFloatRoundingMode();
  434. return newExprRef(
  435. Z3Expr(Context,
  436. Z3_mk_fpa_add(Context.Context, toZ3Expr(*RoundingMode).AST,
  437. toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST)));
  438. }
  439. SMTExprRef mkFPSub(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  440. SMTExprRef RoundingMode = getFloatRoundingMode();
  441. return newExprRef(
  442. Z3Expr(Context,
  443. Z3_mk_fpa_sub(Context.Context, toZ3Expr(*RoundingMode).AST,
  444. toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST)));
  445. }
  446. SMTExprRef mkFPLt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  447. return newExprRef(
  448. Z3Expr(Context, Z3_mk_fpa_lt(Context.Context, toZ3Expr(*LHS).AST,
  449. toZ3Expr(*RHS).AST)));
  450. }
  451. SMTExprRef mkFPGt(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  452. return newExprRef(
  453. Z3Expr(Context, Z3_mk_fpa_gt(Context.Context, toZ3Expr(*LHS).AST,
  454. toZ3Expr(*RHS).AST)));
  455. }
  456. SMTExprRef mkFPLe(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  457. return newExprRef(
  458. Z3Expr(Context, Z3_mk_fpa_leq(Context.Context, toZ3Expr(*LHS).AST,
  459. toZ3Expr(*RHS).AST)));
  460. }
  461. SMTExprRef mkFPGe(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  462. return newExprRef(
  463. Z3Expr(Context, Z3_mk_fpa_geq(Context.Context, toZ3Expr(*LHS).AST,
  464. toZ3Expr(*RHS).AST)));
  465. }
  466. SMTExprRef mkFPEqual(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  467. return newExprRef(
  468. Z3Expr(Context, Z3_mk_fpa_eq(Context.Context, toZ3Expr(*LHS).AST,
  469. toZ3Expr(*RHS).AST)));
  470. }
  471. SMTExprRef mkIte(const SMTExprRef &Cond, const SMTExprRef &T,
  472. const SMTExprRef &F) override {
  473. return newExprRef(
  474. Z3Expr(Context, Z3_mk_ite(Context.Context, toZ3Expr(*Cond).AST,
  475. toZ3Expr(*T).AST, toZ3Expr(*F).AST)));
  476. }
  477. SMTExprRef mkBVSignExt(unsigned i, const SMTExprRef &Exp) override {
  478. return newExprRef(Z3Expr(
  479. Context, Z3_mk_sign_ext(Context.Context, i, toZ3Expr(*Exp).AST)));
  480. }
  481. SMTExprRef mkBVZeroExt(unsigned i, const SMTExprRef &Exp) override {
  482. return newExprRef(Z3Expr(
  483. Context, Z3_mk_zero_ext(Context.Context, i, toZ3Expr(*Exp).AST)));
  484. }
  485. SMTExprRef mkBVExtract(unsigned High, unsigned Low,
  486. const SMTExprRef &Exp) override {
  487. return newExprRef(Z3Expr(Context, Z3_mk_extract(Context.Context, High, Low,
  488. toZ3Expr(*Exp).AST)));
  489. }
  490. /// Creates a predicate that checks for overflow in a bitvector addition
  491. /// operation
  492. SMTExprRef mkBVAddNoOverflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
  493. bool isSigned) override {
  494. return newExprRef(Z3Expr(
  495. Context, Z3_mk_bvadd_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
  496. toZ3Expr(*RHS).AST, isSigned)));
  497. }
  498. /// Creates a predicate that checks for underflow in a signed bitvector
  499. /// addition operation
  500. SMTExprRef mkBVAddNoUnderflow(const SMTExprRef &LHS,
  501. const SMTExprRef &RHS) override {
  502. return newExprRef(Z3Expr(
  503. Context, Z3_mk_bvadd_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
  504. toZ3Expr(*RHS).AST)));
  505. }
  506. /// Creates a predicate that checks for overflow in a signed bitvector
  507. /// subtraction operation
  508. SMTExprRef mkBVSubNoOverflow(const SMTExprRef &LHS,
  509. const SMTExprRef &RHS) override {
  510. return newExprRef(Z3Expr(
  511. Context, Z3_mk_bvsub_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
  512. toZ3Expr(*RHS).AST)));
  513. }
  514. /// Creates a predicate that checks for underflow in a bitvector subtraction
  515. /// operation
  516. SMTExprRef mkBVSubNoUnderflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
  517. bool isSigned) override {
  518. return newExprRef(Z3Expr(
  519. Context, Z3_mk_bvsub_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
  520. toZ3Expr(*RHS).AST, isSigned)));
  521. }
  522. /// Creates a predicate that checks for overflow in a signed bitvector
  523. /// division/modulus operation
  524. SMTExprRef mkBVSDivNoOverflow(const SMTExprRef &LHS,
  525. const SMTExprRef &RHS) override {
  526. return newExprRef(Z3Expr(
  527. Context, Z3_mk_bvsdiv_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
  528. toZ3Expr(*RHS).AST)));
  529. }
  530. /// Creates a predicate that checks for overflow in a bitvector negation
  531. /// operation
  532. SMTExprRef mkBVNegNoOverflow(const SMTExprRef &Exp) override {
  533. return newExprRef(Z3Expr(
  534. Context, Z3_mk_bvneg_no_overflow(Context.Context, toZ3Expr(*Exp).AST)));
  535. }
  536. /// Creates a predicate that checks for overflow in a bitvector multiplication
  537. /// operation
  538. SMTExprRef mkBVMulNoOverflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
  539. bool isSigned) override {
  540. return newExprRef(Z3Expr(
  541. Context, Z3_mk_bvmul_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
  542. toZ3Expr(*RHS).AST, isSigned)));
  543. }
  544. /// Creates a predicate that checks for underflow in a signed bitvector
  545. /// multiplication operation
  546. SMTExprRef mkBVMulNoUnderflow(const SMTExprRef &LHS,
  547. const SMTExprRef &RHS) override {
  548. return newExprRef(Z3Expr(
  549. Context, Z3_mk_bvmul_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
  550. toZ3Expr(*RHS).AST)));
  551. }
  552. SMTExprRef mkBVConcat(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
  553. return newExprRef(
  554. Z3Expr(Context, Z3_mk_concat(Context.Context, toZ3Expr(*LHS).AST,
  555. toZ3Expr(*RHS).AST)));
  556. }
  557. SMTExprRef mkFPtoFP(const SMTExprRef &From, const SMTSortRef &To) override {
  558. SMTExprRef RoundingMode = getFloatRoundingMode();
  559. return newExprRef(Z3Expr(
  560. Context,
  561. Z3_mk_fpa_to_fp_float(Context.Context, toZ3Expr(*RoundingMode).AST,
  562. toZ3Expr(*From).AST, toZ3Sort(*To).Sort)));
  563. }
  564. SMTExprRef mkSBVtoFP(const SMTExprRef &From, const SMTSortRef &To) override {
  565. SMTExprRef RoundingMode = getFloatRoundingMode();
  566. return newExprRef(Z3Expr(
  567. Context,
  568. Z3_mk_fpa_to_fp_signed(Context.Context, toZ3Expr(*RoundingMode).AST,
  569. toZ3Expr(*From).AST, toZ3Sort(*To).Sort)));
  570. }
  571. SMTExprRef mkUBVtoFP(const SMTExprRef &From, const SMTSortRef &To) override {
  572. SMTExprRef RoundingMode = getFloatRoundingMode();
  573. return newExprRef(Z3Expr(
  574. Context,
  575. Z3_mk_fpa_to_fp_unsigned(Context.Context, toZ3Expr(*RoundingMode).AST,
  576. toZ3Expr(*From).AST, toZ3Sort(*To).Sort)));
  577. }
  578. SMTExprRef mkFPtoSBV(const SMTExprRef &From, unsigned ToWidth) override {
  579. SMTExprRef RoundingMode = getFloatRoundingMode();
  580. return newExprRef(Z3Expr(
  581. Context, Z3_mk_fpa_to_sbv(Context.Context, toZ3Expr(*RoundingMode).AST,
  582. toZ3Expr(*From).AST, ToWidth)));
  583. }
  584. SMTExprRef mkFPtoUBV(const SMTExprRef &From, unsigned ToWidth) override {
  585. SMTExprRef RoundingMode = getFloatRoundingMode();
  586. return newExprRef(Z3Expr(
  587. Context, Z3_mk_fpa_to_ubv(Context.Context, toZ3Expr(*RoundingMode).AST,
  588. toZ3Expr(*From).AST, ToWidth)));
  589. }
  590. SMTExprRef mkBoolean(const bool b) override {
  591. return newExprRef(Z3Expr(Context, b ? Z3_mk_true(Context.Context)
  592. : Z3_mk_false(Context.Context)));
  593. }
  594. SMTExprRef mkBitvector(const llvm::APSInt Int, unsigned BitWidth) override {
  595. const Z3_sort Z3Sort = toZ3Sort(*getBitvectorSort(BitWidth)).Sort;
  596. // Slow path, when 64 bits are not enough.
  597. if (LLVM_UNLIKELY(Int.getBitWidth() > 64u)) {
  598. SmallString<40> Buffer;
  599. Int.toString(Buffer, 10);
  600. return newExprRef(Z3Expr(
  601. Context, Z3_mk_numeral(Context.Context, Buffer.c_str(), Z3Sort)));
  602. }
  603. const int64_t BitReprAsSigned = Int.getExtValue();
  604. const uint64_t BitReprAsUnsigned =
  605. reinterpret_cast<const uint64_t &>(BitReprAsSigned);
  606. Z3_ast Literal =
  607. Int.isSigned()
  608. ? Z3_mk_int64(Context.Context, BitReprAsSigned, Z3Sort)
  609. : Z3_mk_unsigned_int64(Context.Context, BitReprAsUnsigned, Z3Sort);
  610. return newExprRef(Z3Expr(Context, Literal));
  611. }
  612. SMTExprRef mkFloat(const llvm::APFloat Float) override {
  613. SMTSortRef Sort =
  614. getFloatSort(llvm::APFloat::semanticsSizeInBits(Float.getSemantics()));
  615. llvm::APSInt Int = llvm::APSInt(Float.bitcastToAPInt(), false);
  616. SMTExprRef Z3Int = mkBitvector(Int, Int.getBitWidth());
  617. return newExprRef(Z3Expr(
  618. Context, Z3_mk_fpa_to_fp_bv(Context.Context, toZ3Expr(*Z3Int).AST,
  619. toZ3Sort(*Sort).Sort)));
  620. }
  621. SMTExprRef mkSymbol(const char *Name, SMTSortRef Sort) override {
  622. return newExprRef(
  623. Z3Expr(Context, Z3_mk_const(Context.Context,
  624. Z3_mk_string_symbol(Context.Context, Name),
  625. toZ3Sort(*Sort).Sort)));
  626. }
  627. llvm::APSInt getBitvector(const SMTExprRef &Exp, unsigned BitWidth,
  628. bool isUnsigned) override {
  629. return llvm::APSInt(
  630. llvm::APInt(BitWidth,
  631. Z3_get_numeral_string(Context.Context, toZ3Expr(*Exp).AST),
  632. 10),
  633. isUnsigned);
  634. }
  635. bool getBoolean(const SMTExprRef &Exp) override {
  636. return Z3_get_bool_value(Context.Context, toZ3Expr(*Exp).AST) == Z3_L_TRUE;
  637. }
  638. SMTExprRef getFloatRoundingMode() override {
  639. // TODO: Don't assume nearest ties to even rounding mode
  640. return newExprRef(Z3Expr(Context, Z3_mk_fpa_rne(Context.Context)));
  641. }
  642. bool toAPFloat(const SMTSortRef &Sort, const SMTExprRef &AST,
  643. llvm::APFloat &Float, bool useSemantics) {
  644. assert(Sort->isFloatSort() && "Unsupported sort to floating-point!");
  645. llvm::APSInt Int(Sort->getFloatSortSize(), true);
  646. const llvm::fltSemantics &Semantics =
  647. getFloatSemantics(Sort->getFloatSortSize());
  648. SMTSortRef BVSort = getBitvectorSort(Sort->getFloatSortSize());
  649. if (!toAPSInt(BVSort, AST, Int, true)) {
  650. return false;
  651. }
  652. if (useSemantics && !areEquivalent(Float.getSemantics(), Semantics)) {
  653. assert(false && "Floating-point types don't match!");
  654. return false;
  655. }
  656. Float = llvm::APFloat(Semantics, Int);
  657. return true;
  658. }
  659. bool toAPSInt(const SMTSortRef &Sort, const SMTExprRef &AST,
  660. llvm::APSInt &Int, bool useSemantics) {
  661. if (Sort->isBitvectorSort()) {
  662. if (useSemantics && Int.getBitWidth() != Sort->getBitvectorSortSize()) {
  663. assert(false && "Bitvector types don't match!");
  664. return false;
  665. }
  666. // FIXME: This function is also used to retrieve floating-point values,
  667. // which can be 16, 32, 64 or 128 bits long. Bitvectors can be anything
  668. // between 1 and 64 bits long, which is the reason we have this weird
  669. // guard. In the future, we need proper calls in the backend to retrieve
  670. // floating-points and its special values (NaN, +/-infinity, +/-zero),
  671. // then we can drop this weird condition.
  672. if (Sort->getBitvectorSortSize() <= 64 ||
  673. Sort->getBitvectorSortSize() == 128) {
  674. Int = getBitvector(AST, Int.getBitWidth(), Int.isUnsigned());
  675. return true;
  676. }
  677. assert(false && "Bitwidth not supported!");
  678. return false;
  679. }
  680. if (Sort->isBooleanSort()) {
  681. if (useSemantics && Int.getBitWidth() < 1) {
  682. assert(false && "Boolean type doesn't match!");
  683. return false;
  684. }
  685. Int = llvm::APSInt(llvm::APInt(Int.getBitWidth(), getBoolean(AST)),
  686. Int.isUnsigned());
  687. return true;
  688. }
  689. llvm_unreachable("Unsupported sort to integer!");
  690. }
  691. bool getInterpretation(const SMTExprRef &Exp, llvm::APSInt &Int) override {
  692. Z3Model Model(Context, Z3_solver_get_model(Context.Context, Solver));
  693. Z3_func_decl Func = Z3_get_app_decl(
  694. Context.Context, Z3_to_app(Context.Context, toZ3Expr(*Exp).AST));
  695. if (Z3_model_has_interp(Context.Context, Model.Model, Func) != Z3_L_TRUE)
  696. return false;
  697. SMTExprRef Assign = newExprRef(
  698. Z3Expr(Context,
  699. Z3_model_get_const_interp(Context.Context, Model.Model, Func)));
  700. SMTSortRef Sort = getSort(Assign);
  701. return toAPSInt(Sort, Assign, Int, true);
  702. }
  703. bool getInterpretation(const SMTExprRef &Exp, llvm::APFloat &Float) override {
  704. Z3Model Model(Context, Z3_solver_get_model(Context.Context, Solver));
  705. Z3_func_decl Func = Z3_get_app_decl(
  706. Context.Context, Z3_to_app(Context.Context, toZ3Expr(*Exp).AST));
  707. if (Z3_model_has_interp(Context.Context, Model.Model, Func) != Z3_L_TRUE)
  708. return false;
  709. SMTExprRef Assign = newExprRef(
  710. Z3Expr(Context,
  711. Z3_model_get_const_interp(Context.Context, Model.Model, Func)));
  712. SMTSortRef Sort = getSort(Assign);
  713. return toAPFloat(Sort, Assign, Float, true);
  714. }
  715. Optional<bool> check() const override {
  716. Z3_lbool res = Z3_solver_check(Context.Context, Solver);
  717. if (res == Z3_L_TRUE)
  718. return true;
  719. if (res == Z3_L_FALSE)
  720. return false;
  721. return Optional<bool>();
  722. }
  723. void push() override { return Z3_solver_push(Context.Context, Solver); }
  724. void pop(unsigned NumStates = 1) override {
  725. assert(Z3_solver_get_num_scopes(Context.Context, Solver) >= NumStates);
  726. return Z3_solver_pop(Context.Context, Solver, NumStates);
  727. }
  728. bool isFPSupported() override { return true; }
  729. /// Reset the solver and remove all constraints.
  730. void reset() override { Z3_solver_reset(Context.Context, Solver); }
  731. void print(raw_ostream &OS) const override {
  732. OS << Z3_solver_to_string(Context.Context, Solver);
  733. }
  734. }; // end class Z3Solver
  735. } // end anonymous namespace
  736. #endif
  737. llvm::SMTSolverRef llvm::CreateZ3Solver() {
  738. #if LLVM_WITH_Z3
  739. return std::make_unique<Z3Solver>();
  740. #else
  741. llvm::report_fatal_error("LLVM was not compiled with Z3 support, rebuild "
  742. "with -DLLVM_ENABLE_Z3_SOLVER=ON",
  743. false);
  744. return nullptr;
  745. #endif
  746. }
  747. LLVM_DUMP_METHOD void SMTSort::dump() const { print(llvm::errs()); }
  748. LLVM_DUMP_METHOD void SMTExpr::dump() const { print(llvm::errs()); }
  749. LLVM_DUMP_METHOD void SMTSolver::dump() const { print(llvm::errs()); }