# HG changeset patch # User cslag # Date 1438449201 -7200 # Node ID 17b10cc8ce8bff1ab0af398c731eb562785624fb # Parent 29f6ef6b170eb4a1b4ab26919d4b0fe9f3e4c5a2 - fix for arm on some platforms (e.g. freebsd/arm32, nintendo ds) to keep compiler from overwriting return values in caller-cleanup code diff -r 29f6ef6b170e -r 17b10cc8ce8b dyncall/dyncall_callvm_arm32_arm.c --- a/dyncall/dyncall_callvm_arm32_arm.c Sat Jul 25 22:45:14 2015 +0200 +++ b/dyncall/dyncall_callvm_arm32_arm.c Sat Aug 01 19:13:21 2015 +0200 @@ -149,7 +149,11 @@ void dc_callvm_call_arm32_arm(DCCallVM* in_self, DCpointer target) { DCCallVM_arm32_arm* self = (DCCallVM_arm32_arm*)in_self; - dcCall_arm32_arm(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); + // This cast is needed in order for the cleanup code in the caller (this very function) to not + // overwrite and use r0 and r1, as we want to pass them back. On some platforms (FreeBSD/arm, Nintendo DS + // the compiler generates cleanup code that writes to those registers by assuming dcCall_arm32_arm didn't + // use them. + ((DClonglong(*)(DCpointer, DCpointer, DCsize))&dcCall_arm32_arm)(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead)); }