- class (Phi llvmValue, Undefined llvmValue, IsType llvmStruct) => C llvmValue llvmStruct | llvmValue -> llvmStruct where
- load :: Value (Ptr llvmStruct) -> CodeGenFunction r llvmValue
- store :: llvmValue -> Value (Ptr llvmStruct) -> CodeGenFunction r ()
- decompose :: Value llvmStruct -> CodeGenFunction r llvmValue
- compose :: llvmValue -> CodeGenFunction r (Value llvmStruct)
- modify :: C llvmValue llvmStruct => (llvmValue -> CodeGenFunction r llvmValue) -> Value (Ptr llvmStruct) -> CodeGenFunction r ()
- castStorablePtr :: (MakeValueTuple haskellValue llvmValue, C llvmValue llvmStruct) => Ptr haskellValue -> Ptr llvmStruct
- type Record r o v = Element r o v v
- data Element r o v x
- element :: (C x llvmStruct, GetValue o n llvmStruct, GetElementPtr o (n, ()) llvmStruct) => (v -> x) -> n -> Element r o v x
- loadRecord :: Record r o llvmValue -> Value (Ptr o) -> CodeGenFunction r llvmValue
- storeRecord :: Record r o llvmValue -> llvmValue -> Value (Ptr o) -> CodeGenFunction r ()
- decomposeRecord :: Record r o llvmValue -> Value o -> CodeGenFunction r llvmValue
- composeRecord :: IsType o => Record r o llvmValue -> llvmValue -> CodeGenFunction r (Value o)
- loadNewtype :: C a o => (a -> llvmValue) -> Value (Ptr o) -> CodeGenFunction r llvmValue
- storeNewtype :: C a o => (llvmValue -> a) -> llvmValue -> Value (Ptr o) -> CodeGenFunction r ()
- decomposeNewtype :: C a o => (a -> llvmValue) -> Value o -> CodeGenFunction r llvmValue
- composeNewtype :: C a o => (llvmValue -> a) -> llvmValue -> CodeGenFunction r (Value o)
- class (IsFirstClass llvmType, IsType llvmStruct) => FirstClass llvmType llvmStruct | llvmType -> llvmStruct
Documentation
class (Phi llvmValue, Undefined llvmValue, IsType llvmStruct) => C llvmValue llvmStruct | llvmValue -> llvmStruct whereSource
An implementation of both MakeValueTuple
and Memory.C
must ensure that haskellValue
is compatible with llvmStruct
.
That is, writing and reading llvmStruct
by LLVM
must be the same as accessing haskellValue
by Storable
methods.
ToDo: In future we may also require Storable constraint for llvmStruct.
We use a functional dependency in order to let type inference work nicely.
load :: Value (Ptr llvmStruct) -> CodeGenFunction r llvmValueSource
store :: llvmValue -> Value (Ptr llvmStruct) -> CodeGenFunction r ()Source
decompose :: Value llvmStruct -> CodeGenFunction r llvmValueSource
compose :: llvmValue -> CodeGenFunction r (Value llvmStruct)Source
modify :: C llvmValue llvmStruct => (llvmValue -> CodeGenFunction r llvmValue) -> Value (Ptr llvmStruct) -> CodeGenFunction r ()Source
castStorablePtr :: (MakeValueTuple haskellValue llvmValue, C llvmValue llvmStruct) => Ptr haskellValue -> Ptr llvmStructSource
element :: (C x llvmStruct, GetValue o n llvmStruct, GetElementPtr o (n, ()) llvmStruct) => (v -> x) -> n -> Element r o v xSource
loadRecord :: Record r o llvmValue -> Value (Ptr o) -> CodeGenFunction r llvmValueSource
storeRecord :: Record r o llvmValue -> llvmValue -> Value (Ptr o) -> CodeGenFunction r ()Source
decomposeRecord :: Record r o llvmValue -> Value o -> CodeGenFunction r llvmValueSource
composeRecord :: IsType o => Record r o llvmValue -> llvmValue -> CodeGenFunction r (Value o)Source
loadNewtype :: C a o => (a -> llvmValue) -> Value (Ptr o) -> CodeGenFunction r llvmValueSource
storeNewtype :: C a o => (llvmValue -> a) -> llvmValue -> Value (Ptr o) -> CodeGenFunction r ()Source
decomposeNewtype :: C a o => (a -> llvmValue) -> Value o -> CodeGenFunction r llvmValueSource
composeNewtype :: C a o => (llvmValue -> a) -> llvmValue -> CodeGenFunction r (Value o)Source
class (IsFirstClass llvmType, IsType llvmStruct) => FirstClass llvmType llvmStruct | llvmType -> llvmStructSource
FirstClass Bool Word32 | |
FirstClass Double Double | |
FirstClass Float Float | |
FirstClass Int8 Int8 | |
FirstClass Int16 Int16 | |
FirstClass Int32 Int32 | |
FirstClass Int64 Int64 | |
FirstClass Word8 Word8 | |
FirstClass Word16 Word16 | |
FirstClass Word32 Word32 | |
FirstClass Word64 Word64 | |
FirstClass (StablePtr a) (StablePtr a) | |
IsType a => FirstClass (Ptr a) (Ptr a) | |
(IsFirstClass (Struct s), IsType (Struct sm), ConvertStruct s sm D0 s sm) => FirstClass (Struct s) (Struct sm) | |
(Nat n, IsFirstClass am, FirstClass a am, IsSized a asize, IsSized am amsize) => FirstClass (Array n a) (Array n am) | |
(Pos n, IsPrimitive a, IsPrimitive am, FirstClass a am) => FirstClass (Vector n a) (Vector n am) |