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.Error (EvalError (..)) where
 6
 7import Control.Monad.Catch (Exception)
 8import Language.QBE.Simulator.Memory (Address, showAddr)
 9import Language.QBE.Types qualified as QBE
10
11-- TODO: Differentiate different typing errors.
12data EvalError
13  = TypingError
14  | UnknownVariable String
15  | EmptyStack
16  | EncounteredHalt
17  | InvalidReturnValue
18  | UnknownBlock QBE.BlockIdent
19  | InvalidMemoryLoad
20  | UnknownFunction QBE.GlobalIdent
21  | UnknownFunctionAddr Address
22  | MissingFunctionReturn
23  | FunctionReturnIgnored
24  | AssignedVoidReturnValue
25  | InvaldSubWordExtension
26  | InvalidAddressType
27  | OverlappingBlit Address Address
28  | FuncArgsMismatch QBE.GlobalIdent
29  | InvalidPhiPosition
30  | MemoryError String
31  | -- | Terminate execution path in symbolic execution.
32    TerminatePath
33  deriving (Eq)
34
35instance Show EvalError where
36  show TypingError = "TypingError"
37  show (UnknownVariable s) = "UnknownVariable: '" ++ show s ++ "'"
38  show EmptyStack = "EmptyStack"
39  show EncounteredHalt = "EncounteredHalt"
40  show InvalidReturnValue = "InvalidReturnValue"
41  show (UnknownBlock block) = "UnknownBlock: '" ++ show block ++ "'"
42  show InvalidMemoryLoad = "InvalidMemoryLoad"
43  show (UnknownFunction ident) = "UnknownFunction: '" ++ show ident ++ "'"
44  show (UnknownFunctionAddr addr) = "UnknownFunctionAddr: '" ++ showAddr addr ++ "'"
45  show MissingFunctionReturn = "MissingFunctionReturn"
46  show FunctionReturnIgnored = "FunctionReturnIgnored"
47  show AssignedVoidReturnValue = "AssignedVoidReturnValue"
48  show InvaldSubWordExtension = "InvaldSubWordExtension"
49  show InvalidAddressType = "InvalidAddressType"
50  show (OverlappingBlit a1 a2) = "Addresses for Blit instruction overlap: " ++ show a1 ++ " and " ++ show a2
51  show (FuncArgsMismatch ident) = "FuncArgsMismatch: '" ++ show ident ++ "'"
52  show InvalidPhiPosition = "InvalidPhiPosition"
53  show (MemoryError msg) = "MemoryError: " ++ show msg
54  show TerminatePath = "TerminatePath"
55
56instance Exception EvalError