X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=includes%2FTailCalls.h;h=854c7b4b186830d5edba146c435626cd804c3143;hp=7927359ff185861553c4bca481ab50be750a13b1;hb=d7d755865a3849be26a468a3fa430ff96c8e9e0c;hpb=2d0adf8f0729cf8a4d988eaac48a480378b191ce diff --git a/includes/TailCalls.h b/includes/TailCalls.h index 7927359..854c7b4 100644 --- a/includes/TailCalls.h +++ b/includes/TailCalls.h @@ -233,8 +233,17 @@ but uses $$dyncall if necessary to cope, just in case you aren't. #ifdef ia64_HOST_ARCH /* The compiler can more intelligently decide how to do this. We therefore - * implement it as a call and optimise to a jump at mangle time. */ -#define JMP_(cont) ((F_) (cont))(); __asm__ volatile ("--- TAILCALL ---"); + * implement it as a call and optimise to a jump at mangle time. + * + * Sometimes GCC likes to move instructions between the function call and + * the "--- TAILCALL ---". To stop it from finding instructions to put + * there, we insert a jump to the end of the function after the TAILCALL. */ +#define JMP_(cont) \ + ((F_) (cont))(); \ + __asm__ volatile ("--- TAILCALL ---"); \ + goto _function_end; + +#define FE_ _function_end: __asm__ volatile ("--- END ---"); /* Don't emit calls to __DISCARD__ as this causes hassles */ #define __DISCARD__()