From 1b3d13b68c95ef9bbeca4437028531d184abcbea Mon Sep 17 00:00:00 2001 From: Sylvain Henry Date: Tue, 23 Jun 2020 10:01:44 +0200 Subject: Fix ghc-bignum exceptions We must ensure that exceptions are not simplified. Previously we used: case raiseDivZero of _ -> 0## -- dummyValue But it was wrong because the evaluation of `raiseDivZero` was removed and the dummy value was directly returned. See new Note [ghc-bignum exceptions]. I've also removed the exception triggering primops which were fragile. We don't need them to be primops, we can have them exported by ghc-prim. I've also added a test for #18359 which triggered this patch. --- rts/Exception.cmm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'rts/Exception.cmm') diff --git a/rts/Exception.cmm b/rts/Exception.cmm index 587708e47e..3216edbcc4 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -14,6 +14,9 @@ #include "RaiseAsync.h" import CLOSURE ghczmprim_GHCziTypes_True_closure; +import CLOSURE base_GHCziExceptionziType_divZZeroException_closure; +import CLOSURE base_GHCziExceptionziType_underflowException_closure; +import CLOSURE base_GHCziExceptionziType_overflowException_closure; /* ----------------------------------------------------------------------------- Exception Primitives @@ -633,6 +636,22 @@ stg_raiseIOzh (P_ exception) jump stg_raisezh (exception); } + +stg_raiseDivZZerozh () +{ + jump stg_raisezh(base_GHCziExceptionziType_divZZeroException_closure); +} + +stg_raiseUnderflowzh () +{ + jump stg_raisezh(base_GHCziExceptionziType_underflowException_closure); +} + +stg_raiseOverflowzh () +{ + jump stg_raisezh(base_GHCziExceptionziType_overflowException_closure); +} + /* The FFI doesn't support variadic C functions so we can't directly expose * `barf` to Haskell code. Instead we define "stg_panic#" and it is exposed to * Haskell programs in GHC.Prim.Panic. -- cgit v1.2.1