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