diff dyncall/dyncall_callvm_ppc32.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 ad5f9803f52f
children 71c884e610f0
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_ppc32.c	Wed Feb 02 12:55:23 2022 +0100
+++ b/dyncall/dyncall_callvm_ppc32.c	Wed Feb 02 18:30:44 2022 +0100
@@ -3,10 +3,10 @@
  Package: dyncall
  Library: dyncall
  File: dyncall/dyncall_callvm_ppc32.c
- Description: 
+ Description:
  License:
 
-   Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>, 
+   Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
                            Tassilo Philipp <tphilipp@potion-studios.com>
 
    Permission to use, copy, modify, and distribute this software for any
@@ -30,9 +30,9 @@
   dyncall callvm for ppc32 architectures
 
   SUPPORTED CALLING CONVENTIONS
-  ppc32/osx 
+  ppc32/osx
   ppc32/linux (sysv abi)
-  ppc32/syscall 
+  ppc32/syscall
 
   REVISION
   2015/01/15 added syscall (tested on Linux)
@@ -48,7 +48,7 @@
 #include "dyncall_utils.h"
 
 
-/* 
+/*
 ** PowerPC 32-bit calling convention call
 **
 ** - hybrid return-type call (bool ... pointer)
@@ -108,7 +108,7 @@
   if (self->mIntRegs < 8)
     self->mRegData.mIntData[self->mIntRegs++] = i;
   /* OR push onto stack */
-  else 
+  else
     dcVecAppend(&self->mVecHead,&i,sizeof(DCint));
 }
 
@@ -122,9 +122,9 @@
   if (self->mFloatRegs < 13) {
     self->mRegData.mFloatData[self->mFloatRegs++] = d;
     /* skip two integer register file entries */
-    if (self->mIntRegs < 8) 
+    if (self->mIntRegs < 8)
       self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0];
-    if (self->mIntRegs < 8) 
+    if (self->mIntRegs < 8)
       self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1];
   }
   /* push on stack */
@@ -138,9 +138,9 @@
   if (self->mFloatRegs < 8) {
     self->mRegData.mFloatData[self->mFloatRegs++] = d;
     /* skip two integer register file entries */
-    if (self->mIntRegs < 8) 
+    if (self->mIntRegs < 8)
       self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0];
-    if (self->mIntRegs < 8) 
+    if (self->mIntRegs < 8)
       self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1];
   }
   /* push on stack */
@@ -150,24 +150,24 @@
 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d)
 {
   DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
-  if (self->mFloatRegs < 8) 
+  if (self->mFloatRegs < 8)
     self->mRegData.mFloatData[self->mFloatRegs++] = d;
   else /* OR push data on stack */
   {
     /* align stack to 8 byte boundary */
-  dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL ); 
+  dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL );
     /* AND push data */
     dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble));
   }
 }
 
 /* Floating-point */
-  
-  
+
+
 /* darwin:
- * - skip one integer register file entry (write in - for ellipsis calls) 
+ * - skip one integer register file entry (write in - for ellipsis calls)
  * sysv:
- * - 
+ * -
  */
 
 static void dc_callvm_argFloat_ppc32_darwin(DCCallVM* in_self, DCfloat f)
@@ -176,14 +176,14 @@
   if (self->mFloatRegs < 13) {
     self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
   }
-  
+
   /* AND skip one integer register file entry (write in - for ellipsis calls) */
-  
-  if (self->mIntRegs < 8) 
+
+  if (self->mIntRegs < 8)
     self->mRegData.mIntData[self->mIntRegs++] = *( (DCint*) &f );
-  
+
   /* AND push on stack */
-  
+
   dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
 }
 
@@ -195,7 +195,7 @@
 
   if (self->mFloatRegs < 8)
     self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
-  
+
   else /* OR put float on stack */
     dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
 }
@@ -224,7 +224,7 @@
     self->mRegData.mIntData[self->mIntRegs++] = p[1];
   }
   /* OR push onto stack */
-  else  
+  else
   {
     /* in case, mIntRegs == 7, set it to 8 */
     self->mIntRegs = 8;
@@ -273,9 +273,9 @@
 void dc_callvm_call_ppc32_darwin(DCCallVM* in_self, DCpointer target)
 {
   DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
-  dcCall_ppc32_darwin( 
-    target, 
-    &self->mRegData, 
+  dcCall_ppc32_darwin(
+    target,
+    &self->mRegData,
     DC_MAX(dcVecSize(&self->mVecHead), 8*4),
     dcVecData(&self->mVecHead)
   );
@@ -302,7 +302,7 @@
 , &dc_callvm_mode_ppc32
 , &dc_callvm_argBool_ppc32
 , &dc_callvm_argChar_ppc32
-, &dc_callvm_argShort_ppc32 
+, &dc_callvm_argShort_ppc32
 , &dc_callvm_argInt_ppc32_darwin
 , &dc_callvm_argLong_ppc32
 , &dc_callvm_argLongLong_ppc32_darwin
@@ -330,7 +330,7 @@
 , &dc_callvm_mode_ppc32
 , &dc_callvm_argBool_ppc32
 , &dc_callvm_argChar_ppc32
-, &dc_callvm_argShort_ppc32 
+, &dc_callvm_argShort_ppc32
 , &dc_callvm_argInt_ppc32_sysv
 , &dc_callvm_argLong_ppc32
 , &dc_callvm_argLongLong_ppc32_sysv
@@ -358,7 +358,7 @@
 , &dc_callvm_mode_ppc32
 , &dc_callvm_argBool_ppc32
 , &dc_callvm_argChar_ppc32
-, &dc_callvm_argShort_ppc32 
+, &dc_callvm_argShort_ppc32
 , &dc_callvm_argInt_ppc32_sysv
 , &dc_callvm_argLong_ppc32
 , &dc_callvm_argLongLong_ppc32_sysv
@@ -389,19 +389,21 @@
 
 #if defined(DC__ABI_Darwin)
     case DC_CALL_C_DEFAULT:
+    case DC_CALL_C_DEFAULT_THIS:
     case DC_CALL_C_ELLIPSIS:
     case DC_CALL_C_ELLIPSIS_VARARGS:
 #endif
-    case DC_CALL_C_PPC32_OSX:  
-      vt = &gVT_ppc32_darwin; 
+    case DC_CALL_C_PPC32_OSX:
+      vt = &gVT_ppc32_darwin;
       break;
 
 #if defined(DC__ABI_SysV)
     case DC_CALL_C_DEFAULT:
+    case DC_CALL_C_DEFAULT_THIS:
     case DC_CALL_C_ELLIPSIS:
     case DC_CALL_C_ELLIPSIS_VARARGS:
 #endif
-    case DC_CALL_C_PPC32_SYSV: 
+    case DC_CALL_C_PPC32_SYSV:
       vt = &gVT_ppc32_sysv;
       break;
 
@@ -410,8 +412,8 @@
       vt = &gVT_ppc32_syscall;
       break;
 
-    default: 
-      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
+    default:
+      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
       return;
   }