X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FCmm.h;h=7a68a517fe2f4943b27f5e9ddb772af199e5b78d;hb=bb7ffa1642e2110e26e1243c42a8a24adafa985d;hp=715d2b2b0f915fe6dac5c2da29c7dd146f09e62f;hpb=3c58884ef36418f93dc1892125629df73e5d2a79;p=ghc-hetmet.git diff --git a/includes/Cmm.h b/includes/Cmm.h index 715d2b2..7a68a51 100644 --- a/includes/Cmm.h +++ b/includes/Cmm.h @@ -102,18 +102,8 @@ #endif /* - * The RTS must UNTAG a pointer before dereferencing it. - * The use of UNTAG follows the following rules of thumb: - * - * - Any pointer might be tagged. - * - Except the pointers that are passed in R1 to RTS functions. - * - R1 is also untagged when entering constructor code. - * - * TODO: - * - * - Remove redundancies of tagging and untagging in code generation. - * - Optimize getTag or dataToTag# ? - * + * The RTS must sometimes UNTAG a pointer before dereferencing it. + * See the wiki page Commentary/Rts/HaskellExecution/PointerTagging */ #define TAG_MASK ((1 << TAG_BITS) - 1) #define UNTAG(p) (p & ~TAG_MASK) @@ -407,9 +397,12 @@ #define BITMAP_BITS(bitmap) ((bitmap) >> BITMAP_BITS_SHIFT) /* Debugging macros */ -#define LOOKS_LIKE_INFO_PTR(p) \ - ((p) != NULL && \ - (TO_W_(%INFO_TYPE(%STD_INFO(p))) != INVALID_OBJECT) && \ +#define LOOKS_LIKE_INFO_PTR(p) \ + ((p) != NULL && \ + LOOKS_LIKE_INFO_PTR_NOT_NULL(p)) + +#define LOOKS_LIKE_INFO_PTR_NOT_NULL(p) \ + ( (TO_W_(%INFO_TYPE(%STD_INFO(p))) != INVALID_OBJECT) && \ (TO_W_(%INFO_TYPE(%STD_INFO(p))) < N_CLOSURE_TYPES)) #define LOOKS_LIKE_CLOSURE_PTR(p) (LOOKS_LIKE_INFO_PTR(GET_INFO(UNTAG(p)))) @@ -551,9 +544,6 @@ #define END_TSO_QUEUE stg_END_TSO_QUEUE_closure #define END_INVARIANT_CHECK_QUEUE stg_END_INVARIANT_CHECK_QUEUE_closure -#define dirtyTSO(tso) \ - StgTSO_flags(tso) = StgTSO_flags(tso) | TSO_DIRTY::I32; - #define recordMutableCap(p, gen, regs) \ W_ __bd; \ W_ mut_list; \