diff options
Diffstat (limited to 'compiler/codeGen/StgCmmCon.hs')
-rw-r--r-- | compiler/codeGen/StgCmmCon.hs | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/compiler/codeGen/StgCmmCon.hs b/compiler/codeGen/StgCmmCon.hs index 368bc53483..724490c133 100644 --- a/compiler/codeGen/StgCmmCon.hs +++ b/compiler/codeGen/StgCmmCon.hs @@ -34,6 +34,7 @@ import Module import Constants import DataCon import FastString +import IdInfo( CafInfo(..) ) import Id import Literal import PrelInfo @@ -68,10 +69,13 @@ cgTopRhsCon id con args ; let name = idName id lf_info = mkConLFInfo con - closure_label = mkClosureLabel name $ idCafInfo id - caffy = any stgArgHasCafRefs args - (closure_info, nv_args_w_offsets) - = layOutStaticConstr con (addArgReps args) + closure_label = mkClosureLabel name caffy + caffy = idCafInfo id -- any stgArgHasCafRefs args + + (tot_wds, -- #ptr_wds + #nonptr_wds + ptr_wds, -- #ptr_wds + nv_args_w_offsets) = mkVirtConstrOffsets (addArgReps args) + closure_info = mkConInfo False caffy con tot_wds ptr_wds get_lit (arg, _offset) = do { CmmLit lit <- getArgAmode arg ; return lit } @@ -190,8 +194,10 @@ buildDynCon binder _cc con [arg] -------- buildDynCon: the general case ----------- buildDynCon binder ccs con args - = do { let (cl_info, args_w_offsets) = layOutDynConstr con (addArgReps args) + = do { let (tot_wds, ptr_wds, args_w_offsets) + = mkVirtConstrOffsets (addArgReps args) -- No void args in args_w_offsets + cl_info = mkConInfo False NoCafRefs con tot_wds ptr_wds ; (tmp, init) <- allocDynClosure cl_info use_cc blame_cc args_w_offsets ; regIdInfo binder lf_info tmp init } where @@ -217,7 +223,7 @@ bindConArgs (DataAlt con) base args = ASSERT(not (isUnboxedTupleCon con)) mapM bind_arg args_w_offsets where - (_, args_w_offsets) = layOutDynConstr con (addIdReps args) + (_, _, args_w_offsets) = mkVirtConstrOffsets (addIdReps args) tag = tagForCon con |