any architecture (using miniinterpreter)
-------------------------------------------------------------------------- */
-StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED)
+StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED)
{
while (f) {
- if (RtsFlags[0].DebugFlags.interpreter) {
+ IF_DEBUG(interpreter,
debugBelch("Jumping to ");
printPtr((P_)f); fflush(stdout);
debugBelch("\n");
- }
+ );
f = (StgFunPtr) (f)();
}
- return (StgThreadReturnCode)R1.i;
+ return (StgRegTable *)R1.p;
}
StgFunPtr StgReturn(void)
#ifdef i386_HOST_ARCH
-StgThreadReturnCode
+#ifdef darwin_TARGET_OS
+#define STG_GLOBAL ".globl "
+#else
+#define STG_GLOBAL ".global "
+#endif
+
+StgRegTable *
StgRun(StgFunPtr f, StgRegTable *basereg) {
unsigned char space[ RESERVED_C_STACK_BYTES + 4*sizeof(void *) ];
- StgThreadReturnCode r;
+ StgRegTable * r;
__asm__ volatile (
/*
*/
"movl %3,%%ebx\n\t"
/*
- * grab the function argument from the stack, and jump to it.
+ * grab the function argument from the stack
*/
"movl %2,%%eax\n\t"
+
+#if darwin_TARGET_OS
+ /*
+ * Darwin: keep the stack aligned
+ */
+ "subl $12,%%esp\n\t"
+#endif
+
+ /*
+ * jump to it
+ */
"jmp *%%eax\n\t"
- ".global " STG_RETURN "\n"
+ STG_GLOBAL STG_RETURN "\n"
STG_RETURN ":\n\t"
+#if darwin_TARGET_OS
+ /*
+ * Darwin: keep the stack aligned
+ */
+ "addl $12,%%esp\n\t"
+#endif
+
"movl %%esi, %%eax\n\t" /* Return value in R1 */
/*
#ifdef x86_64_HOST_ARCH
-extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg);
+extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg);
-static void StgRunIsImplementedInAssembler(void)
+void StgRunIsImplementedInAssembler(void);
+void StgRunIsImplementedInAssembler(void)
{
__asm__ volatile (
/*
#ifdef sparc_HOST_ARCH
-StgThreadReturnCode
+StgRegTable *
StgRun(StgFunPtr f, StgRegTable *basereg) {
unsigned char space[RESERVED_C_STACK_BYTES];
__asm__ volatile ("ld %1,%0"
: "=r" (i7) : "m" (((void **)(space))[100]));
#endif
- return (StgThreadReturnCode)R1.i;
+ return (StgRegTable *)R1.i;
}
#endif
#ifdef alpha_HOST_ARCH
-StgThreadReturnCode
+StgRegTable *
StgRun(StgFunPtr f, StgRegTable *basereg)
{
register long real_ra __asm__("$26"); volatile long save_ra;
register StgFunPtr real_pv __asm__("$27");
- StgThreadReturnCode ret;
+ StgRegTable * ret;
save_ra = real_ra;
save_gp = real_gp;
#ifdef hppa1_1_HOST_ARCH
-StgThreadReturnCode
+StgRegTable *
StgRun(StgFunPtr f, StgRegTable *basereg)
{
StgChar space[RESERVED_C_STACK_BYTES+16*sizeof(long)+10*sizeof(double)];
- StgThreadReturnCode ret;
+ StgRegTable * ret;
__asm__ volatile ("ldo %0(%%r30),%%r19\n"
"\tstw %%r3, 0(0,%%r19)\n"
#ifdef powerpc_HOST_ARCH
-extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg);
+extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg);
#ifdef darwin_HOST_OS
-static void StgRunIsImplementedInAssembler(void)
+void StgRunIsImplementedInAssembler(void)
{
#if HAVE_SUBSECTIONS_VIA_SYMBOLS
// if the toolchain supports deadstripping, we have to
#ifdef powerpc64_HOST_ARCH
#ifdef linux_HOST_OS
-extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg);
+extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg);
static void StgRunIsImplementedInAssembler(void)
{