Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_callvm_arm32_arm_armhf.c @ 84:67961454902b
- bigger cleanup in callvm code
* changed init of most callvms to reuse code and for consistency
* removed unused functions
* general changes for consistency
* added some missing cconv defines do mode calls
- fixed potential buffer overrun on arm64
- fixed sparc and x64 mode setting (only one mode, but wasn't (pointlessly) resettable)
- error code handling (dcGetError) changes, flag is now cleared (work still underway)
- Changelog update
author | cslag |
---|---|
date | Wed, 06 Apr 2016 00:21:51 +0200 |
parents | 9e9d6a90492a |
children | 0ab08c1541f0 |
comparison
equal
deleted
inserted
replaced
83:54930a037e8a | 84:67961454902b |
---|---|
26 | 26 |
27 #include "dyncall_callvm_arm32_arm_armhf.h" | 27 #include "dyncall_callvm_arm32_arm_armhf.h" |
28 #include "dyncall_alloc.h" | 28 #include "dyncall_alloc.h" |
29 | 29 |
30 | 30 |
31 static DCCallVM* dc_callvm_new_arm32_armhf(DCCallVM_vt* vt, DCsize size) | |
32 { | |
33 /* Store at least 16 bytes (4 words for first 4 int args) for internal spill area. Assembly code depends on it. */ | |
34 DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16); | |
35 dc_callvm_base_init(&p->mInterface, vt); | |
36 dcVecInit(&p->mVecHead, size); | |
37 p->i = 0; | |
38 p->s = 0; | |
39 p->d = 0; | |
40 return (DCCallVM*)p; | |
41 } | |
42 | |
43 static void mode(DCCallVM* in_self,DCint mode); | |
44 | |
45 static void deinit(DCCallVM* in_self) | 31 static void deinit(DCCallVM* in_self) |
46 { | 32 { |
47 dcFreeMem(in_self); | 33 dcFreeMem(in_self); |
48 } | 34 } |
49 | 35 |
142 void call(DCCallVM* in_p, DCpointer target) | 128 void call(DCCallVM* in_p, DCpointer target) |
143 { | 129 { |
144 DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; | 130 DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)in_p; |
145 dcCall_arm32_armhf(target, dcVecData(&p->mVecHead), dcVecSize(&p->mVecHead), &p->S[0]); | 131 dcCall_arm32_armhf(target, dcVecData(&p->mVecHead), dcVecSize(&p->mVecHead), &p->S[0]); |
146 } | 132 } |
133 | |
134 static void mode(DCCallVM* in_self,DCint mode); | |
147 | 135 |
148 DCCallVM_vt vt_armhf = | 136 DCCallVM_vt vt_armhf = |
149 { | 137 { |
150 &deinit | 138 &deinit |
151 , &reset | 139 , &reset |
199 , (DCdoublevmfunc*) &call | 187 , (DCdoublevmfunc*) &call |
200 , (DCpointervmfunc*) &call | 188 , (DCpointervmfunc*) &call |
201 , NULL /* callStruct */ | 189 , NULL /* callStruct */ |
202 }; | 190 }; |
203 | 191 |
204 DCCallVM* dcNewCallVM(DCsize size) | 192 static void mode(DCCallVM* in_self, DCint mode) |
205 { | 193 { |
206 #if defined(DC__ABI_ARM_EABI) | 194 DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*)in_self; |
207 return dc_callvm_new_arm32_arm(&eabi, size); | 195 DCCallVM_vt* vt; |
208 #elif defined(DC__ABI_ARM_HF) | 196 |
209 return dc_callvm_new_arm32_armhf(&vt_armhf, size); | |
210 #elif defined(DC__ABI_ARM_OABI) | |
211 return dc_callvm_new_arm32_arm(&oabi, size); | |
212 #else | |
213 #error unknown ARM abi | |
214 #endif | |
215 } | |
216 | |
217 static void mode(DCCallVM* in_self,DCint mode) | |
218 { | |
219 DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*) in_self; | |
220 switch(mode) { | 197 switch(mode) { |
221 case DC_CALL_C_DEFAULT: | 198 case DC_CALL_C_DEFAULT: |
222 case DC_CALL_C_ARM_ARMHF: | 199 case DC_CALL_C_ARM_ARMHF: |
223 self->mInterface.mVTpointer = &vt_armhf; | 200 vt = &vt_armhf; |
224 break; | 201 break; |
225 case DC_CALL_C_ELLIPSIS: | 202 case DC_CALL_C_ELLIPSIS: |
226 case DC_CALL_C_ELLIPSIS_VARARGS: | 203 case DC_CALL_C_ELLIPSIS_VARARGS: |
227 self->mInterface.mVTpointer = &vt_armhf_ellipsis; | 204 vt = &vt_armhf_ellipsis; |
228 break; | 205 break; |
229 default: | 206 default: |
230 in_self->mError = DC_ERROR_UNSUPPORTED_MODE; | 207 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; |
231 return; | 208 return; |
232 } | 209 } |
233 } | 210 dc_callvm_base_init(&self->mInterface, vt); |
234 | 211 } |
212 | |
213 /* Public API. */ | |
214 DCCallVM* dcNewCallVM(DCsize size) | |
215 { | |
216 /* Store at least 16 bytes (4 words for first 4 int args) for internal spill area. Assembly code depends on it. */ | |
217 DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16); | |
218 | |
219 mode((DCCallVM*)p, DC_CALL_C_DEFAULT); | |
220 | |
221 dcVecInit(&p->mVecHead, size); | |
222 reset((DCCallVM*)p); | |
223 | |
224 return (DCCallVM*)p; | |
225 } | |
226 |