19 | import public System.FFI
23 | libxla : String -> String -> String
24 | libxla header fname = "C:\{fname},libc_xla,\{header}"
26 | ffi : String -> String
27 | ffi = libxla "c/ffi.h"
30 | data CppString = MkCppString AnyPtr
33 | onCollectAny' : HasIO io => AnyPtr -> (AnyPtr -> IO ()) -> io GCAnyPtr
34 | onCollectAny' x f = onCollectAny x f
37 | %foreign (ffi "string_new")
38 | prim__mkString : PrimIO AnyPtr
42 | cppString : HasIO io => io CppString
43 | cppString = MkCppString <$> primIO prim__mkString
46 | %foreign (ffi "string_delete")
47 | prim__stringDelete : AnyPtr -> PrimIO ()
51 | delete : HasIO io => CppString -> io ()
52 | delete (MkCppString str) = primIO $
prim__stringDelete str
54 | %foreign (ffi "string_c_str")
55 | prim__stringCStr : AnyPtr -> String
58 | c_str : CppString -> String
59 | c_str (MkCppString str) = prim__stringCStr str
62 | %foreign (ffi "string_data")
63 | prim__stringData : AnyPtr -> Ptr Char
66 | %foreign (ffi "string_size")
67 | prim__stringSize : AnyPtr -> Bits64
70 | %foreign (ffi "idx")
71 | prim__index : Int -> AnyPtr -> AnyPtr
74 | cIntToBool : Int -> Bool
75 | cIntToBool 0 = False
78 | let msg = "Internal error: expected 0 or 1 from XLA C API for boolean conversion, got " ++ show x
79 | in (assert_total idris_crash) msg
81 | %foreign (ffi "isnull")
82 | prim__isNullPtr : AnyPtr -> Int
85 | isNullPtr : AnyPtr -> Bool
86 | isNullPtr ptr = cIntToBool $
prim__isNullPtr ptr
89 | boolToCInt : Bool -> Int
91 | boolToCInt False = 0
94 | data IntArray : Type where
95 | MkIntArray : GCPtr Int -> IntArray
97 | %foreign (ffi "sizeof_int")
100 | %foreign (ffi "set_array_int")
101 | prim__setArrayInt : Ptr Int -> Int -> Int -> PrimIO ()
104 | mkIntArray : (HasIO io, Cast a Int) => List a -> io IntArray
106 | ptr <- malloc (cast (length xs) * cast sizeofInt)
107 | let ptr = prim__castPtr ptr
108 | traverse_ (\(idx, x) => primIO $
prim__setArrayInt ptr (cast idx) (cast x)) (enumerate xs)
109 | ptr <- onCollect ptr (free . prim__forgetPtr)
110 | pure (MkIntArray ptr)
113 | data Int64Array : Type where
114 | MkInt64Array : GCPtr Int64 -> Int64Array
116 | %foreign (ffi "sizeof_int64_t")
117 | sizeofInt64 : Bits64
119 | %foreign (ffi "set_array_int64_t")
120 | prim__setArrayInt64 : Ptr Int64 -> Bits64 -> Int64 -> PrimIO ()
123 | mkInt64Array : HasIO io => List Int64 -> io Int64Array
124 | mkInt64Array xs = do
125 | ptr <- malloc (cast (length xs) * cast sizeofInt64)
126 | let ptr = prim__castPtr ptr
127 | traverse_ (\(idx, x) => primIO $
prim__setArrayInt64 ptr (cast idx) (cast x)) (enumerate xs)
128 | ptr <- onCollect ptr (free . prim__forgetPtr)
129 | pure (MkInt64Array ptr)
132 | %foreign (ffi "sizeof_ptr")
136 | %foreign (ffi "set_array_ptr")
137 | prim__setArrayPtr : AnyPtr -> Int -> AnyPtr -> PrimIO ()