[Top][All Lists]
[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(®parms, 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));
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r86 - in trunk/cinvoke: lib lib/arch test,
will <=