Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_callvm_arm64_apple.c @ 466:ddfb9577a00e
introduced platform-native thiscall mode (DC_CALL_C_DEFAULT_THIS), as needed
for upcoming aggregate support (until now only x86 platforms allowed for
specifically selecting thiscall mode, given the different conventions on
the same platform); also added respective DC_SIGCHAR_CC_THISCALL ('*')
author | Tassilo Philipp |
---|---|
date | Wed, 02 Feb 2022 18:30:44 +0100 |
parents | 4d6c594b15ab |
children | 71c884e610f0 |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_arm64_apple.c Wed Feb 02 12:55:23 2022 +0100 +++ b/dyncall/dyncall_callvm_arm64_apple.c Wed Feb 02 18:30:44 2022 +0100 @@ -6,7 +6,7 @@ Description: ARM 64-bit Apple ABI implementation License: - Copyright (c) 2015-2020 Daniel Adler <dadler@uni-goettingen.de>, + Copyright (c) 2015-2020 Daniel Adler <dadler@uni-goettingen.de>, Tassilo Philipp <tphilipp@potion-studios.com> Permission to use, copy, modify, and distribute this software for any @@ -59,8 +59,8 @@ } } -static void var_i64 (DCCallVM* in_p, DClonglong x) -{ +static void var_i64 (DCCallVM* in_p, DClonglong x) +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; dcVecAlign(&p->mVecHead, sizeof(DClonglong)); dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong)); @@ -73,17 +73,17 @@ static void var_double (DCCallVM* in_p, DCdouble x) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; dcVecAlign(&p->mVecHead, sizeof(DCdouble)); - dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble)); -} -static void var_float (DCCallVM* in_p, DCfloat x) { + dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble)); +} +static void var_float (DCCallVM* in_p, DCfloat x) { var_double( in_p, (DCdouble) x ); } static void var_pointer (DCCallVM* in_p, DCpointer x) { var_i64(in_p, (DClonglong) x ); } -static void a_bool (DCCallVM* in_p, DCbool x) -{ +static void a_bool (DCCallVM* in_p, DCbool x) +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->i < 8) { p->I[p->i] = (DClonglong) x; @@ -94,7 +94,7 @@ } } static void a_char (DCCallVM* in_p, DCchar x) -{ +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->i < 8) { p->I[p->i] = (DClonglong) x; @@ -103,8 +103,8 @@ dcVecAppend(&p->mVecHead, &x, sizeof(DCchar)); } } -static void a_short (DCCallVM* in_p, DCshort x) -{ +static void a_short (DCCallVM* in_p, DCshort x) +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->i < 8) { p->I[p->i] = (DClonglong) x; @@ -114,8 +114,8 @@ dcVecAppend(&p->mVecHead, &x, sizeof(DCshort)); } } -static void a_int (DCCallVM* in_p, DCint x) -{ +static void a_int (DCCallVM* in_p, DCint x) +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->i < 8) { p->I[p->i] = (DClonglong) x; @@ -125,8 +125,8 @@ dcVecAppend(&p->mVecHead, &x, sizeof(DCint)); } } -static void a_long (DCCallVM* in_p, DClong x) -{ +static void a_long (DCCallVM* in_p, DClong x) +{ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->i < 8) { p->I[p->i] = (DClonglong) x; @@ -156,7 +156,7 @@ DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; if (p->f < 8) { p->u.D[ p->f ] = x; - p->f++; + p->f++; } else { dcVecAlign(&p->mVecHead, sizeof(DCdouble)); dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble)); @@ -166,11 +166,11 @@ void call(DCCallVM* in_p, DCpointer target) { DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; - + /* ** copy 'size' argument is given in number of 16-byte 'pair' blocks. */ - + dcCall_arm64(target, dcVecData(&p->mVecHead), ( dcVecSize(&p->mVecHead) + 15 ) & -16, &p->u.S[0]); } @@ -183,7 +183,7 @@ , &mode , &a_bool , &a_char -, &a_short +, &a_short , &a_int , &a_long , &a_i64 @@ -211,7 +211,7 @@ , &mode , &var_bool , &var_char -, &var_short +, &var_short , &var_int , &var_long , &var_i64 @@ -238,7 +238,8 @@ DCCallVM_vt* vt; switch(mode) { - case DC_CALL_C_DEFAULT: + case DC_CALL_C_DEFAULT: + case DC_CALL_C_DEFAULT_THIS: case DC_CALL_C_ARM64: case DC_CALL_C_ELLIPSIS: vt = &vt_arm64; @@ -246,15 +247,15 @@ case DC_CALL_C_ELLIPSIS_VARARGS: vt = &vt_arm64_variadic; break; - default: - self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; + default: + self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; } dc_callvm_base_init(&self->mInterface, vt); } /* Public API. */ -DCCallVM* dcNewCallVM(DCsize size) +DCCallVM* dcNewCallVM(DCsize size) { DCCallVM_arm64* p = (DCCallVM_arm64*)dcAllocMem(sizeof(DCCallVM_arm64)+size);