X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcodeGen%2FCgHeapery.lhs;h=9cb1bb4370f85e381b0594dffc32f92d11c1c2b8;hb=e5d9aaa2b7b717c862651f8eea5e2dc66f0a8028;hp=dfa49ebb47f0723328653c308a5fdc66be67faf5;hpb=81b2276ff9434d97aff683218c34c86479a8d868;p=ghc-hetmet.git diff --git a/compiler/codeGen/CgHeapery.lhs b/compiler/codeGen/CgHeapery.lhs index dfa49eb..9cb1bb4 100644 --- a/compiler/codeGen/CgHeapery.lhs +++ b/compiler/codeGen/CgHeapery.lhs @@ -5,6 +5,13 @@ \section[CgHeapery]{Heap management functions} \begin{code} +{-# OPTIONS -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings +-- for details + module CgHeapery ( initHeapUsage, getVirtHp, setVirtHp, setRealHp, getHpRelOffset, hpRel, @@ -224,7 +231,7 @@ mkStaticClosure :: CLabel -> CostCentreStack -> [CmmLit] mkStaticClosure info_lbl ccs payload padding_wds static_link_field saved_info_field = [CmmLabel info_lbl] ++ variable_header_words - ++ payload + ++ concatMap padLitToWord payload ++ padding_wds ++ static_link_field ++ saved_info_field @@ -234,6 +241,17 @@ mkStaticClosure info_lbl ccs payload padding_wds static_link_field saved_info_fi ++ staticParHdr ++ staticProfHdr ccs ++ staticTickyHdr + +padLitToWord :: CmmLit -> [CmmLit] +padLitToWord lit = lit : padding pad_length + where rep = cmmLitRep lit + pad_length = wORD_SIZE - machRepByteWidth rep :: Int + + padding n | n <= 0 = [] + | n `rem` 2 /= 0 = CmmInt 0 I8 : padding (n-1) + | n `rem` 4 /= 0 = CmmInt 0 I16 : padding (n-2) + | n `rem` 8 /= 0 = CmmInt 0 I32 : padding (n-4) + | otherwise = CmmInt 0 I64 : padding (n-8) \end{code} %************************************************************************ @@ -458,7 +476,7 @@ do_checks' stk_expr hp_expr stk_nonzero hp_nonzero reg_save_code rts_lbl [CmmMachOp mo_wordSub [CmmReg spReg, stk_expr], CmmReg (CmmGlobal SpLim)] - -- Hp overflow if (Hpp > HpLim) + -- Hp overflow if (Hp > HpLim) -- (Hp has been incremented by now) -- HpLim points to the LAST WORD of valid allocation space. hp_oflo = CmmMachOp mo_wordUGt