summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/Z3Solver.cpp
diff options
context:
space:
mode:
authorMikhail R. Gadelha <mikhail.ramalho@gmail.com>2019-03-27 16:54:12 +0000
committerMikhail R. Gadelha <mikhail.ramalho@gmail.com>2019-03-27 16:54:12 +0000
commitf5f8d27d39126a4aa893fb32d7e5952cd8ca504b (patch)
treea25ada8956b11d51c4e4702ed871737dc42bb534 /llvm/lib/Support/Z3Solver.cpp
parentb19361243bf398ff3d4c6c94c431904cb98ce94f (diff)
downloadbcm5719-llvm-f5f8d27d39126a4aa893fb32d7e5952cd8ca504b.tar.gz
bcm5719-llvm-f5f8d27d39126a4aa893fb32d7e5952cd8ca504b.zip
New methods to check for under-/overflow in the SMT API
Summary: Added methods to check for under-/overflow in additions, subtractions, signed divisions/modulus, negations, and multiplications. Reviewers: ddcc, gou4shi1 Reviewed By: ddcc, gou4shi1 Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59796 llvm-svn: 357088
Diffstat (limited to 'llvm/lib/Support/Z3Solver.cpp')
-rw-r--r--llvm/lib/Support/Z3Solver.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/llvm/lib/Support/Z3Solver.cpp b/llvm/lib/Support/Z3Solver.cpp
index 5e40831db9e..f1a6fdf87cf 100644
--- a/llvm/lib/Support/Z3Solver.cpp
+++ b/llvm/lib/Support/Z3Solver.cpp
@@ -603,6 +603,76 @@ public:
toZ3Expr(*Exp).AST)));
}
+ /// Creates a predicate that checks for overflow in a bitvector addition
+ /// operation
+ SMTExprRef mkBVAddNoOverflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
+ bool isSigned) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvadd_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST, isSigned)));
+ }
+
+ /// Creates a predicate that checks for underflow in a signed bitvector
+ /// addition operation
+ SMTExprRef mkBVAddNoUnderflow(const SMTExprRef &LHS,
+ const SMTExprRef &RHS) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvadd_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST)));
+ }
+
+ /// Creates a predicate that checks for overflow in a signed bitvector
+ /// subtraction operation
+ SMTExprRef mkBVSubNoOverflow(const SMTExprRef &LHS,
+ const SMTExprRef &RHS) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvsub_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST)));
+ }
+
+ /// Creates a predicate that checks for underflow in a bitvector subtraction
+ /// operation
+ SMTExprRef mkBVSubNoUnderflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
+ bool isSigned) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvsub_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST, isSigned)));
+ }
+
+ /// Creates a predicate that checks for overflow in a signed bitvector
+ /// division/modulus operation
+ SMTExprRef mkBVSDivNoOverflow(const SMTExprRef &LHS,
+ const SMTExprRef &RHS) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvsdiv_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST)));
+ }
+
+ /// Creates a predicate that checks for overflow in a bitvector negation
+ /// operation
+ SMTExprRef mkBVNegNoOverflow(const SMTExprRef &Exp) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvneg_no_overflow(Context.Context, toZ3Expr(*Exp).AST)));
+ }
+
+ /// Creates a predicate that checks for overflow in a bitvector multiplication
+ /// operation
+ SMTExprRef mkBVMulNoOverflow(const SMTExprRef &LHS, const SMTExprRef &RHS,
+ bool isSigned) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvmul_no_overflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST, isSigned)));
+ }
+
+ /// Creates a predicate that checks for underflow in a signed bitvector
+ /// multiplication operation
+ SMTExprRef mkBVMulNoUnderflow(const SMTExprRef &LHS,
+ const SMTExprRef &RHS) override {
+ return newExprRef(Z3Expr(
+ Context, Z3_mk_bvmul_no_underflow(Context.Context, toZ3Expr(*LHS).AST,
+ toZ3Expr(*RHS).AST)));
+ }
+
SMTExprRef mkBVConcat(const SMTExprRef &LHS, const SMTExprRef &RHS) override {
return newExprRef(
Z3Expr(Context, Z3_mk_concat(Context.Context, toZ3Expr(*LHS).AST,
OpenPOWER on IntegriCloud