forked from hgoes/bindings-llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Helper.h
169 lines (149 loc) · 4.88 KB
/
Helper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#define _TO_STRING(x) #x
#define TYPE_LEAF(name)
#define TYPE(name)\
TYPE_LEAF(name) ;\
\
class name##C a ;\
\
instance name##C name
#define SUBTYPE(super,sub)\
instance Subtype super sub where {\
isA _ = isA##sub\
} ;\
instance super##C sub
#define SUBTYPE2(super1,super2,sub)\
SUBTYPE(super1,sub) ;\
SUBTYPE(super2,sub)
#define SUBTYPE3(super1,super2,super3,sub)\
SUBTYPE(super1,sub) ;\
SUBTYPE(super2,sub) ;\
SUBTYPE(super3,sub)
#define SUBTYPE4(super1,super2,super3,super4,sub)\
SUBTYPE(super1,sub);\
SUBTYPE(super2,sub);\
SUBTYPE(super3,sub);\
SUBTYPE(super4,sub)
#define SUBTYPE5(super1,super2,super3,super4,super5,sub) \
SUBTYPE(super1,sub);\
SUBTYPE(super2,sub);\
SUBTYPE(super3,sub);\
SUBTYPE(super4,sub);\
SUBTYPE(super5,sub)
#define SPECIALIZE_IPLIST(name,cconv)\
instance IPListC name where {\
ipListSize' = list##name##Size ;\
ipListBegin = list##name##Begin ;\
ipListEnd = list##name##End ;\
ipListInsert = list##name##Insert ;\
ipListRemove = list##name##Remove ;\
ipListPushBack = list##name##PushBack ;\
ipListPushFront = list##name##PushFront\
} ;\
\
instance IListIteratorC name where {\
iListIteratorDeref = listIterator##name##Deref ;\
iListIteratorNext = listIterator##name##Next ;\
iListIteratorPrev = listIterator##name##Prev ;\
iListIteratorEq = listIterator##name##Eq ;\
iListIteratorNEq = listIterator##name##NEq\
} ;\
\
instance IListNodeC name where {\
iListNodeNext = listNode##name##Next ;\
iListNodePrev = listNode##name##Prev ;\
}
#if HS_LLVM_VERSION>=300
#define SPECIALIZE_ARRAYREF(name)\
instance ArrayRefC (Ptr name) where {\
newArrayRef' = newArrayRef##name ;\
newArrayRefEmpty = newArrayRefEmpty##name ;\
arrayRefSize' = arrayRefSize##name ;\
arrayRefEquals = arrayRefEquals##name ;\
arrayRefIndex' = arrayRefIndex##name ;\
deleteArrayRef = deleteArrayRef##name\
}
#else
#define SPECIALIZE_ARRAYREF(name)\
instance ArrayRefC (Ptr name) where {\
newArrayRef' = newArrayRef##name ;\
newArrayRefEmpty = newArrayRefEmpty##name ;\
arrayRefSize' = arrayRefSize##name ;\
arrayRefIndex' = arrayRefIndex##name ;\
deleteArrayRef = deleteArrayRef##name\
}
#endif
#define SPECIALIZE_SETVECTOR(name)\
instance SetVectorC (Ptr name) where {\
setVectorEmpty = setVector##name##Empty ;\
setVectorBegin = setVector##name##Begin ;\
setVectorEnd = setVector##name##End\
}
#define SPECIALIZE_VECTOR(name)\
instance VectorC (Ptr name) where {\
vectorBegin = vector##name##Begin ;\
vectorEnd = vector##name##End ;\
vectorIteratorDeref = vectorIterator##name##Deref ;\
vectorIteratorNext = vectorIterator##name##Next ;\
vectorIteratorEq = vectorIterator##name##Eq ;\
newVector = newVector##name ;\
vectorClear = vector##name##Clear ;\
vectorPushBack = vector##name##PushBack ; \
vectorResize = vector##name##Resize ;\
vectorIndex = vector##name##Index ;\
vectorSize = vector##name##Size\
}
#define SPECIALIZE_SMALLVECTOR(name)\
instance SmallVectorC (Ptr name) where {\
newSmallVector = newSmallVector##name ;\
deleteSmallVector = deleteSmallVector##name ;\
smallVectorSize = smallVectorSize##name ;\
smallVectorData = smallVectorData##name\
}
#define SPECIALIZE_PAIR(name1,name2)\
instance PairC (Ptr name1) (Ptr name2) where {\
pairSize _ = sizeofPair##name1##_##name2 ;\
pairFirst = pairFirst##name1##_##name2 ;\
pairSecond = pairSecond##name1##_##name2 ;\
pairSetFirst = pairSetFirst##name1##_##name2 ;\
pairSetSecond = pairSetSecond##name1##_##name2\
} ;\
instance Storable (Pair (Ptr name1) (Ptr name2)) where {\
sizeOf _ = fromIntegral $ sizeofPair##name1##_##name2 ;\
alignment _ = fromIntegral $ alignofPair##name1##_##name2 ;\
peek ptr = do { s1 <- pairFirst##name1##_##name2 ptr ; s2 <- pairSecond##name1##_##name2 ptr ; return (Pair s1 s2) } ;\
poke ptr (Pair s1 s2) = do { pairSetFirst##name1##_##name2 ptr s1 ; pairSetSecond##name1##_##name2 ptr s2 }\
}
#define FUN(cls,name,sig)\
foreign import capi unsafe _TO_STRING(llvm_proxy.h cls##_##name)\
_##name :: Ptr t -> sig ;\
\
name :: cls##C t => Ptr t -> sig ;\
name = _##name
#define FUN_LEAF(cls,name,sig)\
foreign import capi unsafe _TO_STRING(llvm_proxy.h cls##_##name)\
name :: Ptr cls -> sig
#define GETTYPE(cls)\
instance GetType cls where {\
type TypeOfValue cls = Type ;\
getType = valueGetType\
}
#define SPECIALIZE_OWNINGPTR(name,cconv)\
instance OwningPtrC name where {\
newOwningPtr = newOwningPtr##name ;\
deleteOwningPtr = deleteOwningPtr##name ;\
takeOwningPtr = takeOwningPtr##name\
}
#define SPECIALIZE_UNIQUEPTR(name,cconv)\
instance UniquePtrC name where {\
newUniquePtr = newUniquePtr##name ;\
deleteUniquePtr = deleteUniquePtr##name ;\
getUniquePtr = getUniquePtr##name ;\
releaseUniquePtr = releaseUniquePtr##name\
}
#define SPECIALIZE_ERROROR(name,cls,cconv)\
instance ErrorOrC (cls) where {\
errorOrIsSuccess = errorOrIsSuccess##name ;\
errorOrGetError = errorOrGetError##name ;\
errorOrGet = errorOrGet##name\
}
#define PRESERVE(x) x