[Top][All Lists]
[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",
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r83 - in trunk/cinvoke: lib/arch test,
will <=