diff options
author | Simon Marlow <marlowsd@gmail.com> | 2012-12-11 16:53:24 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2012-12-13 22:26:52 +0000 |
commit | 2b977d98a0f15416721633f14f9f551ce9ad30f0 (patch) | |
tree | 1ddd3fb2a84cf5879a375758deaaf455897ac9ac /includes | |
parent | 2e8c769422740c001e0a247bfec61d4f78598582 (diff) | |
download | haskell-2b977d98a0f15416721633f14f9f551ce9ad30f0.tar.gz |
Remove most of TailCalls.h
it was only needed for registerised compilation.
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Stg.h | 7 | ||||
-rw-r--r-- | includes/stg/TailCalls.h | 185 |
2 files changed, 3 insertions, 189 deletions
diff --git a/includes/Stg.h b/includes/Stg.h index ba0c4cfa79..c451cbc5e6 100644 --- a/includes/Stg.h +++ b/includes/Stg.h @@ -217,12 +217,11 @@ typedef StgFunPtr F_; /* ----------------------------------------------------------------------------- Tail calls - - This needs to be up near the top as the register line on alpha needs - to be before all procedures (inline & out-of-line). -------------------------------------------------------------------------- */ -#include "stg/TailCalls.h" +#define JMP_(cont) return((StgFunPtr)(cont)) +#define FB_ +#define FE_ /* ----------------------------------------------------------------------------- Other Stg stuff... diff --git a/includes/stg/TailCalls.h b/includes/stg/TailCalls.h deleted file mode 100644 index 77ceb0c4a5..0000000000 --- a/includes/stg/TailCalls.h +++ /dev/null @@ -1,185 +0,0 @@ -/* ----------------------------------------------------------------------------- - * - * (c) The GHC Team, 1998-2009 - * - * Stuff for implementing proper tail jumps. - * - * Do not #include this file directly: #include "Rts.h" instead. - * - * To understand the structure of the RTS headers, see the wiki: - * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes - * - * ---------------------------------------------------------------------------*/ - -#ifndef TAILCALLS_H -#define TAILCALLS_H - -/* ----------------------------------------------------------------------------- - Unmangled tail-jumping: use the mini interpretter. - -------------------------------------------------------------------------- */ - -#ifdef USE_MINIINTERPRETER - -#define JMP_(cont) return((StgFunPtr)(cont)) -#define FB_ -#define FE_ - -#else - -extern void __DISCARD__(void); - -/* ----------------------------------------------------------------------------- - Tail calling on x86 - -------------------------------------------------------------------------- */ - -#if i386_HOST_ARCH - -/* Note about discard: possibly there to fool GCC into clearing up - before we do the jump eg. if there are some arguments left on the C - stack that GCC hasn't popped yet. Also possibly to fool any - optimisations (a function call often acts as a barrier). Not sure - if any of this is necessary now -- SDM - - Comment to above note: I don't think the __DISCARD__() in JMP_ is - necessary. Arguments should be popped from the C stack immediately - after returning from a function, as long as we pass -fno-defer-pop - to gcc. Moreover, a goto to a first-class label acts as a barrier - for optimisations in the same way a function call does. - -= chak - */ - -/* The goto here seems to cause gcc -O2 to delete all the code after - it - including the FE_ marker and the epilogue code - exactly what - we want! -- SDM - */ - -#define JMP_(cont) \ - { \ - void *__target; \ - __DISCARD__(); \ - __target = (void *)(cont); \ - goto *__target; \ - } - -#endif /* i386_HOST_ARCH */ - -/* ----------------------------------------------------------------------------- - Tail calling on x86_64 - -------------------------------------------------------------------------- */ - -#if x86_64_HOST_ARCH - -/* - NOTE about __DISCARD__(): - - On x86_64 this is necessary to work around bugs in the register - variable support in gcc. Without the __DISCARD__() call, gcc will - silently throw away assignements to global register variables that - happen before the jump. - - Here's the example: - - extern void g(void); - static void f(void) { - R1 = g; - __DISCARD__() - goto *R1; - } - - without the dummy function call, gcc throws away the assignment to R1 - (gcc 3.4.3) gcc bug #20359. -*/ - -#define JMP_(cont) \ - { \ - __DISCARD__(); \ - goto *(void *)(cont); \ - } - -#endif /* x86_64_HOST_ARCH */ - -/* ----------------------------------------------------------------------------- - Tail calling on Sparc - -------------------------------------------------------------------------- */ - -#ifdef sparc_HOST_ARCH - -#define JMP_(cont) ((F_) (cont))() - /* Oh so happily, the above turns into a "call" instruction, - which, on a SPARC, is nothing but a "jmpl" with the - return address in %o7 [which we don't care about]. - */ - -/* Don't need these for sparc mangling */ -#define FB_ -#define FE_ - -#endif /* sparc_HOST_ARCH */ - -/* ----------------------------------------------------------------------------- - Tail calling on PowerPC - -------------------------------------------------------------------------- */ - -#ifdef powerpc_HOST_ARCH - -#define JMP_(cont) \ - { \ - void *target; \ - target = (void *)(cont); \ - __DISCARD__(); \ - goto *target; \ - } - -/* - The __DISCARD__ is there because Apple's April 2002 Beta of GCC 3.1 - sometimes generates incorrect code otherwise. - It tends to "forget" to update global register variables in the presence - of decrement/increment operators: - JMP_(*(--Sp)) is wrongly compiled as JMP_(Sp[-1]). - Calling __DISCARD__ in between works around this problem. -*/ - -/* - I would _love_ to use the following instead, - but some versions of Apple's GCC fail to generate code for it - if it is called for a casted data pointer - which is exactly what - we are going to do... - - #define JMP_(cont) ((F_) (cont))() -*/ - -#endif /* powerpc_HOST_ARCH */ - -#ifdef powerpc64_HOST_ARCH -#define JMP_(cont) ((F_) (cont))() -#endif - -/* ----------------------------------------------------------------------------- - FUNBEGIN and FUNEND. - - These are markers indicating the start and end of Real Code in a - function. All instructions between the actual start and end of the - function and these markers is shredded by the mangler. - -------------------------------------------------------------------------- */ - -/* The following __DISCARD__() has become necessary with gcc 2.96 on x86. - * It prevents gcc from moving stack manipulation code from the function - * body (aka the Real Code) into the function prologue, ie, from moving it - * over the --- BEGIN --- marker. It should be noted that (like some - * other black magic in GHC's code), there is no essential reason why gcc - * could not move some stack manipulation code across the __DISCARD__() - - * it just doesn't choose to do it at the moment. - * -= chak - */ - -#ifndef FB_ -#define FB_ __asm__ volatile ("--- BEGIN ---"); __DISCARD__ (); -#endif - -#ifndef FE_ -#define FE_ __asm__ volatile ("--- END ---"); -#endif - -#endif /* !USE_MINIINTERPRETER */ - -#endif /* TAILCALLS_H */ |