GHC build system have custom autoconf check for create_timer() function from librt. Check description says that it checks for CLOCK_REALTIME timer, but checking code also checks for CLOCK_PROCESS_CPUTIME_ID timer, which is not commonly present (for example, FreeBSD doesn't have it). This makes whole check fail despite the fact that FreeBSD have create_timer() call and supports CLOCK_REALTIME. As a consequence, GHC RTS falls back to using SIGALRM for its timing machinery. Not only it's very ancient codepath, it also break some FFI bindings to C code that isn't prepared for syscall interruption caused by SIGALRM delivery.
Grepping through ghc source code reveals that USE_TIMER_CREATE defininition in the config.h doesn't imply having CLOCK_PROCESS_CPUTIME_ID. The only place where CLOCK_PROCESS_CPUTIME_ID is used is rts/posix/GetTime.c and this code handles the absence of CLOCK_PROCESS_CPUTIME_ID gracefully.
This patch makes autoconf checking code to check only for timer_create(CLOCK_REALTIME, ...) and fixes check description.