Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_callvm_mips_eabi.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 | f5577f6bf97a |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_mips_eabi.c Mon Mar 28 23:46:59 2016 +0200 +++ b/dyncall/dyncall_callvm_mips_eabi.c Wed Apr 06 00:21:51 2016 +0200 @@ -36,34 +36,11 @@ self->mSingleRegs = 0; } -static DCCallVM* dc_callvm_new_mips_eabi(DCCallVM_vt* vt, DCsize size) -{ - /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ - DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)dcAllocMem(sizeof(DCCallVM_mips_eabi)+size+16); - dc_callvm_base_init(&self->mInterface, vt); - dcVecInit(&self->mVecHead, size); - dc_callvm_reset_mips_eabi( (DCCallVM*) self ); - return (DCCallVM*)self; -} - - static void dc_callvm_free_mips_eabi(DCCallVM* in_self) { dcFreeMem(in_self); } -static void dc_callvm_mode_mips_eabi(DCCallVM* in_self,DCint mode) -{ - switch(mode) { - case DC_CALL_C_DEFAULT: - case DC_CALL_C_ELLIPSIS: - case DC_CALL_C_MIPS32_EABI: - break; - default: - in_self->mError = DC_ERROR_UNSUPPORTED_MODE; return; - } -} - /* arg int -- fillup integer register file OR push on stack */ static void dc_callvm_argInt_mips_eabi(DCCallVM* in_self, DCint i) @@ -142,6 +119,8 @@ dcCall_mips_eabi(target, &self->mRegData, dcVecSize(&self->mVecHead), dcVecData(&self->mVecHead)); } +static void dc_callvm_mode_mips_eabi(DCCallVM* in_self, DCint mode); + DCCallVM_vt gVT_mips_eabi = { &dc_callvm_free_mips_eabi @@ -170,13 +149,37 @@ , NULL /* callStruct */ }; -DCCallVM* dcNewCallVM_mips_eabi(DCsize size) +/* mode: only a single mode available currently. */ +static void dc_callvm_mode_mips_eabi(DCCallVM* in_self, DCint mode) { - return dc_callvm_new_mips_eabi(&gVT_mips_eabi, size); + DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self; + DCCallVM_vt* vt; + + switch(mode) { + case DC_CALL_C_DEFAULT: + case DC_CALL_C_MIPS32_EABI: + case DC_CALL_C_ELLIPSIS: + case DC_CALL_C_ELLIPSIS_VARARGS: + vt = &gVT_mips_eabi; + break; + default: + self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; + return; + } + dc_callvm_base_init(&self->mInterface, vt); } +/* Public API. */ DCCallVM* dcNewCallVM(DCsize size) { - return dcNewCallVM_mips_eabi(size); + /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */ + DCCallVM_mips_eabi* p = (DCCallVM_mips_eabi*)dcAllocMem(sizeof(DCCallVM_mips_eabi)+size+16); + + dc_callvm_mode_mips_eabi((DCCallVM*)p, DC_CALL_C_DEFAULT); + + dcVecInit(&p->mVecHead, size); + dc_callvm_reset_mips_eabi((DCCallVM*)p); + + return (DCCallVM*)p; }