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