X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStgCRun.c;h=c1afc1655945678e309013ef6c596d4169831ffe;hb=a1b4e3b88a6987deed7bb7f1bd870b30eef1b475;hp=4d5136f7789848a0649d7027043698991a053f55;hpb=9c617747b7575c17783d065ade1e4559a5f9b895;p=ghc-hetmet.git diff --git a/ghc/rts/StgCRun.c b/ghc/rts/StgCRun.c index 4d5136f..c1afc16 100644 --- a/ghc/rts/StgCRun.c +++ b/ghc/rts/StgCRun.c @@ -82,17 +82,17 @@ register double fake_f9 __asm__("$f9"); 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) @@ -114,11 +114,17 @@ 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 ( /* @@ -135,12 +141,23 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { */ "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" + + /* + * Darwin note: + * The stack pointer has to be aligned to a multiple of 16 bytes at + * this point. This works out correctly with gcc 4.0.1, but it might + * break at any time in the future. TODO: Make this future-proof. + */ + + /* + * jump to it + */ "jmp *%%eax\n\t" - ".global " STG_RETURN "\n" + STG_GLOBAL STG_RETURN "\n" STG_RETURN ":\n\t" "movl %%esi, %%eax\n\t" /* Return value in R1 */ @@ -177,9 +194,10 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { #ifdef x86_64_HOST_ARCH -extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg); +extern StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg); -static void StgRunIsImplementedInAssembler(void) +static void GNUC3_ATTRIBUTE(used) +StgRunIsImplementedInAssembler(void) { __asm__ volatile ( /* @@ -199,7 +217,7 @@ static void StgRunIsImplementedInAssembler(void) /* * Set BaseReg */ - "movq %%rsi,%%rbx\n\t" + "movq %%rsi,%%r13\n\t" /* * grab the function argument from the stack, and jump to it. */ @@ -209,7 +227,7 @@ static void StgRunIsImplementedInAssembler(void) ".global " STG_RETURN "\n" STG_RETURN ":\n\t" - "movq %%r13, %%rax\n\t" /* Return value in R1 */ + "movq %%rbx, %%rax\n\t" /* Return value in R1 */ /* * restore callee-saves registers. (Don't stomp on %%rax!) @@ -297,7 +315,7 @@ static void StgRunIsImplementedInAssembler(void) #ifdef sparc_HOST_ARCH -StgThreadReturnCode +StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg) { unsigned char space[RESERVED_C_STACK_BYTES]; @@ -330,7 +348,7 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { __asm__ volatile ("ld %1,%0" : "=r" (i7) : "m" (((void **)(space))[100])); #endif - return (StgThreadReturnCode)R1.i; + return (StgRegTable *)R1.i; } #endif @@ -365,7 +383,7 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { #ifdef alpha_HOST_ARCH -StgThreadReturnCode +StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg) { register long real_ra __asm__("$26"); volatile long save_ra; @@ -394,7 +412,7 @@ StgRun(StgFunPtr f, StgRegTable *basereg) register StgFunPtr real_pv __asm__("$27"); - StgThreadReturnCode ret; + StgRegTable * ret; save_ra = real_ra; save_gp = real_gp; @@ -467,11 +485,11 @@ StgRun(StgFunPtr f, StgRegTable *basereg) #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" @@ -563,10 +581,10 @@ StgRun(StgFunPtr f, StgRegTable *basereg) #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 @@ -604,7 +622,8 @@ static void StgRunIsImplementedInAssembler(void) // *) The Link Register is saved to a different offset in the caller's stack frame // (Linux: 4(r1), Darwin 8(r1)) -static void StgRunIsImplementedInAssembler(void) +static void GNUC3_ATTRIBUTE(used) +StgRunIsImplementedInAssembler(void) { __asm__ volatile ( "\t.globl StgRun\n" @@ -681,9 +700,10 @@ static void StgRunIsImplementedInAssembler(void) #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) +static void GNUC3_ATTRIBUTE(used) +StgRunIsImplementedInAssembler(void) { // r0 volatile // r1 stack pointer @@ -833,7 +853,8 @@ static void StgRunIsImplementedInAssembler(void) #define LOCALS 31 #endif -static void StgRunIsImplementedInAssembler(void) +static void GNUC3_ATTRIBUTE(used) +StgRunIsImplementedInAssembler(void) { __asm__ volatile( ".global StgRun\n"