qute

A software analysis framework built around the QBE intermediate language

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

 1-- SPDX-FileCopyrightText: 2025 Sören Tempel <soeren+git@soeren-tempel.net>
 2--
 3-- SPDX-License-Identifier: GPL-3.0-only
 4
 5module Language.QBE.Simulator.Default.Funcs (lookupSimFunc) where
 6
 7import Control.Monad.Error.Class (throwError)
 8import Control.Monad.IO.Class (MonadIO, liftIO)
 9import Language.QBE.Simulator.Error (EvalError (FuncArgsMismatch))
10import Language.QBE.Simulator.Expression qualified as E
11import Language.QBE.Simulator.State (Simulator, readNullArray, toAddress)
12import Language.QBE.Types qualified as QBE
13
14puts :: (MonadIO m, E.ValueRepr v, Simulator m v) => QBE.GlobalIdent -> [v] -> m (Maybe v)
15puts _ [strPtr] = do
16  bytes <- toAddress strPtr >>= readNullArray
17  liftIO $ putStrLn (E.toString bytes)
18  pure (Just $ E.fromLit (QBE.Base QBE.Word) 0)
19puts ident _ = throwError $ FuncArgsMismatch ident
20
21------------------------------------------------------------------------
22
23-- TODO: Register functions dynamically.
24lookupSimFunc ::
25  (MonadIO m, E.ValueRepr v, Simulator m v) =>
26  QBE.GlobalIdent ->
27  Maybe ([v] -> m (Maybe v))
28lookupSimFunc i@(QBE.GlobalIdent "puts") = Just (puts i)
29lookupSimFunc _ = Nothing