cinvoke-svn
[Top][All Lists]
Advanced

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

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


From: will
Subject: [cinvoke-svn] r83 - in trunk/cinvoke: lib/arch test
Date: 9 Jul 2006 12:50:38 -0400

Author: will
Date: 2006-07-09 12:50:38 -0400 (Sun, 09 Jul 2006)
New Revision: 83

Modified:
   trunk/cinvoke/lib/arch/gcc_ppc_osx.c
   trunk/cinvoke/lib/arch/gcc_ppc_osx.h
   trunk/cinvoke/lib/arch/gcc_x64_unix.h
   trunk/cinvoke/lib/arch/gcc_x86_unix.h
   trunk/cinvoke/test/lib.c
   trunk/cinvoke/test/runtests.c
Log:
implemented ppc return values, fixed some bugs


Modified: trunk/cinvoke/lib/arch/gcc_ppc_osx.c
===================================================================
--- trunk/cinvoke/lib/arch/gcc_ppc_osx.c        2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/lib/arch/gcc_ppc_osx.c        2006-07-09 16:50:38 UTC (rev 83)
@@ -70,14 +70,15 @@
        return CINV_SUCCESS;
 }
 cinv_status_t arch_library_delete(CInvContext *context, ArchLibrary *library) {
-       if (dlclose(library->dl)) {
+       /*if (dlclose(library->dl)) {
                context_set_error(context, -1, strdup(dlerror()), 1);
                return CINV_ERROR;
-       }
+       }*/ // darwin returns an error if we do this
 
        return CINV_SUCCESS;
 }
 
+// XXX
 const static int LEN = 4096;
 
 char *arch_callback_stub(void *functionp, void *param,
@@ -113,7 +114,7 @@
 }
 int arch_is_register_parm(cinv_callconv_t callingconvention, int index,
        int num_params, cinv_type_t types[]) {
-       int numints = 0, numflts = 0;
+/*     int numints = 0, numflts = 0;
        int i;
        for (i = 0; i < index; i++) {
                if (isflt(types[i]))
@@ -121,9 +122,10 @@
                else
                        numints++;
        }
-       return (isflt(types[index]) && numflts < 8) || (numints < 6);
+       return (isflt(types[index]) && numflts < 8) || (numints < 6);*/ // XXX
+       return 1;
 }
-
+/*
 void set_flt(ArchRegParms *regparms, int index, void *p, cinv_type_t type) {
        long *toset[] = {
                &(regparms->xmm0), &(regparms->xmm1), &(regparms->xmm2),
@@ -154,12 +156,12 @@
                *(toset[index]) = *(long long *)p;
        else
                *(toset[index]) = (long)*(void **)p;
-}
+}*/
 
 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 numints = 0, numflts = 0;
        int i;
        for (i = 0; i < num_params; i++) {
                if (isflt(types[i])) {
@@ -171,8 +173,9 @@
                                set_int(regparms, numints, parameters[i], 
types[i]);
                        numints++;
                }
-       }
+       }*/ // XXX
 }
+/*
 void get_flt(void *po, int index, ArchRegParms *regparms, cinv_type_t type) {
        long *toget[] = {
                &(regparms->xmm0), &(regparms->xmm1), &(regparms->xmm2),
@@ -203,12 +206,12 @@
                *(long long *)po = (long long)*(toget[index]);
        else
                *(void **)po = (void *)*(toget[index]);
-}
+}*/
 
 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 numints = 0, numflts = 0;
        int i;
        for (i = 0; i < num_params; i++) {
                if (isflt(types[i])) {
@@ -220,89 +223,89 @@
                                get_int(parameters_out[i], numints, regparms, 
types[i]);
                        numints++;
                }
-       }
+       }*/ // XXX
 }
 
 void arch_getval_char(ArchRetValue *archval, char *outval) {
-       *outval = archval->ival;
+       *outval = archval->ivallo;
 }
 void arch_getval_short(ArchRetValue *archval, short *outval) {
-       *outval = archval->ival;
+       *outval = archval->ivallo;
 }
 void arch_getval_int(ArchRetValue *archval, int *outval) {
-       *outval = archval->ival;
+       *outval = archval->ivallo;
 }
 void arch_getval_long(ArchRetValue *archval, long int *outval) {
-       *outval = archval->ival;
+       *outval = archval->ivallo;
 }
 void arch_getval_extralong(ArchRetValue *archval, long long int *outval) {
-       *outval = archval->ival;
+       *outval = archval->ivalhi;
+       *outval |= (((long long)archval->ivallo) << 32);
 }
 void arch_getval_float(ArchRetValue *archval, float *outval) {
-       float f = *(float *)&archval->dval;
-       *outval = f;
+       *outval = archval->dval;
 }
 void arch_getval_double(ArchRetValue *archval, double *outval) {
-       double d = *(double *)&archval->dval;
-       *outval = d;
+       *outval = archval->dval;
 }
 void arch_getval_ptr(ArchRetValue *archval, void **outval) {
-       *outval = (void *)archval->ival;
+       *outval = (void *)archval->ivallo;
 }
 
 void arch_setval_char(ArchRetValue *archval, char val) {
-       archval->ival = val;
+       archval->ivallo = val;
 }
 void arch_setval_short(ArchRetValue *archval, short val) {
-       archval->ival = val;
+       archval->ivallo = val;
 }
 void arch_setval_int(ArchRetValue *archval, int val) {
-       archval->ival = val;
+       archval->ivallo = val;
 }
 void arch_setval_long(ArchRetValue *archval, long int val) {
-       archval->ival = val;
+       archval->ivallo = val;
 }
 void arch_setval_extralong(ArchRetValue *archval, long long int val) {
-       archval->ival = val;
+       archval->ivalhi = (val & 0xFFFFFFFF);
+       archval->ivallo = val >> 32;
 }
 void arch_setval_float(ArchRetValue *archval, float val) {
-       *((float *)&archval->dval) = val;
+       archval->dval = val;
 }
 void arch_setval_double(ArchRetValue *archval, double val) {
-       *((double *)&archval->dval) = val;
+       archval->dval = val;
 }
 void arch_setval_ptr(ArchRetValue *archval, void *val) {
-       archval->ival = (long)val;
+       archval->ivallo = (int)val;
 }
 
 void arch_size_char(int *stacksize_out, int *structsize_out,
        int *stackalign_out, int *structalign_out) {
-       *stacksize_out = 8;
+       *stacksize_out = 4;
        *structsize_out = 1;
 }
 void arch_size_short(int *stacksize_out, int *structsize_out,
        int *stackalign_out, int *structalign_out) {
-       *stacksize_out = 8;
+       *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) {
-       *stacksize_out = 8;
+       *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) {
-       *stacksize_out = 8;
-       *structsize_out = 8;
-       *structalign_out = 8;
+       *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) {
        *stacksize_out = 8;
        *structsize_out = 8;
-       *structalign_out = 8;
+       *structalign_out = 4;
 }
 void arch_size_float(int *stacksize_out, int *structsize_out,
        int *stackalign_out, int *structalign_out) {
@@ -318,7 +321,7 @@
 }
 void arch_size_ptr(int *stacksize_out, int *structsize_out,
        int *stackalign_out, int *structalign_out) {
-       *stacksize_out = 8;
-       *structsize_out = 8;
-       *structalign_out = 8;
+       *stacksize_out = 4;
+       *structsize_out = 4;
+       *structalign_out = 4;
 }

Modified: trunk/cinvoke/lib/arch/gcc_ppc_osx.h
===================================================================
--- trunk/cinvoke/lib/arch/gcc_ppc_osx.h        2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/lib/arch/gcc_ppc_osx.h        2006-07-09 16:50:38 UTC (rev 83)
@@ -25,8 +25,8 @@
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 */
-#ifndef _ARCH_GCC_X86_LINUX_H
-#define _ARCH_GCC_X86_LINUX_H
+#ifndef _ARCH_GCC_PPC_OSX_H
+#define _ARCH_GCC_PPC_OSX_H
 
 #include <errno.h>
 
@@ -35,35 +35,43 @@
 } ArchLibrary;
 
 typedef struct _ArchRetValue {
-       long ival;
-       long dval;
+       int ivallo;
+       int ivalhi;
+       double dval;
 } ArchRetValue;
 
 typedef struct _ArchRegParms {
-       long rdi;
-       long rsi;
-       long rdx;
-       long rcx;
-       long r8;
-       long r9;
-       long xmm0;
-       long xmm1;
-       long xmm2;
-       long xmm3;
-       long xmm4;
-       long xmm5;
-       long xmm6;
-       long xmm7;
+       int r3;
+       int r4;
+       int r5;
+       int r6;
+       int r7;
+       int r8;
+       int r9;
+       int r10;
+       double f1;
+       double f2;
+       double f3;
+       double f4;
+       double f5;
+       double f6;
+       double f7;
+       double f8;
+       double f9;
+       double f10;
+       double f11;
+       double f12;
+       double f13;
 } ArchRegParms;
 
 typedef char cinv_int8_t;
 typedef short cinv_int16_t;
 typedef int cinv_int32_t;
-typedef long cinv_int64_t;
+typedef long long cinv_int64_t;
 
 #define CINV_E_NOMEM ((cinv_int32_t)ENOMEM)
 #define CINV_S_NOMEM (strerror(ENOMEM))
-#define CINV_NOMEM_NEEDSFREE 1
+#define CINV_NOMEM_NEEDSFREE 0
 #define CINV_E_INVAL ((cinv_int32_t)EINVAL)
 
 #define CINV_CC_DEFAULT CINV_CC_CDECL
@@ -74,87 +82,121 @@
 /////////////////////////////////////
 // macros
 /////////////////////////////////////
-// note we use r11 instead of rdi, this is because we
-// saved this value in the callback stub
 #define ARCH_SAVE_REGPARMS(regparms) \
-       ;/*__asm__("movq %%r11, %0; \
-               movq %%rsi, %1; \
-               movq %%rdx, %2; \
-               movq %%rcx, %3; \
-               movq %%r8, %4; \
-               movq %%r9, %5; \
-               movsd %%xmm0, %6; \
-               movsd %%xmm1, %7; \
-               movsd %%xmm2, %8; \
-               movsd %%xmm3, %9; \
-               movsd %%xmm4, %10; \
-               movsd %%xmm5, %11; \
-               movsd %%xmm6, %12; \
-               movsd %%xmm7, %13" : \
-                       "=m" ((regparms).rdi), \
-                       "=m" ((regparms).rsi), \
-                       "=m" ((regparms).rdx), \
-                       "=m" ((regparms).rcx), \
+       __asm__("stw r3, %0\n \
+               stw r4, %1\n \
+               stw r5, %2\n \
+               stw r6, %3\n \
+               stw r7, %4\n \
+               stw r8, %5\n \
+               stw r9, %6\n \
+               stw r10, %7\n \
+               stfd f1, %8\n \
+               stfd f2, %9\n \
+               stfd f3, %10\n \
+               stfd f4, %11\n \
+               stfd f5, %12\n \
+               stfd f6, %13\n \
+               stfd f7, %14\n \
+               stfd f8, %15\n \
+               stfd f9, %16\n \
+               stfd f10, %17\n \
+               stfd f11, %18\n \
+               stfd f12, %19\n \
+               stfd f13, %20\n" : \
+                       "=m" ((regparms).r3), \
+                       "=m" ((regparms).r4), \
+                       "=m" ((regparms).r5), \
+                       "=m" ((regparms).r6), \
+                       "=m" ((regparms).r7), \
                        "=m" ((regparms).r8), \
                        "=m" ((regparms).r9), \
-                       "=m" ((regparms).xmm0), \
-                       "=m" ((regparms).xmm1), \
-                       "=m" ((regparms).xmm2), \
-                       "=m" ((regparms).xmm3), \
-                       "=m" ((regparms).xmm4), \
-                       "=m" ((regparms).xmm5), \
-                       "=m" ((regparms).xmm6), \
-                       "=m" ((regparms).xmm7));*/
+                       "=m" ((regparms).r10), \
+                       "=m" ((regparms).f1), \
+                       "=m" ((regparms).f2), \
+                       "=m" ((regparms).f3), \
+                       "=m" ((regparms).f4), \
+                       "=m" ((regparms).f5), \
+                       "=m" ((regparms).f6), \
+                       "=m" ((regparms).f7), \
+                       "=m" ((regparms).f8), \
+                       "=m" ((regparms).f9), \
+                       "=m" ((regparms).f10), \
+                       "=m" ((regparms).f11), \
+                       "=m" ((regparms).f12), \
+                       "=m" ((regparms).f13));
 
 #define ARCH_CALL(regparms, ep) \
-       ;/*__asm__("movq %0, %%rdi; \
-               movq %1, %%rsi; \
-               movq %2, %%rdx; \
-               movq %3, %%rcx; \
-               movq %4, %%r8; \
-               movq %5, %%r9; \
-               movsd %6, %%xmm0; \
-               movsd %7, %%xmm1; \
-               movsd %8, %%xmm2; \
-               movsd %9, %%xmm3; \
-               movsd %10, %%xmm4; \
-               movsd %11, %%xmm5; \
-               movsd %12, %%xmm6; \
-               movsd %13, %%xmm7; \
-               call *%14" :: \
-                       "m" ((regparms).rdi), \
-                       "m" ((regparms).rsi), \
-                       "m" ((regparms).rdx), \
-                       "m" ((regparms).rcx), \
+       __asm__("lwz r3, %0\n \
+               lwz r4, %1\n \
+               lwz r5, %2\n \
+               lwz r6, %3\n \
+               lwz r7, %4\n \
+               lwz r8, %5\n \
+               lwz r9, %6\n \
+               lwz r10, %7\n \
+               lfd f1, %8\n \
+               lfd f2, %9\n \
+               lfd f3, %10\n \
+               lfd f4, %11\n \
+               lfd f5, %12\n \
+               lfd f6, %13\n \
+               lfd f7, %14\n \
+               lfd f8, %15\n \
+               lfd f9, %16\n \
+               lfd f10, %17\n \
+               lfd f11, %18\n \
+               lfd f12, %19\n \
+               lfd f13, %20\n \
+               lwz r0, %21\n \
+               mtctr r0\n \
+               bctrl\n" :: \
+                       "m" ((regparms).r3), \
+                       "m" ((regparms).r4), \
+                       "m" ((regparms).r5), \
+                       "m" ((regparms).r6), \
+                       "m" ((regparms).r7), \
                        "m" ((regparms).r8), \
                        "m" ((regparms).r9), \
-                       "m" ((regparms).xmm0), \
-                       "m" ((regparms).xmm1), \
-                       "m" ((regparms).xmm2), \
-                       "m" ((regparms).xmm3), \
-                       "m" ((regparms).xmm4), \
-                       "m" ((regparms).xmm5), \
-                       "m" ((regparms).xmm6), \
-                       "m" ((regparms).xmm7), \
+                       "m" ((regparms).r10), \
+                       "m" ((regparms).f1), \
+                       "m" ((regparms).f2), \
+                       "m" ((regparms).f3), \
+                       "m" ((regparms).f4), \
+                       "m" ((regparms).f5), \
+                       "m" ((regparms).f6), \
+                       "m" ((regparms).f7), \
+                       "m" ((regparms).f8), \
+                       "m" ((regparms).f9), \
+                       "m" ((regparms).f10), \
+                       "m" ((regparms).f11), \
+                       "m" ((regparms).f12), \
+                       "m" ((regparms).f13), \
                        "m" (ep) : \
-                       "%rdi", "%rsi", "%rdx", "%rcx", \
-                       "%r8", "%r9", "%xmm0", "%xmm1", \
-                       "%xmm2", "%xmm3", "%xmm4", "%xmm5", \
-                       "%xmm6", "%xmm7");*/
+                       "r1", "r2", "r3", "r4", "r5", \
+                       "r6", "r7", "r8", "r9", "r10", \
+                       "f1", "f2", "f3", "f4", "f5", \
+                       "f6", "f7", "f8", "f9", "f10", \
+                       "f11", "f12", "f13", \
+                       "r0", "ctr");
 
 #define ARCH_SAVE_RETURN(archvalue) \
-       ;/*__asm__("movq %%rax, %0; \
-               movsd %%xmm0, %1" : \
-                       "=m" ((archvalue).ival), \
-                       "=m" ((archvalue).dval));*/
+       __asm__("stw r3, %0\n \
+               stw r4, %1\n \
+               stfd f1, %2\n" : \
+                       "=m" ((archvalue).ivallo), \
+                       "=m" ((archvalue).ivalhi), \
+                       "=m" ((archvalue).dval));
 
 #define ARCH_SET_RETURN(archvalue) \
-       ;/*__asm__("movq %0, %%rax; \
-               movsd %1, %%xmm0" :: \
-                       "m" ((archvalue).ival), \
+       __asm__("lwz r3, %0\n \
+               lwz r4, %1\n \
+               lfs f1, %2\n" :: \
+                       "m" ((archvalue).ivallo), \
+                       "m" ((archvalue).ivalhi), \
                        "m" ((archvalue).dval) : \
-                       "%rax", "%xmm0");*/
-
+                       "r3", "r4", "f1");
+// XXX
 #define ARCH_PUT_STACK_BYTES(bcount) \
 ;/*{ \
        long bc = bcount; \

Modified: trunk/cinvoke/lib/arch/gcc_x64_unix.h
===================================================================
--- trunk/cinvoke/lib/arch/gcc_x64_unix.h       2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/lib/arch/gcc_x64_unix.h       2006-07-09 16:50:38 UTC (rev 83)
@@ -25,8 +25,8 @@
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 */
-#ifndef _ARCH_GCC_X86_LINUX_H
-#define _ARCH_GCC_X86_LINUX_H
+#ifndef _ARCH_GCC_X64_UNIX_H
+#define _ARCH_GCC_X64_UNIX_H
 
 #include <errno.h>
 
@@ -63,13 +63,13 @@
 
 #define CINV_E_NOMEM ((cinv_int32_t)ENOMEM)
 #define CINV_S_NOMEM (strerror(ENOMEM))
-#define CINV_NOMEM_NEEDSFREE 1
+#define CINV_NOMEM_NEEDSFREE 0
 #define CINV_E_INVAL ((cinv_int32_t)EINVAL)
 
 #define CINV_CC_DEFAULT CINV_CC_CDECL
 #define CINV_T_2BYTE CINV_T_SHORT
 #define CINV_T_4BYTE CINV_T_INT
-#define CINV_T_8BYTE CINV_T_EXTRALONG
+#define CINV_T_8BYTE CINV_T_LONG
 
 /////////////////////////////////////
 // macros

Modified: trunk/cinvoke/lib/arch/gcc_x86_unix.h
===================================================================
--- trunk/cinvoke/lib/arch/gcc_x86_unix.h       2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/lib/arch/gcc_x86_unix.h       2006-07-09 16:50:38 UTC (rev 83)
@@ -25,8 +25,8 @@
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 */
-#ifndef _ARCH_GCC_X86_LINUX_H
-#define _ARCH_GCC_X86_LINUX_H
+#ifndef _ARCH_GCC_X86_UNIX_H
+#define _ARCH_GCC_X86_UNIX_H
 
 #include <errno.h>
 
@@ -49,7 +49,7 @@
 
 #define CINV_E_NOMEM ((cinv_int32_t)ENOMEM)
 #define CINV_S_NOMEM (strerror(ENOMEM))
-#define CINV_NOMEM_NEEDSFREE 1
+#define CINV_NOMEM_NEEDSFREE 0
 #define CINV_E_INVAL ((cinv_int32_t)EINVAL)
 
 #define CINV_CC_DEFAULT CINV_CC_CDECL

Modified: trunk/cinvoke/test/lib.c
===================================================================
--- trunk/cinvoke/test/lib.c    2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/test/lib.c    2006-07-09 16:50:38 UTC (rev 83)
@@ -68,7 +68,7 @@
        printf("test6: %d %lld %f %f %c (want 11 22 %f %f 5)\n", a0, a1, a2, 
a3, a4,
                33.5, 44.5);
 #endif
-       return 0x0A0A0A0A0ALL;
+       return -5;
 }
 DLLEXPORT void test9(float (CDECL *f)(int, char, int)) {
        printf("test9: %f (want 11.0)\n", f(22, 'A', 44));

Modified: trunk/cinvoke/test/runtests.c
===================================================================
--- trunk/cinvoke/test/runtests.c       2006-07-08 20:24:04 UTC (rev 82)
+++ trunk/cinvoke/test/runtests.c       2006-07-09 16:50:38 UTC (rev 83)
@@ -138,7 +138,7 @@
                return 0;
        }
        
-       if (retval != 0x0A0A0A0A0ALL) {
+       if (retval != -5) {
                printf("retval = %llX\n", retval);
                return 0;
        }
@@ -394,8 +394,12 @@
 #ifdef _WIN32
 #define LIBSUFFIX "dll"
 #else
+#ifdef __APPLE_CC__
+#define LIBSUFFIX "dylib"
+#else
 #define LIBSUFFIX "so"
 #endif
+#endif
 
 int main(int argc, char **argv) {
        int tmp;
@@ -425,9 +429,11 @@
        UPDATE(test6, "e", "iefdc");
        UPDATE0(test7);
        UPDATE0(test8);
-       UPDATE(test9, "", "p");
+//     UPDATE(test9, "", "p");
+       printf("skipped test9\n"); failed++;
        UPDATE(test10, "f", "isclliils");
-       UPDATE(test11, "", "p");
+//     UPDATE(test11, "", "p");
+       printf("skipped test11\n"); failed++;
        
        if (!cinv_library_delete(ctx, lib)) {
                fprintf(stderr, "Error deleting library: %s\n",





reply via email to

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