diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Basic/CmdLineOptions.cpp | 13 | ||||
-rw-r--r-- | lib/Basic/ConstructSolverChain.cpp | 102 | ||||
-rw-r--r-- | lib/Module/KModule.cpp | 4 | ||||
-rw-r--r-- | lib/Module/Optimize.cpp | 5 | ||||
-rw-r--r-- | lib/Solver/CoreSolver.cpp | 4 |
5 files changed, 68 insertions, 60 deletions
diff --git a/lib/Basic/CmdLineOptions.cpp b/lib/Basic/CmdLineOptions.cpp index 20c190a5..399c27a2 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-crosscheck-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 59790551..2df87d51 100644 --- a/lib/Basic/ConstructSolverChain.cpp +++ b/lib/Basic/ConstructSolverChain.cpp @@ -1,4 +1,4 @@ -//===-- ConstructSolverChain.cpp ------------------------------------------------*- C++ -*-===// +//===-- ConstructSolverChain.cpp ------------------------------------++ -*-===// // // The KLEE Symbolic Virtual Machine // @@ -14,69 +14,59 @@ #include "klee/CommandLine.h" #include "llvm/Support/raw_ostream.h" -namespace klee -{ - Solver *constructSolverChain(Solver *coreSolver, - std::string querySMT2LogPath, - std::string baseSolverQuerySMT2LogPath, - std::string queryPCLogPath, - std::string baseSolverQueryPCLogPath) - { - Solver *solver = coreSolver; +namespace klee { +Solver *constructSolverChain(Solver *coreSolver, std::string querySMT2LogPath, + std::string baseSolverQuerySMT2LogPath, + std::string queryPCLogPath, + std::string baseSolverQueryPCLogPath) { + Solver *solver = coreSolver; - if (optionIsSet(queryLoggingOptions, SOLVER_PC)) - { - solver = createPCLoggingSolver(solver, - baseSolverQueryPCLogPath, - MinQueryTimeToLog); - llvm::errs() << "Logging queries that reach solver in .pc format to " - << baseSolverQueryPCLogPath.c_str() << "\n"; - } + if (optionIsSet(queryLoggingOptions, SOLVER_PC)) { + solver = createPCLoggingSolver(solver, baseSolverQueryPCLogPath, + MinQueryTimeToLog); + llvm::errs() << "Logging queries that reach solver in .pc format to " + << baseSolverQueryPCLogPath.c_str() << "\n"; + } - if (optionIsSet(queryLoggingOptions, SOLVER_SMTLIB)) - { - solver = createSMTLIBLoggingSolver(solver, - baseSolverQuerySMT2LogPath, - MinQueryTimeToLog); - llvm::errs() << "Logging queries that reach solver in .smt2 format to " - << baseSolverQuerySMT2LogPath.c_str() << "\n"; - } + if (optionIsSet(queryLoggingOptions, SOLVER_SMTLIB)) { + solver = createSMTLIBLoggingSolver(solver, baseSolverQuerySMT2LogPath, + MinQueryTimeToLog); + llvm::errs() << "Logging queries that reach solver in .smt2 format to " + << baseSolverQuerySMT2LogPath.c_str() << "\n"; + } - if (UseFastCexSolver) - solver = createFastCexSolver(solver); + if (UseFastCexSolver) + solver = createFastCexSolver(solver); - if (UseCexCache) - solver = createCexCachingSolver(solver); + if (UseCexCache) + solver = createCexCachingSolver(solver); - if (UseCache) - solver = createCachingSolver(solver); + if (UseCache) + solver = createCachingSolver(solver); - if (UseIndependentSolver) - solver = createIndependentSolver(solver); + if (UseIndependentSolver) + solver = createIndependentSolver(solver); - if (DebugValidateSolver) - solver = createValidatingSolver(solver, coreSolver); + if (DebugValidateSolver) + solver = createValidatingSolver(solver, coreSolver); - if (optionIsSet(queryLoggingOptions, ALL_PC)) - { - solver = createPCLoggingSolver(solver, - queryPCLogPath, - MinQueryTimeToLog); - llvm::errs() << "Logging all queries in .pc format to " - << queryPCLogPath.c_str() << "\n"; - } + if (optionIsSet(queryLoggingOptions, ALL_PC)) { + solver = createPCLoggingSolver(solver, queryPCLogPath, MinQueryTimeToLog); + llvm::errs() << "Logging all queries in .pc format to " + << queryPCLogPath.c_str() << "\n"; + } - if (optionIsSet(queryLoggingOptions, ALL_SMTLIB)) - { - solver = createSMTLIBLoggingSolver(solver,querySMT2LogPath, - MinQueryTimeToLog); - llvm::errs() << "Logging all queries in .smt2 format to " - << querySMT2LogPath.c_str() << "\n"; - } - - return solver; - } + if (optionIsSet(queryLoggingOptions, ALL_SMTLIB)) { + solver = + createSMTLIBLoggingSolver(solver, querySMT2LogPath, MinQueryTimeToLog); + 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/Module/KModule.cpp b/lib/Module/KModule.cpp index 01165e94..57346a31 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -132,7 +132,7 @@ KModule::~KModule() { /***/ namespace llvm { -extern void Optimize(Module*); +extern void Optimize(Module *, const std::string &EntryPoint); } // what a hack @@ -308,7 +308,7 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, pm.run(*module); if (opts.Optimize) - Optimize(module); + Optimize(module, opts.EntryPoint); #if LLVM_VERSION_CODE < LLVM_VERSION(3, 3) // Force importing functions required by intrinsic lowering. Kind of // unfortunate clutter when we don't need them but we won't know diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp index ce43cd96..3d9c8cc1 100644 --- a/lib/Module/Optimize.cpp +++ b/lib/Module/Optimize.cpp @@ -163,7 +163,7 @@ static void AddStandardCompilePasses(PassManager &PM) { /// Optimize - Perform link time optimizations. This will run the scalar /// optimizations, any loaded plugin-optimization modules, and then the /// inter-procedural optimizations if applicable. -void Optimize(Module* M) { +void Optimize(Module *M, const std::string &EntryPoint) { // Instantiate the pass manager to organize the passes. PassManager Passes; @@ -192,7 +192,8 @@ void Optimize(Module* M) { // internal. if (!DisableInternalize) { #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 2) - ModulePass *pass = createInternalizePass(std::vector<const char *>(1, "main")); + ModulePass *pass = createInternalizePass( + std::vector<const char *>(1, EntryPoint.c_str())); #else ModulePass *pass = createInternalizePass(true); #endif 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"); } |