summaryrefslogtreecommitdiff
path: root/rts/include/Cmm.h
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2023-05-02 13:00:50 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-05-15 18:02:20 -0400
commit73b1e87c76093c2e1de395472ffb3048cbf01e99 (patch)
tree635a8cdbb031da39d0c028de929cc28b5af90959 /rts/include/Cmm.h
parenta5f5f067377d43867aee07e5696c59cff46436fd (diff)
downloadhaskell-73b1e87c76093c2e1de395472ffb3048cbf01e99.tar.gz
rts: Assert that pointers aren't cleared by -DZ
This turns many segmentation faults into much easier-to-debug assertion failures by ensuring that LOOKS_LIKE_*_PTR checks recognize bit-patterns produced by `+RTS -DZ` clearing as invalid pointers. This is a bit ad-hoc but this is the debug runtime.
Diffstat (limited to 'rts/include/Cmm.h')
-rw-r--r--rts/include/Cmm.h8
1 files changed, 6 insertions, 2 deletions
diff --git a/rts/include/Cmm.h b/rts/include/Cmm.h
index a1cf44c31b..7936bc8b85 100644
--- a/rts/include/Cmm.h
+++ b/rts/include/Cmm.h
@@ -607,16 +607,20 @@
#define BITMAP_SIZE(bitmap) ((bitmap) & BITMAP_SIZE_MASK)
#define BITMAP_BITS(bitmap) ((bitmap) >> BITMAP_BITS_SHIFT)
+#define LOOKS_LIKE_PTR(p) ((p) != NULL && (p) != INVALID_GHC_POINTER)
+
/* Debugging macros */
#define LOOKS_LIKE_INFO_PTR(p) \
- ((p) != NULL && \
+ (LOOKS_LIKE_PTR(p) && \
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))))
+#define LOOKS_LIKE_CLOSURE_PTR(p) \
+ ( LOOKS_LIKE_PTR(p) && \
+ LOOKS_LIKE_INFO_PTR(GET_INFO(UNTAG(p))))
/*
* The layout of the StgFunInfoExtra part of an info table changes