Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_callvm_mips_o32.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 | 3e629dc19168 |
children | 1ce60358fbad |
comparison
equal
deleted
inserted
replaced
83:54930a037e8a | 84:67961454902b |
---|---|
58 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; | 58 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; |
59 dcVecReset(&self->mVecHead); | 59 dcVecReset(&self->mVecHead); |
60 self->mArgCount = 0; | 60 self->mArgCount = 0; |
61 } | 61 } |
62 | 62 |
63 static DCCallVM* dc_callvm_new_mips_o32(DCCallVM_vt* vt, DCsize size) | |
64 { | |
65 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size); | |
66 dc_callvm_base_init(&self->mInterface, vt); | |
67 dcVecInit(&self->mVecHead, size); | |
68 dc_callvm_reset_mips_o32( (DCCallVM*) self ); | |
69 return (DCCallVM*)self; | |
70 } | |
71 | |
72 | 63 |
73 static void dc_callvm_free_mips_o32(DCCallVM* in_self) | 64 static void dc_callvm_free_mips_o32(DCCallVM* in_self) |
74 { | 65 { |
75 dcFreeMem(in_self); | 66 dcFreeMem(in_self); |
76 } | |
77 | |
78 static void dc_callvm_mode_mips_o32(DCCallVM* self, DCint mode) | |
79 { | |
80 switch(mode) { | |
81 case DC_CALL_C_DEFAULT: | |
82 case DC_CALL_C_ELLIPSIS: | |
83 case DC_CALL_C_MIPS32_O32: | |
84 break; | |
85 default: | |
86 self->mError = DC_ERROR_UNSUPPORTED_MODE; | |
87 break; | |
88 } | |
89 } | 67 } |
90 | 68 |
91 /* arg int -- fillup integer register file OR push on stack */ | 69 /* arg int -- fillup integer register file OR push on stack */ |
92 | 70 |
93 static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i) | 71 static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i) |
192 | 170 |
193 size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); | 171 size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) ); |
194 | 172 |
195 dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); | 173 dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead)); |
196 } | 174 } |
175 | |
176 static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode); | |
197 | 177 |
198 DCCallVM_vt gVT_mips_o32 = | 178 DCCallVM_vt gVT_mips_o32 = |
199 { | 179 { |
200 &dc_callvm_free_mips_o32 | 180 &dc_callvm_free_mips_o32 |
201 , &dc_callvm_reset_mips_o32 | 181 , &dc_callvm_reset_mips_o32 |
221 , (DCdoublevmfunc*) &dc_callvm_call_mips_o32 | 201 , (DCdoublevmfunc*) &dc_callvm_call_mips_o32 |
222 , (DCpointervmfunc*) &dc_callvm_call_mips_o32 | 202 , (DCpointervmfunc*) &dc_callvm_call_mips_o32 |
223 , NULL /* callStruct */ | 203 , NULL /* callStruct */ |
224 }; | 204 }; |
225 | 205 |
226 DCCallVM* dcNewCallVM_mips_o32(DCsize size) | 206 /* mode: only a single mode available currently. */ |
227 { | 207 static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode) |
228 return dc_callvm_new_mips_o32(&gVT_mips_o32, size); | 208 { |
229 } | 209 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self; |
230 | 210 DCCallVM_vt* vt; |
231 | 211 |
212 switch(mode) { | |
213 case DC_CALL_C_DEFAULT: | |
214 case DC_CALL_C_MIPS32_O32: | |
215 case DC_CALL_C_ELLIPSIS: | |
216 case DC_CALL_C_ELLIPSIS_VARARGS: | |
217 vt = &gVT_mips_o32; | |
218 break; | |
219 default: | |
220 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; | |
221 return; | |
222 } | |
223 dc_callvm_base_init(&self->mInterface, vt); | |
224 } | |
225 | |
226 /* Public API. */ | |
232 DCCallVM* dcNewCallVM(DCsize size) | 227 DCCallVM* dcNewCallVM(DCsize size) |
233 { | 228 { |
234 return dcNewCallVM_mips_o32(size); | 229 DCCallVM_mips_o32* p = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size); |
235 } | 230 |
236 | 231 dc_callvm_mode_mips_o32((DCCallVM*)p, DC_CALL_C_DEFAULT); |
232 | |
233 dcVecInit(&p->mVecHead, size); | |
234 dc_callvm_reset_mips_o32((DCCallVM*)p); | |
235 | |
236 return (DCCallVM*)p; | |
237 } | |
238 |