X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FCmmInfo.hs;h=3524377ac588b2a508e839308c438ac4fbe86f5c;hb=16a2f6a8a381af31c23b6a41a851951da9bc1803;hp=3f458b53518f199912a59c505792c0e4844120a9;hpb=f47653a986cd329dc9159906432f2ed7819a4043;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmInfo.hs b/compiler/cmm/CmmInfo.hs index 3f458b5..3524377 100644 --- a/compiler/cmm/CmmInfo.hs +++ b/compiler/cmm/CmmInfo.hs @@ -1,3 +1,10 @@ +{-# 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 CmmInfo ( cmmToRawCmm, mkInfoTable @@ -7,7 +14,6 @@ module CmmInfo ( import Cmm import CmmUtils -import PprCmm import CLabel import MachOp @@ -21,7 +27,6 @@ import SMRep import Constants import StaticFlags -import DynFlags import Unique import UniqSupply import Panic @@ -71,77 +76,73 @@ cmmToRawCmm cmm = do mkInfoTable :: Unique -> CmmTop -> [RawCmmTop] mkInfoTable uniq (CmmData sec dat) = [CmmData sec dat] -mkInfoTable uniq (CmmProc info entry_label arguments blocks) = +mkInfoTable uniq (CmmProc (CmmInfo _ _ info) entry_label arguments blocks) = case info of -- | Code without an info table. Easy. - CmmNonInfo _ -> [CmmProc [] entry_label arguments blocks] - - -- | A function entry point. - CmmInfo (ProfilingInfo ty_prof cl_prof) _ type_tag - (FunInfo (ptrs, nptrs) srt fun_type fun_arity - pap_bitmap slow_entry) -> - mkInfoTableAndCode info_label std_info fun_extra_bits entry_label - arguments blocks - where - fun_extra_bits = - [packHalfWordsCLit fun_type fun_arity] ++ - case pap_bitmap of + CmmNonInfoTable -> [CmmProc [] entry_label arguments blocks] + + CmmInfoTable (ProfilingInfo ty_prof cl_prof) type_tag type_info -> + let info_label = entryLblToInfoLbl entry_label + ty_prof' = makeRelativeRefTo info_label ty_prof + cl_prof' = makeRelativeRefTo info_label cl_prof + in case type_info of + -- | A function entry point. + FunInfo (ptrs, nptrs) srt fun_type fun_arity pap_bitmap slow_entry -> + mkInfoTableAndCode info_label std_info fun_extra_bits entry_label + arguments blocks + where + fun_extra_bits = + [packHalfWordsCLit fun_type fun_arity] ++ + case pap_bitmap of ArgGen liveness -> (if null srt_label then [mkIntCLit 0] else srt_label) ++ [makeRelativeRefTo info_label $ mkLivenessCLit liveness, makeRelativeRefTo info_label slow_entry] _ -> srt_label - std_info = mkStdInfoTable ty_prof cl_prof type_tag srt_bitmap layout - info_label = entryLblToInfoLbl entry_label - (srt_label, srt_bitmap) = mkSRTLit info_label srt - layout = packHalfWordsCLit ptrs nptrs - - -- | A constructor. - CmmInfo (ProfilingInfo ty_prof cl_prof) _ type_tag - (ConstrInfo (ptrs, nptrs) con_tag descr) -> - mkInfoTableAndCode info_label std_info [con_name] entry_label - arguments blocks - where - std_info = mkStdInfoTable ty_prof cl_prof type_tag con_tag layout - info_label = entryLblToInfoLbl entry_label - con_name = makeRelativeRefTo info_label descr - layout = packHalfWordsCLit ptrs nptrs - - -- | A thunk. - CmmInfo (ProfilingInfo ty_prof cl_prof) _ type_tag - (ThunkInfo (ptrs, nptrs) srt) -> - mkInfoTableAndCode info_label std_info srt_label entry_label - arguments blocks - where - std_info = mkStdInfoTable ty_prof cl_prof type_tag srt_bitmap layout - info_label = entryLblToInfoLbl entry_label - (srt_label, srt_bitmap) = mkSRTLit info_label srt - layout = packHalfWordsCLit ptrs nptrs - - -- | A selector thunk. - CmmInfo (ProfilingInfo ty_prof cl_prof) _ type_tag - (ThunkSelectorInfo offset srt) -> - mkInfoTableAndCode info_label std_info [{- no SRT -}] entry_label - arguments blocks - where - std_info = mkStdInfoTable ty_prof cl_prof type_tag 0 (mkWordCLit offset) - info_label = entryLblToInfoLbl entry_label - - -- A continuation/return-point. - CmmInfo (ProfilingInfo ty_prof cl_prof) _ type_tag (ContInfo stack_layout srt) -> - liveness_data ++ - mkInfoTableAndCode info_label std_info srt_label entry_label - arguments blocks - where - std_info = mkStdInfoTable ty_prof cl_prof maybe_big_type_tag srt_bitmap - (makeRelativeRefTo info_label liveness_lit) - info_label = entryLblToInfoLbl entry_label - (liveness_lit, liveness_data, liveness_tag) = - mkLiveness uniq stack_layout - maybe_big_type_tag = if type_tag == rET_SMALL - then liveness_tag - else type_tag - (srt_label, srt_bitmap) = mkSRTLit info_label srt + std_info = mkStdInfoTable ty_prof' cl_prof' type_tag srt_bitmap + layout + (srt_label, srt_bitmap) = mkSRTLit info_label srt + layout = packHalfWordsCLit ptrs nptrs + + -- | A constructor. + ConstrInfo (ptrs, nptrs) con_tag descr -> + mkInfoTableAndCode info_label std_info [con_name] entry_label + arguments blocks + where + std_info = mkStdInfoTable ty_prof' cl_prof' type_tag con_tag layout + con_name = makeRelativeRefTo info_label descr + layout = packHalfWordsCLit ptrs nptrs + + -- | A thunk. + ThunkInfo (ptrs, nptrs) srt -> + mkInfoTableAndCode info_label std_info srt_label entry_label + arguments blocks + where + std_info = mkStdInfoTable ty_prof' cl_prof' type_tag srt_bitmap layout + (srt_label, srt_bitmap) = mkSRTLit info_label srt + layout = packHalfWordsCLit ptrs nptrs + + -- | A selector thunk. + ThunkSelectorInfo offset srt -> + mkInfoTableAndCode info_label std_info [{- no SRT -}] entry_label + arguments blocks + where + std_info = mkStdInfoTable ty_prof' cl_prof' type_tag 0 (mkWordCLit offset) + + -- A continuation/return-point. + ContInfo stack_layout srt -> + liveness_data ++ + mkInfoTableAndCode info_label std_info srt_label entry_label + arguments blocks + where + std_info = mkStdInfoTable ty_prof' cl_prof' maybe_big_type_tag srt_bitmap + (makeRelativeRefTo info_label liveness_lit) + (liveness_lit, liveness_data, liveness_tag) = + mkLiveness uniq stack_layout + maybe_big_type_tag = if type_tag == rET_SMALL + then liveness_tag + else type_tag + (srt_label, srt_bitmap) = mkSRTLit info_label srt -- Handle the differences between tables-next-to-code -- and not tables-next-to-code @@ -150,22 +151,22 @@ mkInfoTableAndCode :: CLabel -> [CmmLit] -> CLabel -> CmmFormals - -> [CmmBasicBlock] + -> ListGraph CmmStmt -> [RawCmmTop] mkInfoTableAndCode info_lbl std_info extra_bits entry_lbl args blocks | tablesNextToCode -- Reverse the extra_bits; and emit the top-level proc = [CmmProc (map CmmStaticLit (reverse extra_bits ++ std_info)) entry_lbl args blocks] - | null blocks -- No actual code; only the info table is significant + | ListGraph [] <- blocks -- No code; only the info table is significant = -- Use a zero place-holder in place of the -- entry-label in the info table [mkRODataLits info_lbl (zeroCLit : std_info ++ extra_bits)] | otherwise -- Separately emit info table (with the function entry = -- point as first entry) and the entry code - [mkDataLits info_lbl (CmmLabel entry_lbl : std_info ++ extra_bits), - CmmProc [] entry_lbl args blocks] + [CmmProc [] entry_lbl args blocks, + mkDataLits info_lbl (CmmLabel entry_lbl : std_info ++ extra_bits)] mkSRTLit :: CLabel -> C_SRT @@ -213,7 +214,9 @@ mkLiveness uniq live = mkBits (reg:regs) = take sizeW bits ++ mkBits regs where sizeW = case reg of Nothing -> 1 - Just r -> machRepByteWidth (localRegRep r) `quot` wORD_SIZE + Just r -> (machRepByteWidth (localRegRep r) + wORD_SIZE - 1) + `quot` wORD_SIZE + -- number of words, rounded up bits = repeat $ is_non_ptr reg -- True <=> Non Ptr is_non_ptr Nothing = True @@ -272,3 +275,7 @@ mkStdInfoTable type_descr closure_descr cl_type srt_len layout_lit | otherwise = [] type_lit = packHalfWordsCLit cl_type srt_len + + +_unused :: FS.FastString -- stops a warning +_unused = undefined