X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FEvac.h;h=ad56c644d829f9a818263ef7662addadb841453d;hb=HEAD;hp=c89e4d9a7d552f4c863f669c7c0fc11a2b90cdda;hpb=ab0e778ccfde61aed4c22679b24d175fc6cc9bf3;p=ghc-hetmet.git diff --git a/rts/sm/Evac.h b/rts/sm/Evac.h index c89e4d9..ad56c64 100644 --- a/rts/sm/Evac.h +++ b/rts/sm/Evac.h @@ -1,18 +1,43 @@ /* ----------------------------------------------------------------------------- * - * (c) The GHC Team 1998-2006 + * (c) The GHC Team 1998-2008 * * Generational garbage collector: evacuation functions * + * Documentation on the architecture of the Garbage Collector can be + * found in the online commentary: + * + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC + * * ---------------------------------------------------------------------------*/ +#ifndef SM_EVAC_H +#define SM_EVAC_H + +#include "BeginPrivate.h" + // Use a register argument for evacuate, if available. -#if __GNUC__ >= 2 +// Earlier, the regparm attribute was used whenever __GNUC__ >= 2, but this +// generated warnings on PPC. So the use is restricted further. +// See http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html that says +// regparm (number) +// On the Intel 386, the regparm attribute causes the compiler to pass +// arguments number one to number if they are of integral type in +// registers EAX, EDX, and ECX instead of on the stack. Functions that +// take a variable number of arguments will continue to be passed all of +// their arguments on the stack. +#if __GNUC__ >= 2 && (defined(x86_64_HOST_ARCH) || defined(i386_HOST_ARCH)) #define REGPARM1 __attribute__((regparm(1))) #else #define REGPARM1 #endif -REGPARM1 StgClosure * evacuate (StgClosure *q); +REGPARM1 void evacuate (StgClosure **p); +REGPARM1 void evacuate1 (StgClosure **p); extern lnat thunk_selector_depth; + +#include "EndPrivate.h" + +#endif /* SM_EVAC_H */ +