1-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>2--3-- SPDX-License-Identifier: GPL-3.0-only45module Util where67import Data.Bifunctor (second)8import Data.Word (Word64)9import Language.QBE (parseAndFind)10import Language.QBE.Backend.Store qualified as ST11import Language.QBE.Backend.Tracer qualified as ST12import Language.QBE.Backend.Tracer qualified as T13import Language.QBE.Simulator (execFunc)14import Language.QBE.Simulator.Concolic.Expression qualified as CE15import Language.QBE.Simulator.Concolic.State (mkEnv, run)16import Language.QBE.Simulator.Default.Expression qualified as DE17import Language.QBE.Simulator.Explorer (defSolver, explore, newEngine)18import Language.QBE.Simulator.Expression qualified as E19import Language.QBE.Simulator.Symbolic.Expression qualified as SE20import Language.QBE.Types qualified as QBE21import SimpleBV qualified as SMT2223parseAndExec :: QBE.GlobalIdent -> [CE.Concolic DE.RegVal] -> String -> IO ST.ExecTrace24parseAndExec funcName params input = do25 (prog, entry) <- parseAndFind funcName input2627 env <- mkEnv prog 0 128 Nothing28 fst <$> run env (execFunc entry params)2930unconstrained :: SMT.Solver -> Word64 -> String -> QBE.BaseType -> IO (CE.Concolic DE.RegVal)31unconstrained solver initCon name ty = do32 let symbolic = SE.symbolic name (QBE.Base ty)33 -- XXX: This is a hack, normally the Store does this for us.34 _ <- SMT.declareBV solver name $ SE.bitSize symbolic3536 let concrete = E.fromLit (QBE.Base ty) initCon37 pure $ CE.Concolic concrete (Just symbolic)3839explore' :: String -> String -> [(String, QBE.BaseType)] -> IO [(ST.Assign, T.ExecTrace)]40explore' input funcName params = do41 (prog, entry) <- parseAndFind (QBE.GlobalIdent funcName) input4243 engine <- newEngine <$> defSolver44 defEnv <- mkEnv prog 0 128 Nothing45 explore engine defEnv entry $46 map (second QBE.Base) params