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