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