@@ -199,6 +199,14 @@ def get_args():
199199 "solvers in the canonical list (Z3, BITWUZLA, CVC5)"
200200 ),
201201 },
202+ {
203+ "flags" : ["--default-solver-only" ],
204+ "action" : "store_true" ,
205+ "help" : (
206+ "for each harness, run only the solver named by its "
207+ "CBMC_DEFAULT_SOLVER. Cannot be combined with --solver."
208+ ),
209+ },
202210 ]:
203211 flags = arg .pop ("flags" )
204212 pars .add_argument (* flags , ** arg )
@@ -361,6 +369,25 @@ def read_solver_matrix(proof_dir):
361369 return out
362370
363371
372+ def read_default_solver (proof_dir ):
373+ """Return CBMC_DEFAULT_SOLVER for a per-harness Makefile."""
374+ cmd = ["make" , "--no-print-directory" , "echo-default-solver" ]
375+ proc = subprocess .run (
376+ cmd ,
377+ cwd = proof_dir ,
378+ universal_newlines = True ,
379+ stdout = subprocess .PIPE ,
380+ stderr = subprocess .PIPE ,
381+ check = False ,
382+ )
383+ if proc .returncode :
384+ logging .critical (
385+ "Could not read default solver from %s: %s" , proof_dir , proc .stderr
386+ )
387+ sys .exit (1 )
388+ return proc .stdout .strip ()
389+
390+
364391def read_proof_uid (proof_dir ):
365392 """Read PROOF_UID from a per-harness Makefile."""
366393 with (pathlib .Path (proof_dir ) / "Makefile" ).open () as handle :
@@ -542,6 +569,10 @@ async def main(): # pylint: disable=too-many-locals
542569 logging .critical ("No proof directories found" )
543570 sys .exit (1 )
544571
572+ if args .default_solver_only and args .solver :
573+ logging .critical ("--default-solver-only and --solver are mutually exclusive" )
574+ sys .exit (1 )
575+
545576 selected_solvers = args .solver if args .solver else list (ALL_SOLVERS )
546577 for s in selected_solvers :
547578 if s not in ALL_SOLVERS :
@@ -552,14 +583,21 @@ async def main(): # pylint: disable=too-many-locals
552583
553584 # Enforce PROOF_UID uniqueness up-front, then expand each proof
554585 # directory into the Cartesian product with its solver matrix.
586+ # When --default-solver-only is given, the per-harness solver list
587+ # collapses to {CBMC_DEFAULT_SOLVER}; otherwise every solver in
588+ # selected_solvers that the matrix declares enabled is used.
555589 proof_uids = {}
556590 pairs_to_run = [] # (proof_dir, solver)
557591 omitted_pairs = [] # (proof_uid, solver)
558592 for proof_dir in proof_dirs :
559593 check_uid_uniqueness (proof_dir , proof_uids )
560594 proof_uid = read_proof_uid (proof_dir )
561595 matrix = read_solver_matrix (proof_dir )
562- for solver in selected_solvers :
596+ if args .default_solver_only :
597+ per_harness_solvers = [read_default_solver (proof_dir )]
598+ else :
599+ per_harness_solvers = selected_solvers
600+ for solver in per_harness_solvers :
563601 if matrix .get (solver ):
564602 pairs_to_run .append ((proof_dir , solver ))
565603 else :
0 commit comments