[commit: ghc] master: Fix bug in previous fix for #5654 (2a02040)
git at git.haskell.org
git at git.haskell.org
Sun Dec 18 01:02:04 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/2a02040b2e23daa4f791afc290c33c9bbe3c620c/ghc
>---------------------------------------------------------------
commit 2a02040b2e23daa4f791afc290c33c9bbe3c620c
Author: Simon Marlow <marlowsd at gmail.com>
Date: Sat Dec 17 18:08:48 2016 -0500
Fix bug in previous fix for #5654
I forgot to account for BCOs, which have a different layout from
functions. This caused crashes when using profiling with GHCi (via
-fexternal-interpreter -prof), which unfortunately is not tested at all
by validate, even when profiling is enabled. I'm going to add some
testing that would have caught this in a separate patch.
Test Plan:
```
cd nofib/spectral/puzzle && make NoFibWithGHCi=YES
EXTRA_RUNTEST_OPTS='-fexternal-interpreter -prof'
```
New testsuite tests coming in a separate diff.
Reviewers: niteria, austin, erikd, bgamari
Reviewed By: bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2868
GHC Trac Issues: #5654
>---------------------------------------------------------------
2a02040b2e23daa4f791afc290c33c9bbe3c620c
rts/Apply.cmm | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/rts/Apply.cmm b/rts/Apply.cmm
index 3a73ce0..b18c347 100644
--- a/rts/Apply.cmm
+++ b/rts/Apply.cmm
@@ -57,6 +57,7 @@ stg_ap_0_fast ( P_ fun )
again:
W_ info;
W_ untaggedfun;
+ W_ arity;
untaggedfun = UNTAG(fun);
info = %INFO_PTR(untaggedfun);
switch [INVALID_OBJECT .. N_CLOSURE_TYPES]
@@ -68,6 +69,11 @@ again:
fun = StgInd_indirectee(fun);
goto again;
}
+ case BCO:
+ {
+ arity = TO_W_(StgBCO_arity(untaggedfun));
+ goto dofun;
+ }
case
FUN,
FUN_1_0,
@@ -75,9 +81,10 @@ again:
FUN_2_0,
FUN_1_1,
FUN_0_2,
- FUN_STATIC,
- BCO:
+ FUN_STATIC:
{
+ arity = TO_W_(StgFunInfoExtra_arity(%FUN_INFO(info)));
+ dofun:
if (CCCS == StgHeader_ccs(untaggedfun)) {
return (fun);
} else {
@@ -92,10 +99,8 @@ again:
// attribute this allocation to the "overhead of profiling"
CCS_ALLOC(BYTES_TO_WDS(SIZEOF_StgPAP), CCS_OVERHEAD);
P_ pap;
- W_ arity;
pap = Hp - SIZEOF_StgPAP + WDS(1);
SET_HDR(pap, stg_PAP_info, CCCS);
- arity = TO_W_(StgFunInfoExtra_arity(%FUN_INFO(info)));
StgPAP_arity(pap) = arity;
StgPAP_fun(pap) = fun;
StgPAP_n_args(pap) = 0;
More information about the ghc-commits
mailing list