X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FCmmParse.y;h=9d83e2f1a8a2cc652945a4b1ee8aa6ad2d293cf2;hb=ac808e641e285df89b8f1bcda95b6e859bb4e4ab;hp=2f42f8cab579d4d50b19347eda08482e87349e42;hpb=ec6e7468ff70c40c2f24792cec0261512ee32431;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmParse.y b/compiler/cmm/CmmParse.y index 2f42f8c..9d83e2f 100644 --- a/compiler/cmm/CmmParse.y +++ b/compiler/cmm/CmmParse.y @@ -30,6 +30,7 @@ import CgCallConv import CgClosure import CostCentre +import BlockId import Cmm import PprCmm import CmmUtils @@ -52,6 +53,7 @@ import FastString import Panic import Constants import Outputable +import Bag ( emptyBag, unitBag ) import Control.Monad import Data.Array @@ -472,10 +474,10 @@ cmm_kind_exprs :: { [ExtFCode CmmActual] } | cmm_kind_expr ',' cmm_kind_exprs { $1 : $3 } cmm_kind_expr :: { ExtFCode CmmActual } - : expr { do e <- $1; return (CmmHinted e (inferCmmKind e)) } + : expr { do e <- $1; return (CmmKinded e (inferCmmKind e)) } | expr STRING {% do h <- parseCmmKind $2; return $ do - e <- $1; return (CmmHinted e h) } + e <- $1; return (CmmKinded e h) } exprs0 :: { [ExtFCode CmmExpr] } : {- empty -} { [] } @@ -499,10 +501,10 @@ cmm_formals :: { [ExtFCode CmmFormal] } | cmm_formal ',' cmm_formals { $1 : $3 } cmm_formal :: { ExtFCode CmmFormal } - : local_lreg { do e <- $1; return (CmmHinted e (inferCmmKind (CmmReg (CmmLocal e)))) } + : local_lreg { do e <- $1; return (CmmKinded e (inferCmmKind (CmmReg (CmmLocal e)))) } | STRING local_lreg {% do h <- parseCmmKind $1; return $ do - e <- $2; return (CmmHinted e h) } + e <- $2; return (CmmKinded e h) } local_lreg :: { ExtFCode LocalReg } : NAME { do e <- lookupName $1; @@ -764,6 +766,7 @@ stmtMacros = listToUFM [ ( fsLit "RET_NPP", \[a,b,c] -> emitRetUT [(NonPtrArg,a),(PtrArg,b),(PtrArg,c)]), ( fsLit "RET_NNP", \[a,b,c] -> emitRetUT [(NonPtrArg,a),(NonPtrArg,b),(PtrArg,c)]), ( fsLit "RET_NNN", \[a,b,c] -> emitRetUT [(NonPtrArg,a),(NonPtrArg,b),(NonPtrArg,c)]), + ( fsLit "RET_NNNN", \[a,b,c,d] -> emitRetUT [(NonPtrArg,a),(NonPtrArg,b),(NonPtrArg,c),(NonPtrArg,d)]), ( fsLit "RET_NNNP", \[a,b,c,d] -> emitRetUT [(NonPtrArg,a),(NonPtrArg,b),(NonPtrArg,c),(PtrArg,d)]), ( fsLit "RET_NPNP", \[a,b,c,d] -> emitRetUT [(NonPtrArg,a),(PtrArg,b),(NonPtrArg,c),(PtrArg,d)]) @@ -924,13 +927,13 @@ foreignCall conv_string results_code expr_code args_code vols safety ret (CmmCallee expr' convention) args vols NoC_SRT ret) where unused = panic "not used by emitForeignCall'" -adjCallTarget :: CCallConv -> CmmExpr -> [CmmHinted CmmExpr] -> CmmExpr +adjCallTarget :: CCallConv -> CmmExpr -> [CmmKinded CmmExpr] -> CmmExpr #ifdef mingw32_TARGET_OS -- On Windows, we have to add the '@N' suffix to the label when making -- a call with the stdcall calling convention. adjCallTarget StdCallConv (CmmLit (CmmLabel lbl)) args = CmmLit (CmmLabel (addLabelSize lbl (sum (map size args)))) - where size (CmmHinted e _) = max wORD_SIZE (machRepByteWidth (cmmExprRep e)) + where size (CmmKinded e _) = max wORD_SIZE (machRepByteWidth (cmmExprRep e)) -- c.f. CgForeignCall.emitForeignCall #endif adjCallTarget _ expr _ @@ -1090,7 +1093,7 @@ initEnv = listToUFM [ Var (CmmLit (CmmInt (fromIntegral stdInfoTableSizeB) wordRep) )) ] -parseCmmFile :: DynFlags -> FilePath -> IO (Maybe Cmm) +parseCmmFile :: DynFlags -> FilePath -> IO (Messages, Maybe Cmm) parseCmmFile dflags filename = do showPass dflags "ParseCmm" buf <- hGetStringBuffer filename @@ -1100,14 +1103,17 @@ parseCmmFile dflags filename = do -- reset the lex_state: the Lexer monad leaves some stuff -- in there we don't want. case unP cmmParse init_state of - PFailed span err -> do printError span err; return Nothing + PFailed span err -> do + let msg = mkPlainErrMsg span err + return ((emptyBag, unitBag msg), Nothing) POk pst code -> do - cmm <- initC dflags no_module (getCmm (unEC code initEnv [] >> return ())) - let ms = getMessages pst - printErrorsAndWarnings dflags ms - when (errorsFound dflags ms) $ exitWith (ExitFailure 1) - dumpIfSet_dyn dflags Opt_D_dump_cmm "Cmm" (ppr cmm) - return (Just cmm) + cmm <- initC dflags no_module (getCmm (unEC code initEnv [] >> return ())) + let ms = getMessages pst + if (errorsFound dflags ms) + then return (ms, Nothing) + else do + dumpIfSet_dyn dflags Opt_D_dump_cmm "Cmm" (ppr cmm) + return (ms, Just cmm) where no_module = panic "parseCmmFile: no module" }