Author: eliot Date: 2011-07-20 11:23:52 -0700 (Wed, 20 Jul 2011) New Revision: 2464
Modified: trunk/platforms/Cross/plugins/IA32ABI/ia32abicc.c Log: Fix ia32abicc.c compilation for COGMTVM (there is no issue with previousCallbackContext).
Modified: trunk/platforms/Cross/plugins/IA32ABI/ia32abicc.c =================================================================== --- trunk/platforms/Cross/plugins/IA32ABI/ia32abicc.c 2011-07-19 00:35:51 UTC (rev 2463) +++ trunk/platforms/Cross/plugins/IA32ABI/ia32abicc.c 2011-07-20 18:23:52 UTC (rev 2464) @@ -69,7 +69,7 @@ /* using sse2 instructions requires 16-byte stack alignment but on win32 there's * no guarantee that libraries preserve alignment so compensate on callback. */ -# define STACK_ALIGN_HACK +# define STACK_ALIGN_HACK 1 # define STACK_ALIGN_BYTES 16 #endif
@@ -136,25 +136,18 @@ }
/* Queueing order for callback returns. To ensure that callback returns occur - * in LIFO order we provide mostRecentCallbackContext which is tested by the return - * primitive primReturnFromContextThrough. In a threaded VM this will have to - * be thread-specific (as yet unimplemented). + * in LIFO order we provide mostRecentCallbackContext which is tested by the + * return primitive primReturnFromContextThrough. Note that in the threaded VM + * this does not have to be thread-specific or locked since it is within the + * bounds of the ownVM/disownVM pair. */ -#if COGMTVM -# error as yet unimplemented -/* Test if need and allocate a thread-local variable index in - * allocateExecutablePage (low frequency operation). Keep a per-thread - * mostRecentCallbackContext. - */ -#else static VMCallbackContext *mostRecentCallbackContext = 0;
VMCallbackContext * getMostRecentCallbackContext() { return mostRecentCallbackContext; }
-# define getRMCC(t) mostRecentCallbackContext -# define setRMCC(t) (mostRecentCallbackContext = (void *)(t)) -#endif +#define getRMCC(t) mostRecentCallbackContext +#define setRMCC(t) (mostRecentCallbackContext = (void *)(t))
/* * Entry-point for call-back thunks. Args are thunk address and stack pointer, @@ -188,28 +181,28 @@ VMCallbackContext *previousCallbackContext; int flags, returnType;
- if ((flags = interpreterProxy->ownVM(0)) < 0) { - fprintf(stderr,"Warning; callback failed to own the VM\n"); - return -1; - } - -#if defined(STACK_ALIGN_HACK) +#if STACK_ALIGN_HACK { void *sp = getsp(); int offset = (unsigned long)sp & (STACK_ALIGN_BYTES - 1); if (offset) { -#if _MSC_VER +# if _MSC_VER _asm sub esp, dword ptr offset; -#elif __GNUC__ +# elif __GNUC__ asm("sub %0,%%esp" : : "m"(offset)); -#else -# error need to subtract offset from esp -#endif +# else +# error need to subtract offset from esp +# endif sp = getsp(); assert(!((unsigned long)sp & (STACK_ALIGN_BYTES - 1))); } } -#endif +#endif /* STACK_ALIGN_HACK */
+ if ((flags = interpreterProxy->ownVM(0)) < 0) { + fprintf(stderr,"Warning; callback failed to own the VM\n"); + return -1; + } + if (!(returnType = setjmp(vmcc.trampoline))) { previousCallbackContext = getRMCC(); setRMCC(&vmcc);
vm-dev@lists.squeakfoundation.org