diff options
author | Dan Liew <daniel.liew@imperial.ac.uk> | 2016-04-11 08:19:02 -0500 |
---|---|---|
committer | Dan Liew <daniel.liew@imperial.ac.uk> | 2016-09-15 13:09:43 +0100 |
commit | d34a946acb7f5155ee62f1bdc95ae7ef7b848e49 (patch) | |
tree | 39e700b83f73e05223adf1727339f39119b4869a | |
parent | 746c25599f75088c3b4d02fe51e4240b0079781c (diff) | |
download | klee-d34a946acb7f5155ee62f1bdc95ae7ef7b848e49.tar.gz |
Add ``-debug-cross-check-core-solver`` option to allow cross-checking
with another solver. For example the core solver can be STP and the cross checking solver can be Z3. Unfortunately a few fragile tests don't pass when actually using this option.
-rw-r--r-- | include/klee/CommandLine.h | 10 | ||||
-rw-r--r-- | lib/Basic/CmdLineOptions.cpp | 13 | ||||
-rw-r--r-- | lib/Basic/ConstructSolverChain.cpp | 4 | ||||
-rw-r--r-- | lib/Solver/CoreSolver.cpp | 4 |
4 files changed, 30 insertions, 1 deletions
diff --git a/include/klee/CommandLine.h b/include/klee/CommandLine.h index 00cdeebb..dc69de6e 100644 --- a/include/klee/CommandLine.h +++ b/include/klee/CommandLine.h @@ -44,9 +44,17 @@ enum QueryLoggingSolverType */ extern llvm::cl::list<QueryLoggingSolverType> queryLoggingOptions; -enum CoreSolverType { STP_SOLVER, METASMT_SOLVER, DUMMY_SOLVER, Z3_SOLVER }; +enum CoreSolverType { + STP_SOLVER, + METASMT_SOLVER, + DUMMY_SOLVER, + Z3_SOLVER, + NO_SOLVER +}; extern llvm::cl::opt<CoreSolverType> CoreSolverToUse; +extern llvm::cl::opt<CoreSolverType> DebugCrossCheckCoreSolverWith; + #ifdef ENABLE_METASMT enum MetaSMTBackendType diff --git a/lib/Basic/CmdLineOptions.cpp b/lib/Basic/CmdLineOptions.cpp index 20c190a5..70ef999e 100644 --- a/lib/Basic/CmdLineOptions.cpp +++ b/lib/Basic/CmdLineOptions.cpp @@ -139,6 +139,19 @@ llvm::cl::opt<CoreSolverType> CoreSolverToUse( clEnumValN(Z3_SOLVER, "z3", "Z3" Z3_IS_DEFAULT_STR), clEnumValEnd), llvm::cl::init(DEFAULT_CORE_SOLVER)); + +llvm::cl::opt<CoreSolverType> DebugCrossCheckCoreSolverWith( + "debug-cross-check-core-solver", + llvm::cl::desc( + "Specifiy a solver to use for cross checking with the core solver"), + llvm::cl::values(clEnumValN(STP_SOLVER, "stp", "stp"), + clEnumValN(METASMT_SOLVER, "metasmt", "metaSMT"), + clEnumValN(DUMMY_SOLVER, "dummy", "Dummy solver"), + clEnumValN(Z3_SOLVER, "z3", "Z3"), + clEnumValN(NO_SOLVER, "none", + "Do not cross check (default)"), + clEnumValEnd), + llvm::cl::init(NO_SOLVER)); } #undef STP_IS_DEFAULT_STR #undef METASMT_IS_DEFAULT_STR diff --git a/lib/Basic/ConstructSolverChain.cpp b/lib/Basic/ConstructSolverChain.cpp index b48c5cb0..2df87d51 100644 --- a/lib/Basic/ConstructSolverChain.cpp +++ b/lib/Basic/ConstructSolverChain.cpp @@ -62,6 +62,10 @@ Solver *constructSolverChain(Solver *coreSolver, std::string querySMT2LogPath, llvm::errs() << "Logging all queries in .smt2 format to " << querySMT2LogPath.c_str() << "\n"; } + if (DebugCrossCheckCoreSolverWith != NO_SOLVER) { + Solver *oracleSolver = createCoreSolver(DebugCrossCheckCoreSolverWith); + solver = createValidatingSolver(/*s=*/solver, /*oracle=*/oracleSolver); + } return solver; } diff --git a/lib/Solver/CoreSolver.cpp b/lib/Solver/CoreSolver.cpp index 66328f30..783047f8 100644 --- a/lib/Solver/CoreSolver.cpp +++ b/lib/Solver/CoreSolver.cpp @@ -83,11 +83,15 @@ Solver *createCoreSolver(CoreSolverType cst) { return createDummySolver(); case Z3_SOLVER: #ifdef ENABLE_Z3 + llvm::errs() << "Using Z3 solver backend\n"; return new Z3Solver(); #else llvm::errs() << "Not compiled with Z3 support\n"; return NULL; #endif + case NO_SOLVER: + llvm::errs() << "Invalid solver\n"; + return NULL; default: llvm_unreachable("Unsupported CoreSolverType"); } |