module CodeGen.LLVMIR where
import Data.Generics.Labels
import Data.Int (Int64)
import Data.Text (Text)
import GHC.Generics (Generic)
import Types (VID, Name)
import Util.SourceLoc qualified as SL
import Formatting
import Control.Lens (use, uses, view, (%=), (%~), (&), (+=), (.=), (.~), (^.), _1, _2, _3)
import qualified Data.Text as Text
newtype Label = Label Int
instance Show Label where
show :: Label -> String
show (Label Int
t) = Format String (Int -> String) -> Int -> String
forall a. Format String a -> a
formatToString (Format (Int -> String) (Int -> String)
"l" Format (Int -> String) (Int -> String)
-> Format String (Int -> String) -> Format String (Int -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Int -> String)
forall a r. Integral a => Format r (a -> r)
int) Int
t
data Module = Module
{ Module -> [Declare]
declares :: ![Declare],
Module -> [Global]
globals :: ![Global],
Module -> [Function]
functions :: ![Function]
}
instance Show Module where
show :: Module -> String
show (Module [Declare]
declares [Global]
globals [Function]
functions) = Format String ([Declare] -> [Global] -> [Function] -> String)
-> [Declare] -> [Global] -> [Function] -> String
forall a. Format String a -> a
formatToString (Text
-> Format Builder (Declare -> Builder)
-> Format
([Global] -> [Function] -> String)
([Declare] -> [Global] -> [Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Declare -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format
([Global] -> [Function] -> String)
([Declare] -> [Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
-> Format String ([Declare] -> [Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
([Global] -> [Function] -> String)
([Global] -> [Function] -> String)
"\n" Format
([Global] -> [Function] -> String)
([Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Global -> Builder)
-> Format ([Function] -> String) ([Global] -> [Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Global -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format ([Function] -> String) ([Global] -> [Function] -> String)
-> Format String ([Function] -> String)
-> Format String ([Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Function] -> String) ([Function] -> String)
"\n" Format ([Function] -> String) ([Function] -> String)
-> Format String ([Function] -> String)
-> Format String ([Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Function -> Builder)
-> Format String ([Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Function -> Builder)
forall a r. Show a => Format r (a -> r)
shown) [Declare]
declares [Global]
globals [Function]
functions
data Global = Global
{ Global -> Text
name :: !Text,
Global -> Type
tpe :: !Type
}
instance Show Global where
show :: Global -> String
show (Global Text
name Type
tpe) = Format String (Text -> Type -> String) -> Text -> Type -> String
forall a. Format String a -> a
formatToString (Format (Text -> Type -> String) (Text -> Type -> String)
"@" Format (Text -> Type -> String) (Text -> Type -> String)
-> Format String (Text -> Type -> String)
-> Format String (Text -> Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> String) (Text -> Type -> String)
forall r. Format r (Text -> r)
stext Format (Type -> String) (Text -> Type -> String)
-> Format String (Type -> String)
-> Format String (Text -> Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> String) (Type -> String)
"=" Format (Type -> String) (Type -> String)
-> Format String (Type -> String) -> Format String (Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> String) (Type -> String)
"global" Format (Type -> String) (Type -> String)
-> Format String (Type -> String) -> Format String (Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Type -> String)
forall a r. Show a => Format r (a -> r)
shown) Text
name Type
tpe
newtype Declare = Declare
{ Declare -> Text
name :: Text }
instance Show Declare where
show :: Declare -> String
show (Declare Text
name) = Format String (Text -> String) -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Text -> String)
"declare void @" Format (Text -> String) (Text -> String)
-> Format String (Text -> String) -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Text -> String)
forall r. Format r (Text -> r)
stext Format String (Text -> String)
-> Format String String -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"()") Text
name
data Function = Function
{ Function -> Text
name :: !Text,
Function -> Type
returnType :: !Type,
Function -> [Argument]
arguments :: ![Argument],
Function -> [BasicBlock]
basicBlocks :: ![BasicBlock]
}
instance Show Function where
show :: Function -> String
show (Function Text
name Type
ret [Argument]
args [BasicBlock]
bbs) =
Format
String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Type -> Text -> [Argument] -> [BasicBlock] -> String
forall a. Format String a -> a
formatToString
(Format
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
"define" Format
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format
String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format
String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Text -> [Argument] -> [BasicBlock] -> String)
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Text -> [Argument] -> [BasicBlock] -> String)
(Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
-> Format
String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Text -> [Argument] -> [BasicBlock] -> String)
(Text -> [Argument] -> [BasicBlock] -> String)
"@" Format
(Text -> [Argument] -> [BasicBlock] -> String)
(Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
([Argument] -> [BasicBlock] -> String)
(Text -> [Argument] -> [BasicBlock] -> String)
forall r. Format r (Text -> r)
stext Format
([Argument] -> [BasicBlock] -> String)
(Text -> [Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
([Argument] -> [BasicBlock] -> String)
([Argument] -> [BasicBlock] -> String)
"(" Format
([Argument] -> [BasicBlock] -> String)
([Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Argument -> Builder)
-> Format
([BasicBlock] -> String) ([Argument] -> [BasicBlock] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Argument -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format
([BasicBlock] -> String) ([Argument] -> [BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([BasicBlock] -> String) ([BasicBlock] -> String)
") {\n" Format ([BasicBlock] -> String) ([BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (BasicBlock -> Builder)
-> Format String ([BasicBlock] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (BasicBlock -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format String ([BasicBlock] -> String)
-> Format String String -> Format String ([BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"\n" Format String String
-> Format String String -> Format String String
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"}")
Type
ret Text
name [Argument]
args [BasicBlock]
bbs
data Argument = Argument
{ Argument -> Text
name :: !Text,
Argument -> Type
tpe :: !Type
}
instance Show Argument where
show :: Argument -> String
show (Argument Text
name Type
tpe) = Format String (Type -> Text -> String) -> Type -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Type -> Text -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Text -> String) (Type -> Text -> String)
-> Format String (Text -> String)
-> Format String (Type -> Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Text -> String)
forall r. Format r (Text -> r)
stext) Type
tpe Text
name
data Type
= VoidType
| IntType !Int
| PointerType !Type
| ArrayType !Type !Int
instance Show Type where
show :: Type -> String
show Type
VoidType = String
"void"
show (IntType Int
n) = Format String (Int -> String) -> Int -> String
forall a. Format String a -> a
formatToString (Format (Int -> String) (Int -> String)
"i" Format (Int -> String) (Int -> String)
-> Format String (Int -> String) -> Format String (Int -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Int -> String)
forall a r. Integral a => Format r (a -> r)
int) Int
n
show (PointerType Type
tpe) = String
"ptr"
show (ArrayType Type
tpe Int
n) = String
"ptr"
arrayType :: Type -> Text
arrayType :: Type -> Text
arrayType (ArrayType Type
tpe Int
n) = Format Text (Int -> Type -> Text) -> Int -> Type -> Text
forall a. Format Text a -> a
sformat (Format (Int -> Type -> Text) (Int -> Type -> Text)
"<" Format (Int -> Type -> Text) (Int -> Type -> Text)
-> Format Text (Int -> Type -> Text)
-> Format Text (Int -> Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Text) (Int -> Type -> Text)
forall a r. Integral a => Format r (a -> r)
int Format (Type -> Text) (Int -> Type -> Text)
-> Format Text (Type -> Text) -> Format Text (Int -> Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Text) (Type -> Text)
"x" Format (Type -> Text) (Type -> Text)
-> Format Text (Type -> Text) -> Format Text (Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Text (Type -> Text)
forall a r. Show a => Format r (a -> r)
shown Format Text (Type -> Text)
-> Format Text Text -> Format Text (Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format Text Text
">") Int
n Type
tpe
arrayType Type
t = String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Type -> String
forall a. Show a => a -> String
show Type
t
data BasicBlock = BasicBlock
{ BasicBlock -> Label
label :: !Label,
BasicBlock -> [Instruction]
instructions :: ![Instruction]
}
instance Show BasicBlock where
show :: BasicBlock -> String
show (BasicBlock Label
label [Instruction]
insts) =
Format String (Label -> [Instruction] -> String)
-> Label -> [Instruction] -> String
forall a. Format String a -> a
formatToString (Format ([Instruction] -> String) (Label -> [Instruction] -> String)
forall a r. Show a => Format r (a -> r)
shown Format ([Instruction] -> String) (Label -> [Instruction] -> String)
-> Format String ([Instruction] -> String)
-> Format String (Label -> [Instruction] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Instruction] -> String) ([Instruction] -> String)
":\n" Format ([Instruction] -> String) ([Instruction] -> String)
-> Format String ([Instruction] -> String)
-> Format String ([Instruction] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Instruction -> Builder)
-> Format String ([Instruction] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Instruction -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Label
label [Instruction]
insts
data Var = Var
{ Var -> Int
id :: !VID,
Var -> Type
tpe :: !Type,
Var -> Range
loc :: !SL.Range
}
deriving ((forall x. Var -> Rep Var x)
-> (forall x. Rep Var x -> Var) -> Generic Var
forall x. Rep Var x -> Var
forall x. Var -> Rep Var x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Var -> Rep Var x
from :: forall x. Var -> Rep Var x
$cto :: forall x. Rep Var x -> Var
to :: forall x. Rep Var x -> Var
Generic)
formatVar :: Format r (Var -> r)
formatVar :: forall r. Format r (Var -> r)
formatVar = Format (Var -> r) (Var -> r)
"%v" Format (Var -> r) (Var -> r)
-> Format r (Var -> r) -> Format r (Var -> r)
forall r a r'. Format r a -> Format r' r -> Format r' a
% ((Int -> Const Int Int) -> Var -> Const Int Var)
-> Format r (Int -> r) -> Format r (Var -> r)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Int -> Const Int Int) -> Var -> Const Int Var
#id Format r (Int -> r)
forall a r. Integral a => Format r (a -> r)
int
instance Show Var where
show :: Var -> String
show = Format String (Var -> String) -> Var -> String
forall a. Format String a -> a
formatToString Format String (Var -> String)
forall r. Format r (Var -> r)
formatVar
data Value
= IntImm !Type !Int64
| Variable !Var
valueType :: Value -> Type
valueType :: Value -> Type
valueType (IntImm Type
tpe Int64
_) = Type
tpe
valueType (Variable Var
var) = Var
var Var -> Getting Type Var Type -> Type
forall s a. s -> Getting a s a -> a
^. Getting Type Var Type
#tpe
instance Show Value where
show :: Value -> String
show (IntImm Type
tpe Int64
n) = Format String (Int64 -> String) -> Int64 -> String
forall a. Format String a -> a
formatToString Format String (Int64 -> String)
forall a r. Integral a => Format r (a -> r)
int Int64
n
show (Variable Var
v) = Format String (Var -> String) -> Var -> String
forall a. Format String a -> a
formatToString Format String (Var -> String)
forall r. Format r (Var -> r)
formatVar Var
v
valueWithType :: Format r (Value -> r)
valueWithType :: forall r. Format r (Value -> r)
valueWithType = (Value -> Builder) -> Format r (Value -> r)
forall a r. (a -> Builder) -> Format r (a -> r)
later ((Value -> Builder) -> Format r (Value -> r))
-> (Value -> Builder) -> Format r (Value -> r)
forall a b. (a -> b) -> a -> b
$ \case
(IntImm Type
tpe Int64
n) -> Format Builder (Type -> Int64 -> Builder)
-> Type -> Int64 -> Builder
forall a. Format Builder a -> a
bformat (Format (Int64 -> Builder) (Type -> Int64 -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format (Int64 -> Builder) (Type -> Int64 -> Builder)
-> Format Builder (Int64 -> Builder)
-> Format Builder (Type -> Int64 -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder (Int64 -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Int64
n
(Variable Var
v) -> Format Builder (Type -> Var -> Builder) -> Type -> Var -> Builder
forall a. Format Builder a -> a
bformat (Format (Var -> Builder) (Type -> Var -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format (Var -> Builder) (Type -> Var -> Builder)
-> Format Builder (Var -> Builder)
-> Format Builder (Type -> Var -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder (Var -> Builder)
forall r. Format r (Var -> r)
formatVar) (Var
v Var -> Getting Type Var Type -> Type
forall s a. s -> Getting a s a -> a
^. Getting Type Var Type
#tpe) Var
v
data CondCodes
= EQL
| NEQ
| SGT
| SGE
| SLT
| SLE
deriving (CondCodes -> CondCodes -> Bool
(CondCodes -> CondCodes -> Bool)
-> (CondCodes -> CondCodes -> Bool) -> Eq CondCodes
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CondCodes -> CondCodes -> Bool
== :: CondCodes -> CondCodes -> Bool
$c/= :: CondCodes -> CondCodes -> Bool
/= :: CondCodes -> CondCodes -> Bool
Eq)
instance Show CondCodes where
show :: CondCodes -> String
show CondCodes
EQL = String
"eq"
show CondCodes
NEQ = String
"ne"
show CondCodes
SGT = String
"sgt"
show CondCodes
SGE = String
"sge"
show CondCodes
SLT = String
"slt"
show CondCodes
SLE = String
"sle"
data Instruction
= Terminator !TermInst
| Binary !BinaryInst
| BitBinary !BitwiseBinaryInst
| MemAccess !MemAccInst
| ICmp !Var !CondCodes !Type !Value !Value
| Assignment !Var !Value
| Phi !Var !Type ![(Var, Label)]
| Call !Var !Type !Name ![Value]
instance Show Instruction where
show :: Instruction -> String
show (Terminator TermInst
t) = TermInst -> String
forall a. Show a => a -> String
show TermInst
t
show (Binary BinaryInst
b) = BinaryInst -> String
forall a. Show a => a -> String
show BinaryInst
b
show (BitBinary BitwiseBinaryInst
b) = BitwiseBinaryInst -> String
forall a. Show a => a -> String
show BitwiseBinaryInst
b
show (MemAccess MemAccInst
m) = MemAccInst -> String
forall a. Show a => a -> String
show MemAccInst
m
show (ICmp Var
var CondCodes
cc Type
tpe Value
v1 Value
v2) = Format
String (Var -> CondCodes -> Type -> Value -> Value -> String)
-> Var -> CondCodes -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(CondCodes -> Type -> Value -> Value -> String)
(Var -> CondCodes -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(CondCodes -> Type -> Value -> Value -> String)
(Var -> CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format
String (Var -> CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(CondCodes -> Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
"=" Format
(CondCodes -> Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(CondCodes -> Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
"icmp" Format
(CondCodes -> Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Type -> Value -> Value -> String)
(CondCodes -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
var CondCodes
cc Type
tpe Value
v1 Value
v2
show (Assignment Var
var Value
val) = Format String (Var -> Type -> Value -> String)
-> Var -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Var -> Type -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format (Type -> Value -> String) (Var -> Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Var -> Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Value -> String) (Type -> Value -> String)
"=" Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
var (Value -> Type
valueType Value
val) Value
val
show (Phi Var
var Type
tpe [(Var, Label)]
preds) = Format String (Var -> Type -> [(Var, Label)] -> String)
-> Var -> Type -> [(Var, Label)] -> String
forall a. Format String a -> a
formatToString (Format
(Type -> [(Var, Label)] -> String)
(Var -> Type -> [(Var, Label)] -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> [(Var, Label)] -> String)
(Var -> Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
-> Format String (Var -> Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> [(Var, Label)] -> String)
(Type -> [(Var, Label)] -> String)
"= phi" Format
(Type -> [(Var, Label)] -> String)
(Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
([(Var, Label)] -> String) (Type -> [(Var, Label)] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
([(Var, Label)] -> String) (Type -> [(Var, Label)] -> String)
-> Format String ([(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Text
-> Format Builder ((Var, Label) -> Builder)
-> Format String ([(Var, Label)] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " (Format ((Var, Label) -> Builder) ((Var, Label) -> Builder)
"[" Format ((Var, Label) -> Builder) ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ ((Var -> Const Var Any) -> (Var, Label) -> Const Var (Any, Label))
-> Format Builder (Var -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Var -> Const Var Any) -> (Var, Label) -> Const Var (Any, Label)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (Var, Label) (Any, Label) Var Any
_1 Format Builder (Var -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Var, Label) -> Builder)
-> Format Builder Builder
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format Builder Builder
", %" Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall a. Semigroup a => a -> a -> a
<> ((Label -> Const Label Any)
-> (Var, Label) -> Const Label (Var, Any))
-> Format Builder (Label -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Label -> Const Label Any)
-> (Var, Label) -> Const Label (Var, Any)
forall s t a b. Field2 s t a b => Lens s t a b
Lens (Var, Label) (Var, Any) Label Any
_2 Format Builder (Label -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Var, Label) -> Builder)
-> Format Builder Builder
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder Builder
"]")) Var
var Type
tpe [(Var, Label)]
preds
show (Call Var
var Type
VoidType Text
name [Value]
args) = Format String (Type -> Text -> [Value] -> String)
-> Type -> Text -> [Value] -> String
forall a. Format String a -> a
formatToString
(Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
"call" Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> [Value] -> String) (Text -> [Value] -> String)
"@" Format (Text -> [Value] -> String) (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) (Text -> [Value] -> String)
forall r. Format r (Text -> r)
stext Format ([Value] -> String) (Text -> [Value] -> String)
-> Format String ([Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) ([Value] -> String)
"(" Format ([Value] -> String) ([Value] -> String)
-> Format String ([Value] -> String)
-> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Value -> Builder)
-> Format String ([Value] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Value -> Builder)
forall r. Format r (Value -> r)
valueWithType Format String ([Value] -> String)
-> Format String String -> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
")")
Type
VoidType Text
name [Value]
args
show (Call Var
var Type
tpe Text
name [Value]
args) = Format String (Var -> Type -> Text -> [Value] -> String)
-> Var -> Type -> Text -> [Value] -> String
forall a. Format String a -> a
formatToString
(Format
(Type -> Text -> [Value] -> String)
(Var -> Type -> Text -> [Value] -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Text -> [Value] -> String)
(Var -> Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Var -> Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
"=" Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
"call" Format
(Type -> Text -> [Value] -> String)
(Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> [Value] -> String) (Text -> [Value] -> String)
"@" Format (Text -> [Value] -> String) (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) (Text -> [Value] -> String)
forall r. Format r (Text -> r)
stext Format ([Value] -> String) (Text -> [Value] -> String)
-> Format String ([Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) ([Value] -> String)
"(" Format ([Value] -> String) ([Value] -> String)
-> Format String ([Value] -> String)
-> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Value -> Builder)
-> Format String ([Value] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Value -> Builder)
forall r. Format r (Value -> r)
valueWithType Format String ([Value] -> String)
-> Format String String -> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
")")
Var
var Type
tpe Text
name [Value]
args
data TermInst
= Ret !(Maybe Value) !Type
| BrUncon !Label
| BrCon !Value !Label !Label
instance Show TermInst where
show :: TermInst -> String
show (Ret Maybe Value
Nothing Type
tpe) = String
"ret void"
show (Ret (Just Value
val) Type
tpe) = Format String (Type -> Value -> String) -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Type -> Value -> String)
"ret" Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Value
val
show (BrUncon Label
label) = Format String (Label -> String) -> Label -> String
forall a. Format String a -> a
formatToString (Format (Label -> String) (Label -> String)
"br label %" Format (Label -> String) (Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Label -> String)
forall a r. Show a => Format r (a -> r)
shown) Label
label
show (BrCon Value
val Label
l1 Label
l2) =
Format String (Value -> Label -> Label -> String)
-> Value -> Label -> Label -> String
forall a. Format String a -> a
formatToString (Format
(Value -> Label -> Label -> String)
(Value -> Label -> Label -> String)
"br" Format
(Value -> Label -> Label -> String)
(Value -> Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Label -> Label -> String) (Value -> Label -> Label -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Label -> Label -> String) (Value -> Label -> Label -> String)
-> Format String (Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Label -> Label -> String) (Label -> Label -> String)
", label %" Format (Label -> Label -> String) (Label -> Label -> String)
-> Format String (Label -> Label -> String)
-> Format String (Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Label -> String) (Label -> Label -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Label -> String) (Label -> Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Label -> String) (Label -> String)
", label %" Format (Label -> String) (Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Label -> String)
forall a r. Show a => Format r (a -> r)
shown) Value
val Label
l1 Label
l2
data BinaryInst
= Add !Var !Type !Value !Value
| Sub !Var !Type !Value !Value
| Mul !Var !Type !Value !Value
| SDiv !Var !Type !Value !Value
instance Show BinaryInst where
show :: BinaryInst -> String
show (Add Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"add" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
show (Sub Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"sub" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
show (Mul Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"mul" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
show (SDiv Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"sdiv" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
data BitwiseBinaryInst
= And !Var !Type !Value !Value
| Or !Var !Type !Value !Value
instance Show BitwiseBinaryInst where
show :: BitwiseBinaryInst -> String
show (And Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"and" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
show (Or Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Value -> Value -> String)
(Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"=" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"or" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
v1 Value
v2
data MemAccInst
= Alloca !Var !Type !Int64
| Load !Var !Type !Value
| Store !Type !Value !Value
| StoreVec !Type ![(Type, Value)] !Value
instance Show MemAccInst where
show :: MemAccInst -> String
show (Alloca Var
var Type
tpe Int64
n) = Format String (Var -> Type -> Type -> Int64 -> String)
-> Var -> Type -> Type -> Int64 -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Type -> Int64 -> String)
(Var -> Type -> Type -> Int64 -> String)
forall r. Format r (Var -> r)
formatVar Format
(Type -> Type -> Int64 -> String)
(Var -> Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
-> Format String (Var -> Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Type -> Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
"= alloca " Format
(Type -> Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Int64 -> String) (Type -> Int64 -> String)
", " Format (Type -> Int64 -> String) (Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Int64 -> String) (Type -> Int64 -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Int64 -> String) (Type -> Int64 -> String)
-> Format String (Int64 -> String)
-> Format String (Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Int64 -> String)
forall a r. Integral a => Format r (a -> r)
int)
Var
var Type
tpe Type
tpe Int64
n
show (Load Var
var Type
tpe Value
val) = Format String (Var -> Type -> Value -> String)
-> Var -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Var -> Type -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format (Type -> Value -> String) (Var -> Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Var -> Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Value -> String) (Type -> Value -> String)
"= load " Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
"ptr" Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
Var
var Type
tpe Value
val
show (Store Type
tpe Value
val Value
ptr) = Format String (Type -> Value -> Value -> String)
-> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
"store" Format
(Type -> Value -> Value -> String)
(Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", ptr " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Value
val Value
ptr
show (StoreVec Type
tpe [(Type, Value)]
vals Value
ptr) = Format String (Text -> [(Type, Value)] -> Value -> String)
-> Text -> [(Type, Value)] -> Value -> String
forall a. Format String a -> a
formatToString
(Format
(Text -> [(Type, Value)] -> Value -> String)
(Text -> [(Type, Value)] -> Value -> String)
"store" Format
(Text -> [(Type, Value)] -> Value -> String)
(Text -> [(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
([(Type, Value)] -> Value -> String)
(Text -> [(Type, Value)] -> Value -> String)
forall r. Format r (Text -> r)
stext Format
([(Type, Value)] -> Value -> String)
(Text -> [(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
([(Type, Value)] -> Value -> String)
([(Type, Value)] -> Value -> String)
"<" Format
([(Type, Value)] -> Value -> String)
([(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder ((Type, Value) -> Builder)
-> Format (Value -> String) ([(Type, Value)] -> Value -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " (((Type -> Const Type Any)
-> (Type, Value) -> Const Type (Any, Value))
-> Format Builder (Type -> Builder)
-> Format Builder ((Type, Value) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Type -> Const Type Any)
-> (Type, Value) -> Const Type (Any, Value)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (Type, Value) (Any, Value) Type Any
_1 Format Builder (Type -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Type, Value) -> Builder)
-> Format Builder ((Type, Value) -> Builder)
-> Format Builder ((Type, Value) -> Builder)
forall r a.
Format r (a -> r) -> Format r (a -> r) -> Format r (a -> r)
<%+> ((Value -> Const Value Any)
-> (Type, Value) -> Const Value (Type, Any))
-> Format Builder (Value -> Builder)
-> Format Builder ((Type, Value) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Value -> Const Value Any)
-> (Type, Value) -> Const Value (Type, Any)
forall s t a b. Field2 s t a b => Lens s t a b
Lens (Type, Value) (Type, Any) Value Any
_2 Format Builder (Value -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Format (Value -> String) ([(Type, Value)] -> Value -> String)
-> Format String (Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
">" Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> String)
", ptr " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
(Type -> Text
arrayType Type
tpe) [(Type, Value)]
vals Value
ptr