[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cinvoke-svn] r105 - in trunk/cinvoke: lib lib/arch test
From: |
will |
Subject: |
[cinvoke-svn] r105 - in trunk/cinvoke: lib lib/arch test |
Date: |
11 Aug 2006 15:51:43 -0400 |
Author: will
Date: 2006-08-11 15:51:43 -0400 (Fri, 11 Aug 2006)
New Revision: 105
Modified:
trunk/cinvoke/lib/arch/gcc_sparc_unix.c
trunk/cinvoke/lib/arch/gcc_sparc_unix.h
trunk/cinvoke/lib/cinvoke.c
trunk/cinvoke/test/lib.c
trunk/cinvoke/test/runtests.c
Log:
more tests pass
Modified: trunk/cinvoke/lib/arch/gcc_sparc_unix.c
===================================================================
--- trunk/cinvoke/lib/arch/gcc_sparc_unix.c 2006-08-03 21:28:34 UTC (rev
104)
+++ trunk/cinvoke/lib/arch/gcc_sparc_unix.c 2006-08-11 19:51:43 UTC (rev
105)
@@ -78,12 +78,7 @@
return CINV_SUCCESS;
}
-// XXX
/*
-int isflt(cinv_type_t t) {
- return (t == CINV_T_FLOAT) || (t == CINV_T_DOUBLE);
-}
-
const static int LEN = 4096;
*/
// XXX
@@ -196,151 +191,110 @@
/* munmap(stub, LEN);*/
}
-// XXX
int arch_is_register_parm(cinv_callconv_t callingconvention, int index,
int num_params, cinv_type_t types[]) {
-/* int numints = 0, numflts = 0;
+ int num = 0;
int i;
for (i = 0; i <= index; i++) {
- if (isflt(types[i])) {
- numflts++;
- if (types[i] == CINV_T_FLOAT)
- numints++;
- else
- numints += 2;
- } else if (types[i] == CINV_T_EXTRALONG)
- numints += 2;
+ if (types[i] == CINV_T_EXTRALONG ||
+ types[i] == CINV_T_DOUBLE)
+ num += 2;
else
- numints++;
+ num++;
}
- return (isflt(types[index]) && numflts <= 13) || (numints <= 8); */
- return 1;
+ return (num <= 6);
}
-/*void set_flt(ArchRegParms *regparms, int index, void *p, cinv_type_t type) {
- double *toset[] = {
- &(regparms->f1), &(regparms->f2), &(regparms->f3),
- &(regparms->f4), &(regparms->f5), &(regparms->f6),
- &(regparms->f7), &(regparms->f8), &(regparms->f9),
- &(regparms->f10), &(regparms->f11), &(regparms->f12),
- &(regparms->f13)
- };
-
- if (type == CINV_T_FLOAT)
- *toset[index] = *(float *)p;
- else
- *toset[index] = *(double *)p;
-}
-void set_int(ArchRegParms *regparms, int index, void *p, cinv_type_t type) {
+void set_parm(ArchRegParms *regparms, int index, void *p, cinv_type_t type) {
int *toset[] = {
- &(regparms->r3), &(regparms->r4), &(regparms->r5),
- &(regparms->r6), &(regparms->r7), &(regparms->r8),
- &(regparms->r9), &(regparms->r10)
+ &(regparms->io0), &(regparms->io1), &(regparms->io2),
+ &(regparms->io3), &(regparms->io4), &(regparms->io5)
};
-
- if (type == CINV_T_CHAR)
+ switch (type) {
+ case CINV_T_CHAR:
*(toset[index]) = *(char *)p;
- else if (type == CINV_T_SHORT)
+ break;
+ case CINV_T_SHORT:
*(toset[index]) = *(short *)p;
- else if (type == CINV_T_INT)
+ break;
+ case CINV_T_PTR:
+ case CINV_T_INT:
+ case CINV_T_LONG:
*(toset[index]) = *(int *)p;
- else if (type == CINV_T_LONG)
- *(toset[index]) = (int)*(long *)p;
- else if (type == CINV_T_EXTRALONG) {
+ break;
+ case CINV_T_DOUBLE:
+ case CINV_T_EXTRALONG:
*(toset[index]) = (int)((*(long long *)p) >> 32);
- if (index < 7)
+ if (index < 5)
*(toset[index + 1]) = (int)((*(long long *)p) &
0xFFFFFFFF);
- } else
- *(toset[index]) = (int)*(void **)p;
-}*/
+ break;
+ case CINV_T_FLOAT:
+ *((float *)toset[index]) = *(float *)p;
+ break;
+ default: break;
+ }
+}
-// XXX
void arch_set_register_parms(ArchRegParms *regparms,
cinv_callconv_t callingconvention, int num_params, void *parameters[],
cinv_type_t types[]) {
- /*int numints = 0, numflts = 0;
+ int num = 0;
int i;
for (i = 0; i < num_params; i++) {
- if (isflt(types[i])) {
- if (numflts < 13)
- set_flt(regparms, numflts, parameters[i],
types[i]);
- numflts++;
- if (types[i] == CINV_T_FLOAT)
- numints++;
+ if (num < 6) {
+ set_parm(regparms, num, parameters[i], types[i]);
+ if (types[i] == CINV_T_EXTRALONG ||
+ types[i] == CINV_T_DOUBLE)
+ num += 2;
else
- numints += 2;
- } else {
- if (numints < 8)
- set_int(regparms, numints, parameters[i],
types[i]);
- if (types[i] == CINV_T_EXTRALONG)
- numints += 2;
- else
- numints++;
+ num++;
}
- }*/
+ }
}
-/*
-void get_flt(void *po, int index, ArchRegParms *regparms, cinv_type_t type) {
- double *toget[] = {
- &(regparms->f1), &(regparms->f2), &(regparms->f3),
- &(regparms->f4), &(regparms->f5), &(regparms->f6),
- &(regparms->f7), &(regparms->f8), &(regparms->f9),
- &(regparms->f10), &(regparms->f11), &(regparms->f12),
- &(regparms->f13)
- };
-
- if (type == CINV_T_FLOAT)
- *(float *)po = *toget[index];
- else
- *(double *)po = *toget[index];
-}
-void get_int(void *po, int index, ArchRegParms *regparms, cinv_type_t type) {
+void get_parm(void *po, int index, ArchRegParms *regparms, cinv_type_t type) {
int *toget[] = {
- &(regparms->r3), &(regparms->r4), &(regparms->r5),
- &(regparms->r6), &(regparms->r7), &(regparms->r8),
- &(regparms->r9), &(regparms->r10)
+ &(regparms->io0), &(regparms->io1), &(regparms->io2),
+ &(regparms->io3), &(regparms->io4), &(regparms->io5)
};
-
- if (type == CINV_T_CHAR)
+ switch (type) {
+ case CINV_T_CHAR:
*(char *)po = *toget[index];
- else if (type == CINV_T_SHORT)
+ break;
+ case CINV_T_SHORT:
*(short *)po = *toget[index];
- else if (type == CINV_T_INT)
+ break;
+ case CINV_T_PTR:
+ case CINV_T_INT:
+ case CINV_T_LONG:
*(int *)po = *toget[index];
- else if (type == CINV_T_LONG)
- *(long *)po = *toget[index];
- else if (type == CINV_T_EXTRALONG) {
- if (index < 7) {
+ break;
+ case CINV_T_DOUBLE:
+ case CINV_T_EXTRALONG:
+ if (index < 5) {
*(long long *)po = ((long long)*toget[index]) << 32;
*(long long *)po |= *toget[index + 1];
}
- } else
- *(void* *)po = (void *)*toget[index];
-}*/
-
-// XXX
+ break;
+ case CINV_T_FLOAT:
+ *(float *)po = *((float *)toget[index]);
+ break;
+ default: break;
+ }
+}
void arch_get_register_parms(ArchRegParms *regparms,
cinv_callconv_t callingconvention, int num_params, void
*parameters_out[],
cinv_type_t types[]) {
-/* int numints = 0, numflts = 0;
+ int num = 0;
int i;
for (i = 0; i < num_params; i++) {
- if (isflt(types[i])) {
- if (numflts < 13)
- get_flt(parameters_out[i], numflts, regparms,
types[i]);
- numflts++;
- if (types[i] == CINV_T_FLOAT)
- numints++;
+ if (num < 6) {
+ get_parm(parameters_out[i], num, regparms, types[i]);
+ if (types[i] == CINV_T_EXTRALONG ||
+ types[i] == CINV_T_DOUBLE)
+ num += 2;
else
- numints += 2;
- } else {
- if (numints < 8)
- get_int(parameters_out[i], numints, regparms,
types[i]);
- if (types[i] == CINV_T_EXTRALONG)
- numints += 2;
- else
- numints++;
+ num++;
}
- }*/
+ }
}
void arch_getval_char(ArchRetValue *archval, char *outval) {
Modified: trunk/cinvoke/lib/arch/gcc_sparc_unix.h
===================================================================
--- trunk/cinvoke/lib/arch/gcc_sparc_unix.h 2006-08-03 21:28:34 UTC (rev
104)
+++ trunk/cinvoke/lib/arch/gcc_sparc_unix.h 2006-08-11 19:51:43 UTC (rev
105)
@@ -121,26 +121,25 @@
"m" (*(&(archvalue).dval + 4)) : \
"%i0", "%i1", "%f0", "%f1");
-// XXX jiggle these numbers
-#define ARCH_PUT_STACK_BYTES(bcount) \
-{ \
- int bc = bcount + ARCH_STACK_SKIPTOP; \
- if (bc <= 32) \
- __asm__("save %%sp, -32, %%sp" ::: "%sp"); \
- else if (bc <= 48) \
- __asm__("save %%sp, -48, %%sp" ::: "%sp"); \
- else if (bc <= 64) \
- __asm__("save %%sp, -64, %%sp" ::: "%sp"); \
- else if (bc <= 128) \
- __asm__("save %%sp, -128, %%sp" ::: "%sp"); \
- else if (bc <= 256) \
- __asm__("save %%sp, -256, %%sp" ::: "%sp"); \
- else \
- __asm__("save %%sp, -512, %%sp" ::: "%sp"); \
-}
-#define ARCH_REMOVE_STACK_BYTES(bcount) \
- __asm__("restore" ::: "%sp");
+// Allocating stack frames dynamically on sparc is a pain
+// since executing a "save" instruction destroys the
+// frame pointer, and directly manipulating the value of %sp
+// will yield an inconsistent stack if an interrupt occurs.
+// To get around this we take advantage of the fact that this
+// macro is called after any local variable declarations and
+// statically add 512 bytes to the calling stack frame by
+// declaring a local array. This works great (as long as
+// the argument list isnt longer than 512 + whatever other
+// room is reserved on the stack!) because we dont care if
+// the stpadding array's contents get mangled. On the other
+// hand always creating such a large stack frame in the case
+// where the actual number of arguments being pushed may be
+// small is a waste.
+#define ARCH_PUT_STACK_BYTES(bcount) char __stpadding[512]; \
+
__stpadding[0] = '\0';
+#define ARCH_REMOVE_STACK_BYTES(bcount) /* empty */
+
#define ARCH_GET_STACK(sp) \
__asm__("st %%sp, %0" : "=m" (sp));
@@ -153,7 +152,7 @@
#define ARCH_STACK_GROWS_DOWN 1
-#define ARCH_STACK_SKIPTOP 24 // XXX ?
+#define ARCH_STACK_SKIPTOP 68
#define ARCH_REGPARMS_IN_STACKSIZE 1
Modified: trunk/cinvoke/lib/cinvoke.c
===================================================================
--- trunk/cinvoke/lib/cinvoke.c 2006-08-03 21:28:34 UTC (rev 104)
+++ trunk/cinvoke/lib/cinvoke.c 2006-08-11 19:51:43 UTC (rev 105)
@@ -349,6 +349,12 @@
int stacksize = function->stacksize;
char *stackptr;
+ int len;
+ int memsize;
+ int regparm;
+ int diff;
+ char *param;
+
arch_set_register_parms(®parms, function->callconv,
function->numparms, parameters, function->parmtypes);
@@ -365,11 +371,11 @@
#endif
for (i = 0; i < function->numparms; i++) {
- int len = function->parmstacksizes[i];
- int memsize = function->parmmemsizes[i];
- int regparm = function->regparms[i];
- int diff = len - memsize;
- char *param = parameters[i];
+ len = function->parmstacksizes[i];
+ memsize = function->parmmemsizes[i];
+ regparm = function->regparms[i];
+ diff = len - memsize;
+ param = parameters[i];
#if !ARCH_REGPARMS_IN_STACKSIZE
if (regparm)
Modified: trunk/cinvoke/test/lib.c
===================================================================
--- trunk/cinvoke/test/lib.c 2006-08-03 21:28:34 UTC (rev 104)
+++ trunk/cinvoke/test/lib.c 2006-08-11 19:51:43 UTC (rev 105)
@@ -75,7 +75,7 @@
}
DLLEXPORT float test10(int i1, short i2, char i3, long i4, long i5,
int i6, int i7, long i8, short i9) {
- printf("test10: %d %d %c %ld %ld %d %d %ld %d (want 111 222 3 444 555
666 777 888 999\n", i1, i2, i3, i4, i5, i6, i7, i8, i9);
+ printf("test10: %d %d %c %ld %ld %d %d %ld %d (want 111 222 3 444 555
666 777 888 999)\n", i1, i2, i3, i4, i5, i6, i7, i8, i9);
return 0.7f;
}
DLLEXPORT void test11(int (CDECL *f)(int, int, long, long, int, int,
Modified: trunk/cinvoke/test/runtests.c
===================================================================
--- trunk/cinvoke/test/runtests.c 2006-08-03 21:28:34 UTC (rev 104)
+++ trunk/cinvoke/test/runtests.c 2006-08-11 19:51:43 UTC (rev 105)
@@ -429,15 +429,15 @@
}
UPDATE(test1, "", "");
- SKIP_UPDATE(test2, "i", "i");
+ UPDATE(test2, "i", "i");
UPDATE(test3, "p", "");
UPDATE(test4, "f", "");
UPDATE(test5, "d", "");
- SKIP_UPDATE(test6, "e", "iefdc");
+ UPDATE(test6, "e", "iefdc");
UPDATE0(test7);
UPDATE0(test8);
SKIP_UPDATE(test9, "", "p");
- SKIP_UPDATE(test10, "f", "isclliils");
+ UPDATE(test10, "f", "isclliils");
SKIP_UPDATE(test11, "", "p");
if (!cinv_library_delete(ctx, lib)) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r105 - in trunk/cinvoke: lib lib/arch test,
will <=