cinvoke-svn
[Top][All Lists]
Advanced

[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(&regparms, 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)) {





reply via email to

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