The bug is observed on m68k-linux target as crash
- a.hs: main = print 43
$ inplace/bin/ghc-stage1 --make -debug a.hs
$ ./a Program terminated with signal SIGSEGV, Segmentation fault. Trac #0 0x80463b0a in LOOKS_LIKE_INFO_PTR_NOT_NULL (p=32858) at includes/rts/storage/ClosureMacros.h:248 (gdb) bt Trac #0 0x80463b0a in LOOKS_LIKE_INFO_PTR_NOT_NULL (p=32858) at includes/rts/storage/ClosureMacros.h:248 Trac #1 0x80463b46 in LOOKS_LIKE_INFO_PTR (p=32858) at includes/rts/storage/ClosureMacros.h:253 Trac #2 0x80463b6c in LOOKS_LIKE_CLOSURE_PTR ( p=0x805aac6e <stg_dummy_ret_closure>) at includes/rts/storage/ClosureMacros.h:258 Trac #3 0x80463e4c in initStorage () at rts/sm/Storage.c:121 Trac #4 0x8043ffb4 in hs_init_ghc (...) at rts/RtsStartup.c:181 Trac #5 0x80455982 in hs_main (...) at rts/RtsMain.c:51 Trac #6 0x80003c1c in main ()
GHC assumes last 2 pointer bits are tags on 32-bit targets.
But here 'stg_dummy_ret_closure' address violates the assumption:
LOOKS_LIKE_CLOSURE_PTR (p=0x805aac6e <stg_dummy_ret_closure>)
I've added compiler hint for static StgClosure objects to
align closures at least by their natural alignment (what GHC assumes).
See Note [StgWord alignment].
Signed-off-by: Sergei Trofimovich <firstname.lastname@example.org>