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);