X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosureMacros.h;h=b33e86a242ab0a88bfd0c0e6fa8d45276a2f62e3;hb=49c120b93b0688863d46582eee6b20bfbed6c077;hp=0690981adf8955edea39cb62933e0c7380d149b7;hpb=839930a03a9237d3a8c78745c6167f666fedada9;p=ghc-hetmet.git diff --git a/ghc/includes/ClosureMacros.h b/ghc/includes/ClosureMacros.h index 0690981..b33e86a 100644 --- a/ghc/includes/ClosureMacros.h +++ b/ghc/includes/ClosureMacros.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * $Id: ClosureMacros.h,v 1.32 2001/02/06 11:41:04 rrt Exp $ + * $Id: ClosureMacros.h,v 1.34 2002/09/25 20:44:23 wolfgang Exp $ * * (c) The GHC Team, 1998-1999 * @@ -59,7 +59,7 @@ #define get_itbl(c) (INFO_PTR_TO_STRUCT((c)->header.info)) #ifdef TABLES_NEXT_TO_CODE -#define INIT_ENTRY(e) code : {} +#define INIT_ENTRY(e) #define ENTRY_CODE(info) (info) #define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)(info) - 1) static __inline__ StgFunPtr get_entry(const StgInfoTable *itbl) { @@ -79,8 +79,39 @@ static __inline__ StgFunPtr get_entry(const StgInfoTable *itbl) { -------------------------------------------------------------------------- */ #ifdef PROFILING -#define SET_PROF_HDR(c,ccs_) (c)->header.prof.ccs = ccs_ -#define SET_STATIC_PROF_HDR(ccs_) prof : { ccs : ccs_ }, +#ifdef DEBUG_RETAINER +/* + For the sake of debugging, we take the safest way for the moment. Actually, this + is useful to check the sanity of heap before beginning retainer profiling. + flip is defined in RetainerProfile.c, and declared as extern in RetainerProfile.h. + Note: change those functions building Haskell objects from C datatypes, i.e., + all rts_mk???() functions in RtsAPI.c, as well. + */ +extern StgWord flip; +#define SET_PROF_HDR(c,ccs_) \ + ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = (retainerSet *)((StgWord)NULL | flip)) +#else +/* + For retainer profiling only: we do not have to set (c)->header.prof.hp.rs to + NULL | flip (flip is defined in RetainerProfile.c) because even when flip + is 1, rs is invalid and will be initialized to NULL | flip later when + the closure *c is visited. + */ +/* +#define SET_PROF_HDR(c,ccs_) \ + ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = NULL) + */ +/* + The following macro works for both retainer profiling and LDV profiling: + for retainer profiling, ldvTime remains 0, so rs fields are initialized to 0. + See the invariants on ldvTime. + */ +#define SET_PROF_HDR(c,ccs_) \ + ((c)->header.prof.ccs = ccs_, \ + LDV_recordCreate((c))) +#endif // DEBUG_RETAINER +#define SET_STATIC_PROF_HDR(ccs_) \ + prof : { ccs : ccs_, hp : { rs : NULL } }, #else #define SET_PROF_HDR(c,ccs) #define SET_STATIC_PROF_HDR(ccs) @@ -109,6 +140,7 @@ static __inline__ StgFunPtr get_entry(const StgInfoTable *itbl) { #define SET_TICKY_HDR(c,stuff) #define SET_STATIC_TICKY_HDR(stuff) #endif + #define SET_HDR(c,info,ccs) \ { \ SET_INFO(c,info); \