cinvoke-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cinvoke-svn] r86 - in trunk/cinvoke: lib lib/arch test


From: will
Subject: [cinvoke-svn] r86 - in trunk/cinvoke: lib lib/arch test
Date: 12 Jul 2006 00:55:28 -0400

Author: will
Date: 2006-07-12 00:55:28 -0400 (Wed, 12 Jul 2006)
New Revision: 86

Modified:
   trunk/cinvoke/lib/arch/cl_x86_win.c
   trunk/cinvoke/lib/arch/empty_empty_empty.c
   trunk/cinvoke/lib/arch/gcc_ppc_osx.c
   trunk/cinvoke/lib/arch/gcc_x64_unix.c
   trunk/cinvoke/lib/arch/gcc_x86_unix.c
   trunk/cinvoke/lib/cinvoke-arch.h
   trunk/cinvoke/lib/cinvoke-private.h
   trunk/cinvoke/lib/cinvoke.c
   trunk/cinvoke/lib/cinvoke.h
   trunk/cinvoke/lib/structure.c
   trunk/cinvoke/test/runtests.c
Log:
tuned the stack algorithms to remove redundancies and work
better across different architectures


Modified: trunk/cinvoke/lib/arch/cl_x86_win.c
===================================================================
--- trunk/cinvoke/lib/arch/cl_x86_win.c 2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/arch/cl_x86_win.c 2006-07-12 04:55:28 UTC (rev 86)
@@ -279,48 +279,48 @@
 }
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 2;
        *structalign_out = 2;
 }
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;

Modified: trunk/cinvoke/lib/arch/empty_empty_empty.c
===================================================================
--- trunk/cinvoke/lib/arch/empty_empty_empty.c  2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/arch/empty_empty_empty.c  2006-07-12 04:55:28 UTC (rev 86)
@@ -216,64 +216,64 @@
 
 // TODO: Finally, these eight functions give the sizes
 // and alignments for different types.  Two sizes and
-// alignments are given, one for the stack when passing
+// are given, one for the stack when passing
 // parameters, and one for values inside a structure
-// (for an automatic or heap variable).  It is important
-// to differentiate these; for example, on x86, a char
-// takes up 1 byte in a struct but is pushed on the stack
-// as 4 bytes when passed as an argument.  Also, gcc for x86
-// aligns 8-byte integers on a 4-byte boundary in structures,
-// but Microsoft cl aligns them on an 8-byte boundary.  If you
-// do not set either stackalign_out or structalign_out, then
-// they are implcitly assumed to be 1.
+// (for an automatic or heap variable), as well as the alignment
+// in a struct.  It is important to differentiate these;
+// for example, on x86, a char takes up 1 byte in a struct but
+// is pushed on the stack as 4 bytes when passed as an argument.
+// Also, gcc for x86 aligns 8-byte integers on a 4-byte boundary
+// in structures, but Microsoft cl aligns them on an 8-byte
+// boundary.  If you do not set structalign_out, then
+// it is implcitly assumed to be 1.
 
 // Incidentally, the best way to determine these values
 // (and just about everything else in this file and the header)
 // is not by consulting docs but by writing test programs, and
 // using your C compiler to dump them to assembly.
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 2;
        *structalign_out = 2;
 }
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 4;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 4;
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;

Modified: trunk/cinvoke/lib/arch/gcc_ppc_osx.c
===================================================================
--- trunk/cinvoke/lib/arch/gcc_ppc_osx.c        2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/arch/gcc_ppc_osx.c        2006-07-12 04:55:28 UTC (rev 86)
@@ -308,48 +308,48 @@
 }
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 2;
        *structalign_out = 2;
 }
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 4;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;

Modified: trunk/cinvoke/lib/arch/gcc_x64_unix.c
===================================================================
--- trunk/cinvoke/lib/arch/gcc_x64_unix.c       2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/arch/gcc_x64_unix.c       2006-07-12 04:55:28 UTC (rev 86)
@@ -276,48 +276,48 @@
 }
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 2;
        *structalign_out = 2;
 }
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 8;

Modified: trunk/cinvoke/lib/arch/gcc_x86_unix.c
===================================================================
--- trunk/cinvoke/lib/arch/gcc_x86_unix.c       2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/arch/gcc_x86_unix.c       2006-07-12 04:55:28 UTC (rev 86)
@@ -166,48 +166,48 @@
 }
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 2;
        *structalign_out = 2;
 }
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 4;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;
 }
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 8;
        *structsize_out = 8;
        *structalign_out = 4;
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out) {
+       int *structalign_out) {
        *stacksize_out = 4;
        *structsize_out = 4;
        *structalign_out = 4;

Modified: trunk/cinvoke/lib/cinvoke-arch.h
===================================================================
--- trunk/cinvoke/lib/cinvoke-arch.h    2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/cinvoke-arch.h    2006-07-12 04:55:28 UTC (rev 86)
@@ -128,21 +128,21 @@
 void arch_setval_ptr(ArchRetValue *archval, void *val);
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_short(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_int(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_long(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_extralong(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_float(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_double(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
-       int *stackalign_out, int *structalign_out);
+       int *structalign_out);
 
 #ifdef __cplusplus
 }

Modified: trunk/cinvoke/lib/cinvoke-private.h
===================================================================
--- trunk/cinvoke/lib/cinvoke-private.h 2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/cinvoke-private.h 2006-07-12 04:55:28 UTC (rev 86)
@@ -34,6 +34,6 @@
 void context_clear_error(CInvContext *context);
 void context_set_nomem(CInvContext *context);
 void get_size(cinv_type_t type, int *stacksize, int *structsize,
-       int *stackalign, int *structalign);
+       int *structalign);
 
 #endif

Modified: trunk/cinvoke/lib/cinvoke.c
===================================================================
--- trunk/cinvoke/lib/cinvoke.c 2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/cinvoke.c 2006-07-12 04:55:28 UTC (rev 86)
@@ -138,7 +138,7 @@
        return CINV_ERROR;
 }
 
-typedef void (*sizefunc)(int *, int *, int *, int *);
+typedef void (*sizefunc)(int *, int *, int *);
 
 static sizefunc _sizefuncs[CINV_NUM_TYPES] = {
        arch_size_char,
@@ -152,14 +152,13 @@
 };
 
 void get_size(cinv_type_t type, int *stacksize, int *structsize,
-       int *stackalign, int *structalign) {
+       int *structalign) {
        sizefunc func;
-       *stackalign = 1;
        *structalign = 1;
        if (type < 0 || type > CINV_NUM_TYPES - 1)
                fprintf(stderr, "cinvoke developer error: unknown type %d\n", 
type);
        func = _sizefuncs[type];
-       func(stacksize, structsize, stackalign, structalign);
+       func(stacksize, structsize, structalign);
 }
 
 typedef void (*pullfunc)(ArchRetValue*, void*);
@@ -248,21 +247,18 @@
                return NULL;
        }
        function->parmstacksizes = NULL;
-       function->parmalignments = NULL;
        function->parmmemsizes = NULL;
        function->parmtypes = NULL;
        function->regparms = NULL;
        if (function->numparms > 0) {
                function->parmstacksizes = malloc(function->numparms * 
sizeof(int));
-               function->parmalignments = malloc(function->numparms * 
sizeof(int));
                function->parmmemsizes = malloc(function->numparms * 
sizeof(int));
                function->parmtypes = malloc(function->numparms * 
sizeof(cinv_type_t));
                function->regparms = malloc(function->numparms * sizeof(int));
 
-               if (!function->parmstacksizes || !function->parmalignments ||
-                       !function->parmmemsizes || !function->parmtypes) {
+               if (!function->parmstacksizes || !function->parmmemsizes
+                       || !function->parmtypes) {
                        free(function->parmstacksizes);
-                       free(function->parmalignments);
                        free(function->parmmemsizes);
                        free(function->parmtypes);
                        free(function->regparms);
@@ -272,11 +268,10 @@
                }
 
                for (index = 0; index < function->numparms; index++) {
-                       int sz, align, memsize, dummy;
+                       int sz, memsize, dummy;
                        cinv_type_t type;
                        if (!parse_type(parameterformat[index], &type)) {
                                free(function->parmstacksizes);
-                               free(function->parmalignments);
                                free(function->parmmemsizes);
                                free(function->parmtypes);
                                free(function->regparms);
@@ -286,9 +281,8 @@
                                return NULL;
                        }
 
-                       get_size(type, &sz, &memsize, &align, &dummy);
+                       get_size(type, &sz, &memsize, &dummy);
                        function->parmstacksizes[index] = sz;
-                       function->parmalignments[index] = align;
                        function->parmmemsizes[index] = memsize;
                        function->parmtypes[index] = type;
                }
@@ -302,14 +296,10 @@
                                continue;
 #endif
 
-                       if ((function->stacksize % 
function->parmalignments[index]) != 0)
-                               function->stacksize += 
(function->parmalignments[index] -
-                                       (function->stacksize % 
function->parmalignments[index]));
                        function->stacksize += function->parmstacksizes[index];
 
                        if (function->stacksize < 0) {
                                free(function->parmstacksizes);
-                               free(function->parmalignments);
                                free(function->parmmemsizes);
                                free(function->parmtypes);
                                free(function->regparms);
@@ -327,7 +317,6 @@
 cinv_status_t cinv_function_delete(CInvContext *context,
        CInvFunction *function) {
        free(function->parmstacksizes);
-       free(function->parmalignments);
        free(function->parmmemsizes);
        free(function->parmtypes);
        free(function->regparms);
@@ -336,12 +325,27 @@
        return CINV_SUCCESS;
 }
 
+#define MEMCPY_MACRO(dest, src, len) \
+while (len) { \
+       *(dest) = *(src); \
+       (dest)++; \
+       (src)++; \
+       (len)--; \
+}
+
+#define MEMZERO_MACRO(dest, len) \
+while (len) { \
+       *(dest) = '\0'; \
+       (dest)++; \
+       (len)--; \
+}
+
 cinv_status_t cinv_function_invoke(CInvContext *context,
        CInvFunction *function, void *entrypoint,
        void *returnvalout, void **parameters) {
        ArchRetValue retval;
        ArchRegParms regparms;
-       int stackindex = 0, i;
+       int i;
        int stacksize = function->stacksize;
        char *stackptr;
 
@@ -353,17 +357,15 @@
                ARCH_GET_STACK(stackptr);
 
 #if ARCH_STACK_SKIPTOP
-               stackindex += ARCH_STACK_SKIPTOP;
-#if ARCH_STACK_GROWS_DOWN
+       #if ARCH_STACK_GROWS_DOWN
                stackptr += ARCH_STACK_SKIPTOP;
-#else
+       #else
                stackptr -= ARCH_STACK_SKIPTOP;
+       #endif
 #endif
-#endif
 
                for (i = 0; i < function->numparms; i++) {
                        int len = function->parmstacksizes[i];
-                       int align = function->parmalignments[i];
                        int memsize = function->parmmemsizes[i];
                        int regparm = function->regparms[i];
                        int diff = len - memsize;
@@ -374,82 +376,28 @@
                                continue;
 #endif
 
-                       if ((stackindex % align) != 0) {
-                               int s = (align - (stackindex % align));
-                               stackindex += s;
-#if ARCH_STACK_GROWS_DOWN
-                               stackptr += s;
-#else
-                               stackptr -= s;
-#endif
-                       }
-
 #if ARCH_REGPARMS_IN_STACKSIZE
                        if (regparm) {
-                               stackindex += len;
-#if ARCH_STACK_GROWS_DOWN
+       #if ARCH_STACK_GROWS_DOWN
                                stackptr += len;
-#else
+       #else
                                stackptr -= len;
-#endif
+       #endif
                                continue;
                        }
 #endif
 
-                       stackindex += len;
-#if ARCH_STACK_GROWS_DOWN
-#if ARCH_BIG_ENDIAN
-                       while (diff) {
-                               *stackptr = '\0';
-                               stackptr++;
-                               diff--;
-                       }
-                       while (memsize) {
-                               *stackptr = *param;
-                               *stackptr++;
-                               *param++;
-                               memsize--;
-                       }
-#else
-                       while (memsize) {
-                               *stackptr = *param;
-                               *stackptr++;
-                               *param++;
-                               memsize--;
-                       }
-                       while (diff) {
-                               *stackptr = '\0';
-                               stackptr++;
-                               diff--;
-                       }
-#endif
-#else
+#if !ARCH_STACK_GROWS_DOWN
                        stackptr -= len;
+#endif
 #if ARCH_BIG_ENDIAN
-                       while (diff) {
-                               *stackptr = '\0';
-                               stackptr++;
-                               diff--;
-                       
-                       while (memsize) {
-                               *stackptr = *param;
-                               *stackptr++;
-                               *param++;
-                               memsize--;
-                       }
+                       MEMZERO_MACRO(stackptr, diff)
+                       MEMCPY_MACRO(stackptr, param, memsize)
 #else
-                       while (memsize) {
-                               *stackptr = *param;
-                               *stackptr++;
-                               *param++;
-                               memsize--;
-                       }
-                       while (diff) {
-                               *stackptr = '\0';
-                               stackptr++;
-                               diff--;
-                       }
+                       MEMCPY_MACRO(stackptr, param, memsize)
+                       MEMZERO_MACRO(stackptr, diff)
 #endif
+#if !ARCH_STACK_GROWS_DOWN
                        stackptr -= len;
 #endif
                }
@@ -488,15 +436,17 @@
 #else
                frameptr -= ARCH_CALLBACK_ARG_OFFSET;
 #endif
-       if (cb->prototype->numparms) {
-               int numbytes = 0;
 
+       if (cb->prototype->numparms) {
                parameters = malloc(sizeof(void*) * cb->prototype->numparms);
                if (!parameters)
                        return;
                for (i = 0; i < cb->prototype->numparms; i++) {
-                       int smaller;
-                       parameters[i] = malloc(cb->prototype->parmmemsizes[i]);
+                       int memsize = cb->prototype->parmmemsizes[i];
+                       int stacksize = cb->prototype->parmstacksizes[i];
+                       int diff = stacksize - memsize;
+
+                       parameters[i] = malloc(memsize);
                        if (!parameters[i]) {
                                int j;
                                for (j = 0; j < i; j++)
@@ -505,45 +455,55 @@
                                return;
                        }
 
-               // XXX check regparms in stacksize
+#if ARCH_STACK_SKIPTOP
+                       numbytes += ARCH_STACK_SKIPTOP;
+       #if ARCH_STACK_GROWS_DOWN
+                       frameptr += ARCH_STACK_SKIPTOP;
+       #else
+                       frameptr -= ARCH_STACK_SKIPTOP;
+       #endif
+#endif
+
+#if ARCH_REGPARMS_IN_STACKSIZE
+                       if (cb->prototype->regparms[i]) {
+                               numbytes += stacksize;
+       #if ARCH_STACK_GROWS_DOWN
+                               stackptr += stacksize;
+       #else
+                               stackptr -= stacksize;
+       #endif
+                               continue;
+                       }
+#else
                        if (cb->prototype->regparms[i])
                                continue;
-               // XXX fix for stack directions/big-endian
-                       #if ARCH_STACK_GROWS_DOWN 
-                               if ((numbytes % 
cb->prototype->parmalignments[i]) != 0) {
-                                       int fix = 
cb->prototype->parmalignments[i] -
-                                               (numbytes % 
cb->prototype->parmalignments[i]);
-                                       frameptr += fix;
-                                       numbytes += fix;
-                               }
+#endif
 
-                               smaller = cb->prototype->parmmemsizes[i];
-                               if (cb->prototype->parmstacksizes[i] < smaller)
-                                       smaller = 
cb->prototype->parmstacksizes[i];
-                               memcpy(parameters[i], frameptr, smaller);
-                               frameptr += cb->prototype->parmstacksizes[i];
-                               numbytes += cb->prototype->parmstacksizes[i];
-                       #else
-                               frameptr -= cb->prototype->parmstacksizes[i];
-                               numbytes += cb->prototype->parmstacksizes[i];
-
-                               if ((numbytes % 
cb->prototype->parmalignments[i]) != 0) {
-                                       int fix = 
cb->prototype->parmalignments[i] -
-                                               (numbytes % 
cb->prototype->parmalignments[i]);
-                                       frameptr -= fix;
-                                       numbytes += fix;
-                               }
-
-                               smaller = cb->prototype->parmmemsizes[i];
-                               if (cb->prototype->parmstacksizes[i] < smaller)
-                                       smaller = 
cb->prototype->parmstacksizes[i];
-                               memcpy(parameters[i], frameptr, smaller);
-                       #endif
+#if ARCH_STACK_GROWS_DOWN
+       #if ARCH_BIG_ENDIAN
+                       frameptr += diff;
+                       memcpy(parameters[i], frameptr, memsize);
+                       frameptr += memsize;
+       #else
+                       memcpy(parameters[i], frameptr, memsize);
+                       frameptr += stacksize;
+       #endif
+#else
+                       frameptr -= stacksize;
+       #if ARCH_BIG_ENDIAN
+                       frameptr += diff;
+                       memcpy(parameters[i], frameptr, memsize);
+                       frameptr -= diff;
+       #else
+                       memcpy(parameters[i], frameptr, memsize);
+       #endif
+#endif
                }
 
                arch_get_register_parms(&regparms, cb->prototype->callconv,
                        cb->prototype->numparms, parameters, 
cb->prototype->parmtypes);
        }
+
        cb->cbfunc(cb->prototype, parameters, &returnptr, cb->userdata);
        
        if (cb->prototype->hasreturn) {

Modified: trunk/cinvoke/lib/cinvoke.h
===================================================================
--- trunk/cinvoke/lib/cinvoke.h 2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/cinvoke.h 2006-07-12 04:55:28 UTC (rev 86)
@@ -124,7 +124,6 @@
        cinv_type_t rettype;
        int numparms;
        int *parmstacksizes;
-       int *parmalignments;
        int *parmmemsizes;
        cinv_type_t *parmtypes;
        int *regparms;

Modified: trunk/cinvoke/lib/structure.c
===================================================================
--- trunk/cinvoke/lib/structure.c       2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/lib/structure.c       2006-07-12 04:55:28 UTC (rev 86)
@@ -77,7 +77,7 @@
                return CINV_ERROR;
        }
 
-       get_size(type, &dummy, &sz, &dummy, &align);
+       get_size(type, &dummy, &sz, &align);
        if ((structure->nextoffset % align) != 0)
                structure->nextoffset += align - (structure->nextoffset % 
align);
 
@@ -213,7 +213,7 @@
                *sz = m->structtype->nextoffset;
        } else {
                *is_struct = 0;
-               get_size(m->type, &dummy, sz, &dummy, &dummy);
+               get_size(m->type, &dummy, sz, &dummy);
        }
 
        return m->offset;

Modified: trunk/cinvoke/test/runtests.c
===================================================================
--- trunk/cinvoke/test/runtests.c       2006-07-11 02:39:01 UTC (rev 85)
+++ trunk/cinvoke/test/runtests.c       2006-07-12 04:55:28 UTC (rev 86)
@@ -429,12 +429,10 @@
        UPDATE(test6, "e", "iefdc");
        UPDATE0(test7);
        UPDATE0(test8);
-//     UPDATE(test9, "", "p");
-       printf("skipped test9\n"); failed++;
+       UPDATE(test9, "", "p");
        UPDATE(test10, "f", "isclliils");
-//     UPDATE(test11, "", "p");
-       printf("skipped test11\n"); failed++;
-       
+       UPDATE(test11, "", "p");
+
        if (!cinv_library_delete(ctx, lib)) {
                fprintf(stderr, "Error deleting library: %s\n",
                        cinv_context_geterrormsg(ctx));





reply via email to

[Prev in Thread] Current Thread [Next in Thread]