quebex

A software analysis framework built around the QBE intermediate language

git clone https://git.8pit.net/quebex.git

 1-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>
 2--
 3-- SPDX-License-Identifier: MIT AND GPL-3.0-only
 4
 5module Exec (execBench) where
 6
 7import Control.Monad (void)
 8import Criterion.Main (Benchmark, Benchmarkable, bench, bgroup, nfIO)
 9import Data.Word (Word64, Word8)
10import Language.QBE (parseAndFind)
11import Language.QBE.Simulator (execFunc)
12import Language.QBE.Simulator.Concolic.Expression qualified as CE
13import Language.QBE.Simulator.Default.Expression qualified as DE
14import Language.QBE.Simulator.Default.State (SimState, mkEnv, run)
15import Language.QBE.Simulator.Expression qualified as E
16import Language.QBE.Types qualified as QBE
17
18exec :: [CE.Concolic DE.RegVal] -> String -> IO ()
19exec params input = do
20  (prog, func) <- parseAndFind entryFunc input
21
22  env <- mkEnv prog 0 1024
23  void $ run env (execFunc func params :: SimState (CE.Concolic DE.RegVal) (CE.Concolic Word8) (Maybe (CE.Concolic DE.RegVal)))
24  where
25    entryFunc :: QBE.GlobalIdent
26    entryFunc = QBE.GlobalIdent "entry"
27
28------------------------------------------------------------------------
29
30bubbleSort :: Word64 -> Benchmarkable
31bubbleSort inputSize =
32  nfIO (readFile "bench/data/Exec/bubble-sort.qbe" >>= exec [E.fromLit (QBE.Base QBE.Word) inputSize])
33
34execBench :: Benchmark
35execBench =
36  bgroup
37    "Concrete Execution"
38    [ bench "10" $ bubbleSort 25,
39      bench "50" $ bubbleSort 50,
40      bench "100" $ bubbleSort 100
41    ]