Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_callvm_x64.c @ 546:ba70fb631bea
x64:
* support for non-standard aggr-by-value packing (#pragma pack, etc.)
* callbacks: handling callconv prefixes in signature
author | Tassilo Philipp |
---|---|
date | Tue, 31 May 2022 19:29:34 +0200 |
parents | 71c884e610f0 |
children | a93bb23fca8c |
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_x64.c Tue May 31 18:35:06 2022 +0200 +++ b/dyncall/dyncall_callvm_x64.c Tue May 31 19:29:34 2022 +0200 @@ -168,8 +168,8 @@ DCCallVM_x64* self = (DCCallVM_x64*)in_self; if (!ag) { - /* non-trivial aggrs (C++) are passed via pointer (win and sysv callconv), - * copy has to be provided by user, as dyncall cannot do such copies*/ + /* non-trivial aggrs (C++) are passed via pointer (win and sysv callconv), + * copy has to be provided by user, as dyncall cannot do such copies*/ dc_callvm_argPointer_x64(in_self, (DCpointer)x); return; } @@ -254,7 +254,7 @@ #if defined(DC_UNIX) if (!ag || (ag->sysv_classes[0] == SYSVC_MEMORY)) { #else - if (!ag || ag->size > 8) { + if (!ag || ag->size > 8 || /*not a power of 2?*/(ag->size & (ag->size - 1))) #endif /* pass pointer to aggregate as hidden first argument */ self->mAggrReturnReg = 0; @@ -269,10 +269,8 @@ assert(self->mRegCount.i == 0 && self->mRegCount.f == 0 && "dc_callvm_begin_aggr_x64_win64_this should be called before any function arguments are declared"); - if (!ag || ag->size > 8) { - /* thiscall: this-ptr comes first, then pointer to aggregate as hidden (second) argument */ - self->mAggrReturnReg = 1; - } + /* thiscall: this-ptr comes first, then pointer to aggregate as hidden (second) argument */ + self->mAggrReturnReg = 1; } #endif