X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fcmm%2FPprC.hs;h=7127be351ce0df389d25696f9affec26516ea9db;hp=817e82bfefc7f49f333890f6f826eb9aef898fbf;hb=17b297d97d327620ed6bfab942f8992b2446f1bf;hpb=affbe8dae5d7eb350686b42ddbd4f3561b7bd0ec diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs index 817e82b..7127be3 100644 --- a/compiler/cmm/PprC.hs +++ b/compiler/cmm/PprC.hs @@ -16,6 +16,13 @@ -- ToDo: save/restore volatile registers around calls. +{-# OPTIONS_GHC -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/WorkingConventions#Warnings +-- for details + module PprC ( writeCs, pprStringInCStyle @@ -66,7 +73,7 @@ import StaticFlags ( opt_Unregisterised ) -- -------------------------------------------------------------------------- -- Top level -pprCs :: DynFlags -> [Cmm] -> SDoc +pprCs :: DynFlags -> [RawCmm] -> SDoc pprCs dflags cmms = pprCode CStyle (vcat $ map (\c -> split_marker $$ pprC c) cmms) where @@ -74,7 +81,7 @@ pprCs dflags cmms | dopt Opt_SplitObjs dflags = ptext SLIT("__STG_SPLIT_MARKER") | otherwise = empty -writeCs :: DynFlags -> Handle -> [Cmm] -> IO () +writeCs :: DynFlags -> Handle -> [RawCmm] -> IO () writeCs dflags handle cmms = printForC handle (pprCs dflags cmms) @@ -84,13 +91,13 @@ writeCs dflags handle cmms -- for fun, we could call cmmToCmm over the tops... -- -pprC :: Cmm -> SDoc +pprC :: RawCmm -> SDoc pprC (Cmm tops) = vcat $ intersperse (text "") $ map pprTop tops -- -- top level procs -- -pprTop :: CmmTop -> SDoc +pprTop :: RawCmmTop -> SDoc pprTop (CmmProc info clbl _params blocks) = (if not (null info) then pprDataExterns info $$ @@ -199,11 +206,11 @@ pprStmt stmt = case stmt of where rep = cmmExprRep src - CmmCall (CmmForeignCall fn cconv) results args srt -> + CmmCall (CmmCallee fn cconv) results args safety _ret -> -- Controversial: leave this out for now. -- pprUndef fn $$ - pprCall ppr_fn cconv results args srt + pprCall ppr_fn cconv results args safety where ppr_fn = case fn of CmmLit (CmmLabel lbl) -> pprCLabel lbl @@ -220,8 +227,8 @@ pprStmt stmt = case stmt of ptext SLIT("#undef") <+> pprCLabel lbl pprUndef _ = empty - CmmCall (CmmPrim op) results args srt -> - pprCall ppr_fn CCallConv results args srt + CmmCall (CmmPrim op) results args safety _ret -> + pprCall ppr_fn CCallConv results args safety where ppr_fn = pprCallishMachOp_for_C op @@ -322,8 +329,9 @@ pprExpr e = case e of -> char '*' <> pprAsPtrReg r CmmLoad (CmmRegOff r off) rep - | isPtrReg r && rep == wordRep + | isPtrReg r && rep == wordRep && (off `rem` wORD_SIZE == 0) -- ToDo: check that the offset is a word multiple? + -- (For tagging to work, I had to avoid unaligned loads. --ARY) -> pprAsPtrReg r <> brackets (ppr (off `shiftR` wordShift)) CmmLoad expr rep -> @@ -632,12 +640,12 @@ pprAssign r1 (CmmRegOff r2 off) -- We can't cast the lvalue, so we have to cast the rhs if necessary. Casting -- the lvalue elicits a warning from new GCC versions (3.4+). pprAssign r1 r2 - | isFixedPtrReg r1 - = pprReg r1 <> ptext SLIT(" = ") <> mkP_ <> pprExpr1 r2 <> semi - | Just ty <- strangeRegType r1 - = pprReg r1 <> ptext SLIT(" = ") <> parens ty <> pprExpr1 r2 <> semi - | otherwise - = pprReg r1 <> ptext SLIT(" = ") <> pprExpr r2 <> semi + | isFixedPtrReg r1 = mkAssign (mkP_ <> pprExpr1 r2) + | Just ty <- strangeRegType r1 = mkAssign (parens ty <> pprExpr1 r2) + | otherwise = mkAssign (pprExpr r2) + where mkAssign x = if r1 == CmmGlobal BaseReg + then ptext SLIT("ASSIGN_BaseReg") <> parens x <> semi + else pprReg r1 <> ptext SLIT(" = ") <> x <> semi -- --------------------------------------------------------------------- -- Registers @@ -719,7 +727,7 @@ pprLocalReg (LocalReg uniq _ _) = char '_' <> ppr uniq -- ----------------------------------------------------------------------------- -- Foreign Calls -pprCall :: SDoc -> CCallConv -> CmmHintFormals -> CmmActuals -> C_SRT +pprCall :: SDoc -> CCallConv -> CmmHintFormals -> CmmActuals -> CmmSafety -> SDoc pprCall ppr_fn cconv results args _ @@ -794,12 +802,8 @@ pprExternDecl in_srt lbl | not (needsCDecl lbl) = empty | otherwise = hcat [ visibility, label_type (labelType lbl), - lparen, dyn_wrapper (pprCLabel lbl), text ");" ] + lparen, pprCLabel lbl, text ");" ] where - dyn_wrapper d - | in_srt && labelDynamic lbl = text "DLL_IMPORT_DATA_VAR" <> parens d - | otherwise = d - label_type CodeLabel = ptext SLIT("F_") label_type DataLabel = ptext SLIT("I_") @@ -840,7 +844,7 @@ te_Lit _ = return () te_Stmt :: CmmStmt -> TE () te_Stmt (CmmAssign r e) = te_Reg r >> te_Expr e te_Stmt (CmmStore l r) = te_Expr l >> te_Expr r -te_Stmt (CmmCall _ rs es _) = mapM_ (te_temp.fst) rs >> +te_Stmt (CmmCall _ rs es _ _) = mapM_ (te_temp.fst) rs >> mapM_ (te_Expr.fst) es te_Stmt (CmmCondBranch e _) = te_Expr e te_Stmt (CmmSwitch e _) = te_Expr e