ghc-lib 0.20190603 → 0.20190703
raw patch · 168 files changed
+5627/−2969 lines, 168 filesdep ~ghc-lib-parserPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ghc-lib-parser
API changes (from Hackage documentation)
- GhcPlugins: dVarSetElemsWellScoped :: DVarSet -> [Var]
- GhcPlugins: tyCoVarsOfBindersWellScoped :: [TyVar] -> [TyVar]
- ListT: instance GHC.Base.Functor (ListT.ListT f)
- LlvmCodeGen.Base: type LlvmVersion = (Int, Int)
- TcHoleErrors: instance GHC.Classes.Eq TcHoleErrors.HoleFit
- TcHoleErrors: instance GHC.Classes.Eq TcHoleErrors.HoleFitCandidate
- TcHoleErrors: instance GHC.Classes.Ord TcHoleErrors.HoleFit
- TcHoleErrors: instance OccName.HasOccName TcHoleErrors.HoleFitCandidate
- TcHoleErrors: instance Outputable.Outputable TcHoleErrors.HoleFit
- TcHoleErrors: instance Outputable.Outputable TcHoleErrors.HoleFitCandidate
- TcHsType: badKindSig :: Bool -> Kind -> SDoc
- TcHsType: kcHsSigType :: [Located Name] -> LHsSigType GhcRn -> TcM ()
- TcHsType: tcWildCardBinders :: [Name] -> ([(Name, TcTyVar)] -> TcM a) -> TcM a
- TcRnMonad: checkTH :: a -> String -> TcRn ()
- TcRnMonad: emitWildCardHoleConstraints :: [(Name, TcTyVar)] -> TcM ()
- TcRnMonad: failTH :: Outputable a => a -> String -> TcRn x
- TidyPgm: globaliseAndTidyId :: Id -> Id
- TmOracle: PmExprEq :: PmExpr -> PmExpr -> PmExpr
- TmOracle: falsePmExpr :: PmExpr
- TmOracle: filterComplex :: [ComplexEq] -> [PmNegLitCt]
- TmOracle: flattenPmVarEnv :: PmVarEnv -> PmVarEnv
- TmOracle: pprPmExprWithParens :: PmExpr -> PmPprM SDoc
- TmOracle: runPmPprM :: () => PmPprM a -> [PmNegLitCt] -> (a, [(SDoc, [PmLit])])
- TmOracle: toComplex :: SimpleEq -> ComplexEq
- TmOracle: type ComplexEq = (PmExpr, PmExpr)
- TmOracle: type PmVarEnv = NameEnv PmExpr
- TmOracle: type SimpleEq = (Id, PmExpr)
- TmOracle: type TmState = ([ComplexEq], TmOracleEnv)
+ CmmExpr: Float :: GlobalVecRegTy
+ CmmExpr: Integer :: GlobalVecRegTy
+ CmmExpr: data GlobalVecRegTy
+ CmmExpr: instance GHC.Classes.Eq CmmExpr.GlobalVecRegTy
+ CmmExpr: instance GHC.Classes.Ord CmmExpr.GlobalVecRegTy
+ CmmExpr: instance GHC.Show.Show CmmExpr.GlobalVecRegTy
+ CmmMachOp: MO_F32_ExpM1 :: CallishMachOp
+ CmmMachOp: MO_F32_Log1P :: CallishMachOp
+ CmmMachOp: MO_F64_ExpM1 :: CallishMachOp
+ CmmMachOp: MO_F64_Log1P :: CallishMachOp
+ CmmMachOp: MO_ReadBarrier :: CallishMachOp
+ CmmMachOp: MO_VF_Broadcast :: Length -> Width -> MachOp
+ Fingerprint: Fingerprint :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !Word64 -> Fingerprint
+ Fingerprint: data Fingerprint
+ Fingerprint: fingerprint0 :: Fingerprint
+ Fingerprint: fingerprintByteString :: ByteString -> Fingerprint
+ Fingerprint: fingerprintData :: Ptr Word8 -> Int -> IO Fingerprint
+ Fingerprint: fingerprintFingerprints :: [Fingerprint] -> Fingerprint
+ Fingerprint: fingerprintString :: String -> Fingerprint
+ Fingerprint: getFileHash :: FilePath -> IO Fingerprint
+ Fingerprint: readHexFingerprint :: String -> Fingerprint
+ Format: FmtDouble :: ScalarFormat
+ Format: FmtFloat :: ScalarFormat
+ Format: FmtInt16 :: ScalarFormat
+ Format: FmtInt32 :: ScalarFormat
+ Format: FmtInt64 :: ScalarFormat
+ Format: FmtInt8 :: ScalarFormat
+ Format: VecFormat :: !Length -> !ScalarFormat -> !Width -> Format
+ Format: data ScalarFormat
+ Format: instance GHC.Classes.Eq Format.ScalarFormat
+ Format: instance GHC.Show.Show Format.ScalarFormat
+ Format: isVecFormat :: Format -> Bool
+ GHC: Sf_SafeInferred :: SafeHaskellMode
+ GHC: getInstancesForType :: GhcMonad m => Type -> m [ClsInst]
+ GHC: parseInstanceHead :: GhcMonad m => String -> m Type
+ GHC.Settings: getBooleanSetting0 :: FilePath -> RawSettings -> String -> Either String Bool
+ GHC.Settings: getFilePathSetting0 :: FilePath -> FilePath -> RawSettings -> String -> Either String String
+ GHC.Settings: getSetting0 :: FilePath -> RawSettings -> String -> Either String String
+ GHC.Settings: getTargetPlatform :: FilePath -> RawSettings -> Either String Platform
+ GHC.Settings: maybeRead :: Read a => String -> Maybe a
+ GHC.Settings: maybeReadFuzzy :: Read a => String -> Maybe a
+ GHC.Settings: readSetting0 :: (Show a, Read a) => FilePath -> RawSettings -> String -> Either String a
+ GHC.Settings: type RawSettings = Map String String
+ GhcPlugins: coToMCo :: Coercion -> MCoercion
+ GhcPlugins: discardCast :: Type -> Type
+ GhcPlugins: isGReflMCo :: MCoercion -> Bool
+ GhcPlugins: tcIsRuntimeTypeKind :: Kind -> Bool
+ HscMain: hscParseType :: String -> Hsc (LHsType GhcPs)
+ InteractiveEval: getInstancesForType :: GhcMonad m => Type -> m [ClsInst]
+ InteractiveEval: parseInstanceHead :: GhcMonad m => String -> m Type
+ ListT: instance GHC.Base.Functor (ListT.ListT m)
+ LlvmCodeGen: LlvmVersion :: Int -> LlvmVersion
+ LlvmCodeGen: LlvmVersionOld :: Int -> Int -> LlvmVersion
+ LlvmCodeGen: data LlvmVersion
+ LlvmCodeGen.Base: LlvmVersion :: Int -> LlvmVersion
+ LlvmCodeGen.Base: LlvmVersionOld :: Int -> Int -> LlvmVersion
+ LlvmCodeGen.Base: data LlvmVersion
+ LlvmCodeGen.Base: instance GHC.Classes.Eq LlvmCodeGen.Base.LlvmVersion
+ LlvmCodeGen.Base: instance GHC.Show.Show LlvmCodeGen.Base.LlvmVersion
+ PmPpr: pprUncovered :: ([PmExpr], PmRefutEnv) -> SDoc
+ Reg: VirtualRegVec :: {-# UNPACK #-} !Unique -> VirtualReg
+ RegAlloc.Linear.FreeRegs: allFreeRegs :: FR freeRegs => Platform -> freeRegs -> [RealReg]
+ RegClass: allRegClasses :: [RegClass]
+ RegClass: instance GHC.Show.Show RegClass.RegClass
+ TcHoleErrors: HoleFitPlugin :: CandPlugin -> FitPlugin -> HoleFitPlugin
+ TcHoleErrors: RawHoleFit :: SDoc -> HoleFit
+ TcHoleErrors: TyH :: Cts -> [Implication] -> Maybe Ct -> TypedHole
+ TcHoleErrors: [HoleFitPluginR] :: forall s. () => {hfPluginInit :: TcM (TcRef s), hfPluginRun :: TcRef s -> HoleFitPlugin, hfPluginStop :: TcRef s -> TcM ()} -> HoleFitPluginR
+ TcHoleErrors: [candPlugin] :: HoleFitPlugin -> CandPlugin
+ TcHoleErrors: [fitPlugin] :: HoleFitPlugin -> FitPlugin
+ TcHoleErrors: [tyHCt] :: TypedHole -> Maybe Ct
+ TcHoleErrors: [tyHImplics] :: TypedHole -> [Implication]
+ TcHoleErrors: [tyHRelevantCts] :: TypedHole -> Cts
+ TcHoleErrors: data HoleFitPlugin
+ TcHoleErrors: data HoleFitPluginR
+ TcHoleErrors: data TypedHole
+ TcHoleErrors: debugHoleFitDispConfig :: HoleFitDispConfig
+ TcHoleErrors: fromPureHFPlugin :: HoleFitPlugin -> HoleFitPluginR
+ TcHoleErrors: hfIsLcl :: HoleFit -> Bool
+ TcHoleErrors: pprHoleFit :: HoleFitDispConfig -> HoleFit -> SDoc
+ TcHoleErrors: type CandPlugin = TypedHole -> [HoleFitCandidate] -> TcM [HoleFitCandidate]
+ TcHoleErrors: type FitPlugin = TypedHole -> [HoleFit] -> TcM [HoleFit]
+ TcHsType: DataDeclSort :: NewOrData -> DataSort
+ TcHsType: DataFamilySort :: DataSort
+ TcHsType: DataInstanceSort :: NewOrData -> DataSort
+ TcHsType: checkDataKindSig :: DataSort -> Kind -> TcM ()
+ TcHsType: data DataSort
+ TcHsType: kcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM ()
+ TcHsType: tcNamedWildCardBinders :: [Name] -> ([(Name, TcTyVar)] -> TcM a) -> TcM a
+ TcMType: skolemiseUnboundMetaTyVar :: TcTyVar -> TcM TyVar
+ TcRnMonad: emitAnonWildCardHoleConstraint :: TcTyVar -> TcM ()
+ TcRnMonad: emitNamedWildCardHoleConstraints :: [(Name, TcTyVar)] -> TcM ()
+ TcSMonad: newWantedEq_SI :: ShadowInfo -> CtLoc -> Role -> TcType -> TcType -> TcS (CtEvidence, Coercion)
+ TcSMonad: newWanted_SI :: ShadowInfo -> CtLoc -> PredType -> TcS MaybeNew
+ TcTypeableValidity: tyConIsTypeable :: TyCon -> Bool
+ TcTypeableValidity: typeIsTypeable :: Type -> Bool
+ TmOracle: PmAltLit :: PmLit -> PmAltCon
+ TmOracle: TVC :: !Id -> !PmExpr -> TmVarCt
+ TmOracle: addSolveRefutableAltCon :: TmState -> Id -> PmAltCon -> Maybe TmState
+ TmOracle: data TmState
+ TmOracle: data TmVarCt
+ TmOracle: instance Outputable.Outputable TmOracle.TmState
+ TmOracle: isRigid :: TmState -> Name -> Maybe PmExpr
+ TmOracle: lookupRefutableAltCons :: Id -> TmState -> [PmAltCon]
+ TmOracle: newtype PmAltCon
+ TmOracle: type PmRefutEnv = DNameEnv [PmAltCon]
+ TmOracle: type TmVarCtEnv = NameEnv PmExpr
+ TmOracle: wrapUpTmState :: TmState -> (TmVarCtEnv, PmRefutEnv)
+ X86.Instr: INSERTPS :: Format -> Operand -> Operand -> Reg -> Instr
+ X86.Instr: MOVH :: Format -> Operand -> Operand -> Instr
+ X86.Instr: MOVL :: Format -> Operand -> Operand -> Instr
+ X86.Instr: MOVU :: Format -> Operand -> Operand -> Instr
+ X86.Instr: PSHUFD :: Format -> Operand -> Operand -> Reg -> Instr
+ X86.Instr: PSLLDQ :: Format -> Operand -> Reg -> Instr
+ X86.Instr: PSRLDQ :: Format -> Operand -> Reg -> Instr
+ X86.Instr: VADD :: Format -> Operand -> Reg -> Reg -> Instr
+ X86.Instr: VBROADCAST :: Format -> AddrMode -> Reg -> Instr
+ X86.Instr: VDIV :: Format -> Operand -> Reg -> Reg -> Instr
+ X86.Instr: VEXTRACT :: Format -> Operand -> Reg -> Operand -> Instr
+ X86.Instr: VMOVU :: Format -> Operand -> Operand -> Instr
+ X86.Instr: VMUL :: Format -> Operand -> Reg -> Reg -> Instr
+ X86.Instr: VPSHUFD :: Format -> Operand -> Operand -> Reg -> Instr
+ X86.Instr: VPXOR :: Format -> Reg -> Reg -> Reg -> Instr
+ X86.Instr: VSUB :: Format -> Operand -> Reg -> Reg -> Instr
- Check: genCaseTmCs1 :: Maybe (LHsExpr GhcTc) -> [Id] -> Bag SimpleEq
+ Check: genCaseTmCs1 :: Maybe (LHsExpr GhcTc) -> [Id] -> Bag TmVarCt
- Check: genCaseTmCs2 :: Maybe (LHsExpr GhcTc) -> [Pat GhcTc] -> [Id] -> DsM (Bag SimpleEq)
+ Check: genCaseTmCs2 :: Maybe (LHsExpr GhcTc) -> [Pat GhcTc] -> [Id] -> DsM (Bag TmVarCt)
- CmmExpr: XmmReg :: {-# UNPACK #-} !Int -> GlobalReg
+ CmmExpr: XmmReg :: {-# UNPACK #-} !Int -> !Length -> !Width -> !GlobalVecRegTy -> GlobalReg
- CmmExpr: YmmReg :: {-# UNPACK #-} !Int -> GlobalReg
+ CmmExpr: YmmReg :: {-# UNPACK #-} !Int -> !Length -> !Width -> !GlobalVecRegTy -> GlobalReg
- CmmExpr: ZmmReg :: {-# UNPACK #-} !Int -> GlobalReg
+ CmmExpr: ZmmReg :: {-# UNPACK #-} !Int -> !Length -> !Width -> !GlobalVecRegTy -> GlobalReg
- DsMonad: addTmCsDs :: Bag SimpleEq -> DsM a -> DsM a
+ DsMonad: addTmCsDs :: Bag TmVarCt -> DsM a -> DsM a
- DsMonad: getTmCsDs :: DsM (Bag SimpleEq)
+ DsMonad: getTmCsDs :: DsM (Bag TmVarCt)
- StgCmmForeign: cgForeignCall :: ForeignCall -> [StgArg] -> Type -> FCode ReturnKind
+ StgCmmForeign: cgForeignCall :: ForeignCall -> Type -> [StgArg] -> Type -> FCode ReturnKind
- StgSyn: StgFCallOp :: ForeignCall -> Unique -> StgOp
+ StgSyn: StgFCallOp :: ForeignCall -> Type -> StgOp
- SysTools.Tasks: figureLlvmVersion :: DynFlags -> IO (Maybe (Int, Int))
+ SysTools.Tasks: figureLlvmVersion :: DynFlags -> IO (Maybe LlvmVersion)
- TcHoleErrors: tcCheckHoleFit :: Cts -> [Implication] -> TcSigmaType -> TcSigmaType -> TcM (Bool, HsWrapper)
+ TcHoleErrors: tcCheckHoleFit :: TypedHole -> TcSigmaType -> TcSigmaType -> TcM (Bool, HsWrapper)
- TcHoleErrors: tcFilterHoleFits :: Maybe Int -> [Implication] -> [Ct] -> (TcType, [TcTyVar]) -> [HoleFitCandidate] -> TcM (Bool, [HoleFit])
+ TcHoleErrors: tcFilterHoleFits :: Maybe Int -> TypedHole -> (TcType, [TcTyVar]) -> [HoleFitCandidate] -> TcM (Bool, [HoleFit])
- TcHsType: tcHsPartialSigType :: UserTypeCtxt -> LHsSigWcType GhcRn -> TcM ([(Name, TcTyVar)], Maybe TcType, [Name], [TcTyVar], TcThetaType, TcType)
+ TcHsType: tcHsPartialSigType :: UserTypeCtxt -> LHsSigWcType GhcRn -> TcM ([(Name, TcTyVar)], Maybe TcType, [(Name, TcTyVar)], TcThetaType, TcType)
- TcRnDriver: tcRnType :: HscEnv -> Bool -> LHsType GhcPs -> IO (Messages, Maybe (Type, Kind))
+ TcRnDriver: tcRnType :: HscEnv -> ZonkFlexi -> Bool -> LHsType GhcPs -> IO (Messages, Maybe (Type, Kind))
- TcTyClsDecls: kcConDecl :: ConDecl GhcRn -> TcM ()
+ TcTyClsDecls: kcConDecl :: NewOrData -> Kind -> ConDecl GhcRn -> TcM ()
- TcTyClsDecls: tcConDecls :: KnotTied TyCon -> [KnotTied TyConBinder] -> KnotTied Type -> [LConDecl GhcRn] -> TcM [DataCon]
+ TcTyClsDecls: tcConDecls :: KnotTied TyCon -> NewOrData -> [TyConBinder] -> TcKind -> KnotTied Type -> [LConDecl GhcRn] -> TcM [DataCon]
- TmOracle: exprDeepLookup :: PmVarEnv -> PmExpr -> PmExpr
+ TmOracle: exprDeepLookup :: TmVarCtEnv -> PmExpr -> PmExpr
- TmOracle: solveOneEq :: TmState -> ComplexEq -> Maybe TmState
+ TmOracle: solveOneEq :: TmState -> TmVarCt -> Maybe TmState
- TmOracle: tmOracle :: TmState -> [ComplexEq] -> Maybe TmState
+ TmOracle: tmOracle :: TmState -> [TmVarCt] -> Maybe TmState
Files
- compiler/cmm/CLabel.hs +2/−3
- compiler/cmm/CmmBuildInfoTables.hs +1/−1
- compiler/cmm/CmmCallConv.hs +26/−16
- compiler/cmm/CmmExpr.hs +62/−21
- compiler/cmm/CmmInfo.hs +1/−1
- compiler/cmm/CmmLint.hs +10/−7
- compiler/cmm/CmmMachOp.hs +21/−9
- compiler/cmm/CmmNode.hs +1/−1
- compiler/cmm/CmmOpt.hs +1/−1
- compiler/cmm/CmmParse.y +26/−23
- compiler/cmm/CmmPipeline.hs +1/−1
- compiler/cmm/CmmProcPoint.hs +1/−1
- compiler/cmm/CmmSink.hs +1/−1
- compiler/cmm/Hoopl/Block.hs +4/−8
- compiler/cmm/MkGraph.hs +2/−2
- compiler/cmm/PprC.hs +13/−7
- compiler/cmm/PprCmmExpr.hs +3/−3
- compiler/cmm/SMRep.hs +1/−1
- compiler/codeGen/CgUtils.hs +21/−21
- compiler/codeGen/CodeGen/Platform.hs +1/−1
- compiler/codeGen/StgCmmBind.hs +3/−3
- compiler/codeGen/StgCmmCon.hs +1/−1
- compiler/codeGen/StgCmmExtCode.hs +3/−4
- compiler/codeGen/StgCmmForeign.hs +126/−33
- compiler/codeGen/StgCmmMonad.hs +2/−3
- compiler/codeGen/StgCmmPrim.hs +50/−15
- compiler/coreSyn/CoreLint.hs +2/−3
- compiler/coreSyn/CorePrep.hs +17/−4
- compiler/deSugar/Check.hs +34/−118
- compiler/deSugar/Coverage.hs +2/−3
- compiler/deSugar/DsExpr.hs +9/−5
- compiler/deSugar/DsForeign.hs +1/−1
- compiler/deSugar/DsMeta.hs +16/−8
- compiler/deSugar/DsMonad.hs +2/−2
- compiler/deSugar/ExtractDocs.hs +31/−34
- compiler/deSugar/PmPpr.hs +191/−0
- compiler/deSugar/TmOracle.hs +272/−175
- compiler/ghci/ByteCodeAsm.hs +3/−5
- compiler/ghci/ByteCodeGen.hs +3/−5
- compiler/ghci/GHCi.hs +5/−5
- compiler/ghci/Linker.hs +38/−16
- compiler/hieFile/HieBin.hs +2/−1
- compiler/hsSyn/Convert.hs +15/−13
- compiler/iface/BinIface.hs +1/−1
- compiler/llvmGen/LlvmCodeGen.hs +1/−1
- compiler/llvmGen/LlvmCodeGen/Base.hs +24/−15
- compiler/llvmGen/LlvmCodeGen/CodeGen.hs +25/−10
- compiler/llvmGen/LlvmCodeGen/Data.hs +1/−1
- compiler/llvmGen/LlvmCodeGen/Regs.hs +18/−18
- compiler/llvmGen/LlvmMangler.hs +1/−1
- compiler/main/DriverPipeline.hs +16/−7
- compiler/main/DynamicLoading.hs +4/−4
- compiler/main/GHC.hs +3/−1
- compiler/main/GhcMake.hs +69/−1
- compiler/main/HscMain.hs +34/−4
- compiler/main/InteractiveEval.hs +170/−0
- compiler/main/StaticPtrTable.hs +1/−1
- compiler/main/SysTools.hs +36/−53
- compiler/main/SysTools/ExtraObj.hs +1/−1
- compiler/main/SysTools/Info.hs +2/−2
- compiler/main/SysTools/Tasks.hs +23/−17
- compiler/main/TidyPgm.hs +154/−129
- compiler/nativeGen/AsmCodeGen.hs +5/−6
- compiler/nativeGen/Dwarf.hs +1/−1
- compiler/nativeGen/Dwarf/Constants.hs +1/−1
- compiler/nativeGen/Dwarf/Types.hs +1/−1
- compiler/nativeGen/Format.hs +54/−1
- compiler/nativeGen/Instruction.hs +1/−1
- compiler/nativeGen/NCGMonad.hs +3/−5
- compiler/nativeGen/PIC.hs +1/−1
- compiler/nativeGen/PPC/CodeGen.hs +14/−1
- compiler/nativeGen/PPC/Instr.hs +1/−1
- compiler/nativeGen/PPC/Ppr.hs +7/−7
- compiler/nativeGen/PPC/Regs.hs +1/−1
- compiler/nativeGen/PprBase.hs +1/−1
- compiler/nativeGen/Reg.hs +11/−3
- compiler/nativeGen/RegAlloc/Graph/Main.hs +1/−1
- compiler/nativeGen/RegAlloc/Graph/Spill.hs +1/−1
- compiler/nativeGen/RegAlloc/Graph/SpillClean.hs +1/−1
- compiler/nativeGen/RegAlloc/Graph/SpillCost.hs +1/−1
- compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs +1/−2
- compiler/nativeGen/RegAlloc/Linear/FreeRegs.hs +6/−1
- compiler/nativeGen/RegAlloc/Linear/Main.hs +5/−3
- compiler/nativeGen/RegAlloc/Linear/PPC/FreeRegs.hs +1/−1
- compiler/nativeGen/RegAlloc/Linear/SPARC/FreeRegs.hs +1/−1
- compiler/nativeGen/RegAlloc/Linear/State.hs +4/−5
- compiler/nativeGen/RegAlloc/Linear/X86/FreeRegs.hs +1/−1
- compiler/nativeGen/RegAlloc/Linear/X86_64/FreeRegs.hs +1/−1
- compiler/nativeGen/RegAlloc/Liveness.hs +1/−1
- compiler/nativeGen/RegClass.hs +11/−8
- compiler/nativeGen/SPARC/CodeGen.hs +8/−1
- compiler/nativeGen/SPARC/CodeGen/Base.hs +1/−1
- compiler/nativeGen/SPARC/Instr.hs +1/−1
- compiler/nativeGen/SPARC/Ppr.hs +6/−10
- compiler/nativeGen/SPARC/Regs.hs +0/−2
- compiler/nativeGen/TargetReg.hs +1/−1
- compiler/nativeGen/X86/CodeGen.hs +475/−59
- compiler/nativeGen/X86/Instr.hs +82/−1
- compiler/nativeGen/X86/Ppr.hs +145/−7
- compiler/nativeGen/X86/RegInfo.hs +4/−1
- compiler/nativeGen/X86/Regs.hs +2/−1
- compiler/prelude/PrelInfo.hs +3/−1
- compiler/rename/RnEnv.hs +4/−1
- compiler/rename/RnExpr.hs +1/−1
- compiler/rename/RnPat.hs +3/−4
- compiler/rename/RnSource.hs +47/−7
- compiler/rename/RnSplice.hs +3/−6
- compiler/rename/RnTypes.hs +5/−2
- compiler/simplCore/SimplCore.hs +1/−1
- compiler/simplCore/SimplMonad.hs +3/−4
- compiler/specialise/Specialise.hs +3/−5
- compiler/stgSyn/CoreToStg.hs +22/−11
- compiler/stgSyn/StgLint.hs +3/−4
- compiler/stgSyn/StgSyn.hs +6/−6
- compiler/typecheck/ClsInst.hs +2/−1
- compiler/typecheck/Inst.hs +4/−5
- compiler/typecheck/TcAnnotations.hs +1/−1
- compiler/typecheck/TcBinds.hs +1/−1
- compiler/typecheck/TcCanonical.hs +31/−35
- compiler/typecheck/TcErrors.hs +23/−11
- compiler/typecheck/TcExpr.hs +12/−19
- compiler/typecheck/TcFlatten.hs +2/−4
- compiler/typecheck/TcForeign.hs +1/−1
- compiler/typecheck/TcHoleErrors.hs +121/−159
- compiler/typecheck/TcHsType.hs +227/−100
- compiler/typecheck/TcInstDcls.hs +67/−22
- compiler/typecheck/TcMType.hs +40/−14
- compiler/typecheck/TcPluginM.hs +2/−2
- compiler/typecheck/TcRnDriver.hs +43/−11
- compiler/typecheck/TcRnMonad.hs +16/−18
- compiler/typecheck/TcSMonad.hs +33/−19
- compiler/typecheck/TcSigs.hs +5/−16
- compiler/typecheck/TcSimplify.hs +57/−10
- compiler/typecheck/TcTyClsDecls.hs +262/−71
- compiler/typecheck/TcTyDecls.hs +3/−6
- compiler/typecheck/TcTypeable.hs +1/−31
- compiler/typecheck/TcTypeableValidity.hs +46/−0
- compiler/typecheck/TcUnify.hs +3/−4
- compiler/utils/AsmUtils.hs +1/−1
- compiler/utils/ListT.hs +2/−3
- compiler/utils/State.hs +2/−4
- ghc-lib.cabal +31/−22
- ghc-lib/generated/ghcautoconf.h +2/−2
- ghc-lib/generated/ghcplatform.h +1/−1
- ghc-lib/generated/ghcversion.h +3/−3
- ghc-lib/stage0/compiler/build/Fingerprint.hs +48/−0
- ghc-lib/stage0/libraries/ghci/build/GHCi/InfoTable.hs +377/−0
- ghc-lib/stage1/compiler/build/ghc_boot_platform.h +1/−1
- ghc-lib/stage1/compiler/build/primop-can-fail.hs-incl +2/−0
- ghc-lib/stage1/compiler/build/primop-code-size.hs-incl +4/−0
- ghc-lib/stage1/compiler/build/primop-data-decl.hs-incl +4/−0
- ghc-lib/stage1/compiler/build/primop-list.hs-incl +4/−0
- ghc-lib/stage1/compiler/build/primop-primop-info.hs-incl +4/−0
- ghc-lib/stage1/compiler/build/primop-tag.hs-incl +1204/−1200
- ghc-lib/stage1/lib/llvm-targets +7/−3
- ghc-lib/stage1/lib/settings +3/−2
- ghc/GHCi/Leak.hs +1/−1
- ghc/GHCi/UI.hs +113/−34
- ghc/GHCi/UI/Monad.hs +41/−24
- ghc/Main.hs +10/−7
- includes/Cmm.h +11/−1
- includes/CodeGen.Platform.hs +36/−36
- includes/Rts.h +8/−0
- includes/rts/Config.h +6/−2
- includes/rts/EventLogFormat.h +1/−0
- includes/rts/storage/ClosureMacros.h +10/−6
- libraries/ghc-boot/GHC/Settings.hs +104/−0
- libraries/ghci/GHCi/InfoTable.hsc +5/−5
compiler/cmm/CLabel.hs view
@@ -124,7 +124,7 @@ import Outputable import FastString import DynFlags-import Platform+import GHC.Platform import UniqSet import Util import PprCore ( {- instances -} )@@ -579,8 +579,7 @@ -> FunctionOrData -> CLabel -mkForeignLabel str mb_sz src fod- = ForeignLabel str mb_sz src fod+mkForeignLabel = ForeignLabel -- | Update the label size field in a ForeignLabel
compiler/cmm/CmmBuildInfoTables.hs view
@@ -16,7 +16,7 @@ import Hoopl.Collections import Hoopl.Dataflow import Module-import Platform+import GHC.Platform import Digraph import CLabel import PprCmmDecl ()
compiler/cmm/CmmCallConv.hs view
@@ -13,7 +13,7 @@ import PprCmm () import DynFlags-import Platform+import GHC.Platform import Outputable -- Calculate the 'GlobalReg' or stack locations for function call@@ -64,13 +64,20 @@ assign_regs assts (r:rs) regs | isVecType ty = vec | isFloatType ty = float | otherwise = int- where vec = case (w, regs) of- (W128, (vs, fs, ds, ls, s:ss))- | passVectorInReg W128 dflags -> k (RegisterParam (XmmReg s), (vs, fs, ds, ls, ss))- (W256, (vs, fs, ds, ls, s:ss))- | passVectorInReg W256 dflags -> k (RegisterParam (YmmReg s), (vs, fs, ds, ls, ss))- (W512, (vs, fs, ds, ls, s:ss))- | passVectorInReg W512 dflags -> k (RegisterParam (ZmmReg s), (vs, fs, ds, ls, ss))+ where vec = case regs of+ (vs, fs, ds, ls, s:ss)+ | passVectorInReg w dflags+ -> let elt_ty = vecElemType ty+ reg_ty = if isFloatType elt_ty+ then Float else Integer+ reg_class = case w of+ W128 -> XmmReg+ W256 -> YmmReg+ W512 -> ZmmReg+ _ -> panic "CmmCallConv.assignArgumentsPos: Invalid vector width"+ in k (RegisterParam+ (reg_class s (vecLength ty) (typeWidth elt_ty) reg_ty),+ (vs, fs, ds, ls, ss)) _ -> (assts, (r:rs)) float = case (w, regs) of (W32, (vs, fs, ds, ls, s:ss))@@ -89,6 +96,7 @@ (_, (vs, fs, ds, l:ls, ss)) | widthInBits w > widthInBits (wordWidth dflags) -> k (RegisterParam l, (vs, fs, ds, ls, ss)) _ -> (assts, (r:rs))+ k (asst, regs') = assign_regs ((r, asst) : assts) rs regs' ty = arg_ty r w = typeWidth ty@@ -202,11 +210,13 @@ -- only use this functionality in hand-written C-- code in the RTS. realArgRegsCover :: DynFlags -> [GlobalReg] realArgRegsCover dflags- | passFloatArgsInXmm dflags = map ($VGcPtr) (realVanillaRegs dflags) ++- realLongRegs dflags ++- map XmmReg (realXmmRegNos dflags)- | otherwise = map ($VGcPtr) (realVanillaRegs dflags) ++- realFloatRegs dflags ++- realDoubleRegs dflags ++- realLongRegs dflags ++- map XmmReg (realXmmRegNos dflags)+ | passFloatArgsInXmm dflags+ = map ($VGcPtr) (realVanillaRegs dflags) +++ realLongRegs dflags +++ map (\x -> XmmReg x 2 W64 Integer) (realXmmRegNos dflags)+ | otherwise+ = map ($VGcPtr) (realVanillaRegs dflags) +++ realFloatRegs dflags +++ realDoubleRegs dflags +++ realLongRegs dflags +++ map (\x -> XmmReg x 2 W64 Integer) (realXmmRegNos dflags)
compiler/cmm/CmmExpr.hs view
@@ -14,6 +14,7 @@ , currentTSOReg, currentNurseryReg, hpAllocReg, cccsReg , node, baseReg , VGcPtr(..)+ , GlobalVecRegTy(..) , DefinerOfRegs, UserOfRegs , foldRegsDefd, foldRegsUsed@@ -41,6 +42,7 @@ import Unique import Data.Set (Set)+import Data.Monoid ((<>)) import qualified Data.Set as Set import BasicTypes (Alignment, mkAlignment, alignmentOf)@@ -392,6 +394,7 @@ ----------------------------------------------------------------------------- {- Note [Overlapping global registers]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The backend might not faithfully implement the abstraction of the STG machine with independent registers for different values of type@@ -413,6 +416,26 @@ equality of STG registers and does not take overlap into account. However it is still used in UserOfRegs/DefinerOfRegs and there are likely still bugs there, beware!+++Note [SIMD registers]+~~~~~~~~~~~~~~~~~~~~~++GHC's treatment of SIMD registers is heavily modelled after the x86_64+architecture. Namely we have 128- (XMM), 256- (YMM), and 512-bit (ZMM)+registers. Furthermore, we treat each possible format in these registers as a+distinct register which overlaps with the others. For instance, we XMM1 as a+2xI64 register is distinct from but overlaps with (in the sense defined in Note+[Overlapping global registers]) its use as a 4xI32 register.++This model makes it easier to fit SIMD registers into the NCG, which generally+expects that each global register has a single, known CmmType.++In the future we could consider further refactoring this to eliminate the+XMM, YMM, and ZMM register names (which are quite x86-specific) and instead just+having a set of NxM-bit vector registers (e.g. Vec2x64A, Vec2x64B, ...,+Vec4x32A, ..., Vec4x64A).+ -} data GlobalReg@@ -432,12 +455,15 @@ | XmmReg -- 128-bit SIMD vector register {-# UNPACK #-} !Int -- its number+ !Length !Width !GlobalVecRegTy | YmmReg -- 256-bit SIMD vector register {-# UNPACK #-} !Int -- its number+ !Length !Width !GlobalVecRegTy | ZmmReg -- 512-bit SIMD vector register {-# UNPACK #-} !Int -- its number+ !Length !Width !GlobalVecRegTy -- STG registers | Sp -- Stack ptr; points to last occupied stack location.@@ -478,17 +504,17 @@ deriving( Show ) +data GlobalVecRegTy = Integer | Float+ deriving (Show, Eq, Ord)+ instance Eq GlobalReg where VanillaReg i _ == VanillaReg j _ = i==j -- Ignore type when seeking clashes FloatReg i == FloatReg j = i==j DoubleReg i == DoubleReg j = i==j LongReg i == LongReg j = i==j- -- NOTE: XMM, YMM, ZMM registers actually are the same registers- -- at least with respect to store at YMM i and then read from XMM i- -- and similarly for ZMM etc.- XmmReg i == XmmReg j = i==j- YmmReg i == YmmReg j = i==j- ZmmReg i == ZmmReg j = i==j+ XmmReg i l w grt == XmmReg j l' w' grt' = i==j && l == l' && w == w' && grt == grt'+ YmmReg i l w grt == YmmReg j l' w' grt' = i==j && l == l' && w == w' && grt == grt'+ ZmmReg i l w grt == ZmmReg j l' w' grt' = i==j && l == l' && w == w' && grt == grt' Sp == Sp = True SpLim == SpLim = True Hp == Hp = True@@ -512,9 +538,21 @@ compare (FloatReg i) (FloatReg j) = compare i j compare (DoubleReg i) (DoubleReg j) = compare i j compare (LongReg i) (LongReg j) = compare i j- compare (XmmReg i) (XmmReg j) = compare i j- compare (YmmReg i) (YmmReg j) = compare i j- compare (ZmmReg i) (ZmmReg j) = compare i j+ compare (XmmReg i l w grt)+ (XmmReg j l' w' grt') = compare i j+ <> compare l l'+ <> compare w w'+ <> compare grt grt'+ compare (YmmReg i l w grt)+ (YmmReg j l' w' grt') = compare i j+ <> compare l l'+ <> compare w w'+ <> compare grt grt'+ compare (ZmmReg i l w grt)+ (ZmmReg j l' w' grt') = compare i j+ <> compare l l'+ <> compare w w'+ <> compare grt grt' compare Sp Sp = EQ compare SpLim SpLim = EQ compare Hp Hp = EQ@@ -538,12 +576,12 @@ compare _ (DoubleReg _) = GT compare (LongReg _) _ = LT compare _ (LongReg _) = GT- compare (XmmReg _) _ = LT- compare _ (XmmReg _) = GT- compare (YmmReg _) _ = LT- compare _ (YmmReg _) = GT- compare (ZmmReg _) _ = LT- compare _ (ZmmReg _) = GT+ compare (XmmReg _ _ _ _) _ = LT+ compare _ (XmmReg _ _ _ _) = GT+ compare (YmmReg _ _ _ _) _ = LT+ compare _ (YmmReg _ _ _ _) = GT+ compare (ZmmReg _ _ _ _) _ = LT+ compare _ (ZmmReg _ _ _ _) = GT compare Sp _ = LT compare _ Sp = GT compare SpLim _ = LT@@ -596,12 +634,15 @@ globalRegType _ (FloatReg _) = cmmFloat W32 globalRegType _ (DoubleReg _) = cmmFloat W64 globalRegType _ (LongReg _) = cmmBits W64--- TODO: improve the internal model of SIMD/vectorized registers--- the right design SHOULd improve handling of float and double code too.--- see remarks in "NOTE [SIMD Design for the future]"" in StgCmmPrim-globalRegType _ (XmmReg _) = cmmVec 4 (cmmBits W32)-globalRegType _ (YmmReg _) = cmmVec 8 (cmmBits W32)-globalRegType _ (ZmmReg _) = cmmVec 16 (cmmBits W32)+globalRegType _ (XmmReg _ l w ty) = case ty of+ Integer -> cmmVec l (cmmBits w)+ Float -> cmmVec l (cmmFloat w)+globalRegType _ (YmmReg _ l w ty) = case ty of+ Integer -> cmmVec l (cmmBits w)+ Float -> cmmVec l (cmmFloat w)+globalRegType _ (ZmmReg _ l w ty) = case ty of+ Integer -> cmmVec l (cmmBits w)+ Float -> cmmVec l (cmmFloat w) globalRegType dflags Hp = gcWord dflags -- The initialiser for all
compiler/cmm/CmmInfo.hs view
@@ -45,7 +45,7 @@ import qualified Stream import Hoopl.Collections -import Platform+import GHC.Platform import Maybes import DynFlags import Panic
compiler/cmm/CmmLint.hs view
@@ -5,6 +5,7 @@ -- CmmLint: checking the correctness of Cmm statements and expressions -- -----------------------------------------------------------------------------+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE GADTs #-} module CmmLint ( cmmLint, cmmLintGraph@@ -24,7 +25,7 @@ import Outputable import DynFlags -import Control.Monad (liftM, ap)+import Control.Monad (ap) -- Things to check: -- - invariant on CmmBlock in CmmExpr (see comment there)@@ -147,9 +148,13 @@ dflags <- getDynFlags erep <- lintCmmExpr expr let reg_ty = cmmRegType dflags reg- if (erep `cmmEqType_ignoring_ptrhood` reg_ty)- then return ()- else cmmLintAssignErr (CmmAssign reg expr) erep reg_ty+ case isVecCatType reg_ty of+ True -> if ((typeWidth reg_ty) == (typeWidth erep))+ then return ()+ else cmmLintAssignErr (CmmAssign reg expr) erep reg_ty+ _ -> if (erep `cmmEqType_ignoring_ptrhood` reg_ty)+ then return ()+ else cmmLintAssignErr (CmmAssign reg expr) erep reg_ty CmmStore l r -> do _ <- lintCmmExpr l@@ -212,9 +217,7 @@ -- just a basic error monad: newtype CmmLint a = CmmLint { unCL :: DynFlags -> Either SDoc a }--instance Functor CmmLint where- fmap = liftM+ deriving (Functor) instance Applicative CmmLint where pure a = CmmLint (\_ -> Right a)
compiler/cmm/CmmMachOp.hs view
@@ -136,8 +136,9 @@ | MO_VU_Rem Length Width -- Floting point vector element insertion and extraction operations- | MO_VF_Insert Length Width -- Insert scalar into vector- | MO_VF_Extract Length Width -- Extract scalar from vector+ | MO_VF_Broadcast Length Width -- Broadcast a scalar into a vector+ | MO_VF_Insert Length Width -- Insert scalar into vector+ | MO_VF_Extract Length Width -- Extract scalar from vector -- Floating point vector operations | MO_VF_Add Length Width@@ -430,6 +431,7 @@ MO_VU_Quot l w -> cmmVec l (cmmBits w) MO_VU_Rem l w -> cmmVec l (cmmBits w) + MO_VF_Broadcast l w -> cmmVec l (cmmFloat w) MO_VF_Insert l w -> cmmVec l (cmmFloat w) MO_VF_Extract _ w -> cmmFloat w @@ -522,16 +524,21 @@ MO_VU_Quot _ r -> [r,r] MO_VU_Rem _ r -> [r,r] - MO_VF_Insert l r -> [typeWidth (vec l (cmmFloat r)),r,wordWidth dflags]- MO_VF_Extract l r -> [typeWidth (vec l (cmmFloat r)),wordWidth dflags]+ -- offset is always W32 as mentioned in StgCmmPrim.hs+ MO_VF_Broadcast l r -> [vecwidth l r, r]+ MO_VF_Insert l r -> [vecwidth l r, r, W32]+ MO_VF_Extract l r -> [vecwidth l r, W32] - MO_VF_Add _ r -> [r,r]- MO_VF_Sub _ r -> [r,r]- MO_VF_Mul _ r -> [r,r]- MO_VF_Quot _ r -> [r,r]- MO_VF_Neg _ r -> [r]+ -- NOTE: The below is owing to the fact that floats use the SSE registers+ MO_VF_Add l w -> [vecwidth l w, vecwidth l w]+ MO_VF_Sub l w -> [vecwidth l w, vecwidth l w]+ MO_VF_Mul l w -> [vecwidth l w, vecwidth l w]+ MO_VF_Quot l w -> [vecwidth l w, vecwidth l w]+ MO_VF_Neg l w -> [vecwidth l w] MO_AlignmentCheck _ r -> [r]+ where+ vecwidth l w = widthFromBytes (l*widthInBytes w) ----------------------------------------------------------------------------- -- CallishMachOp@@ -556,7 +563,9 @@ | MO_F64_Acosh | MO_F64_Atanh | MO_F64_Log+ | MO_F64_Log1P | MO_F64_Exp+ | MO_F64_ExpM1 | MO_F64_Fabs | MO_F64_Sqrt | MO_F32_Pwr@@ -573,7 +582,9 @@ | MO_F32_Acosh | MO_F32_Atanh | MO_F32_Log+ | MO_F32_Log1P | MO_F32_Exp+ | MO_F32_ExpM1 | MO_F32_Fabs | MO_F32_Sqrt @@ -589,6 +600,7 @@ | MO_SubIntC Width | MO_U_Mul2 Width + | MO_ReadBarrier | MO_WriteBarrier | MO_Touch -- Keep variables live (when using interior pointers)
compiler/cmm/CmmNode.hs view
@@ -114,7 +114,7 @@ cml_cont :: Maybe Label, -- Label of continuation (Nothing for return or tail call) --- -- Note [Continuation BlockId]: these BlockIds are called+ -- Note [Continuation BlockIds]: these BlockIds are called -- Continuation BlockIds, and are the only BlockIds that can -- occur in CmmExprs, namely as (CmmLit (CmmBlock b)) or -- (CmmStackSlot (Young b) _).
compiler/cmm/CmmOpt.hs view
@@ -25,7 +25,7 @@ import Util import Outputable-import Platform+import GHC.Platform import Data.Bits import Data.Maybe
compiler/cmm/CmmParse.y view
@@ -198,6 +198,8 @@ ----------------------------------------------------------------------------- -} {+{-# LANGUAGE TupleSections #-}+ module CmmParse ( parseCmmFile ) where import GhcPrelude@@ -235,7 +237,7 @@ import CostCentre import ForeignCall import Module-import Platform+import GHC.Platform import Literal import Unique import UniqFM@@ -808,7 +810,7 @@ | foreign_formal ',' foreign_formals { $1 : $3 } foreign_formal :: { CmmParse (LocalReg, ForeignHint) }- : local_lreg { do e <- $1; return (e, (inferCmmHint (CmmReg (CmmLocal e)))) }+ : local_lreg { do e <- $1; return (e, inferCmmHint (CmmReg (CmmLocal e))) } | STRING local_lreg {% do h <- parseCmmHint $1; return $ do e <- $2; return (e,h) }@@ -999,36 +1001,37 @@ callishMachOps :: UniqFM ([CmmExpr] -> (CallishMachOp, [CmmExpr])) callishMachOps = listToUFM $ map (\(x, y) -> (mkFastString x, y)) [- ( "write_barrier", (,) MO_WriteBarrier ),+ ( "read_barrier", (MO_ReadBarrier,)),+ ( "write_barrier", (MO_WriteBarrier,)), ( "memcpy", memcpyLikeTweakArgs MO_Memcpy ), ( "memset", memcpyLikeTweakArgs MO_Memset ), ( "memmove", memcpyLikeTweakArgs MO_Memmove ), ( "memcmp", memcpyLikeTweakArgs MO_Memcmp ), - ("prefetch0", (,) $ MO_Prefetch_Data 0),- ("prefetch1", (,) $ MO_Prefetch_Data 1),- ("prefetch2", (,) $ MO_Prefetch_Data 2),- ("prefetch3", (,) $ MO_Prefetch_Data 3),+ ("prefetch0", (MO_Prefetch_Data 0,)),+ ("prefetch1", (MO_Prefetch_Data 1,)),+ ("prefetch2", (MO_Prefetch_Data 2,)),+ ("prefetch3", (MO_Prefetch_Data 3,)), - ( "popcnt8", (,) $ MO_PopCnt W8 ),- ( "popcnt16", (,) $ MO_PopCnt W16 ),- ( "popcnt32", (,) $ MO_PopCnt W32 ),- ( "popcnt64", (,) $ MO_PopCnt W64 ),+ ( "popcnt8", (MO_PopCnt W8,)),+ ( "popcnt16", (MO_PopCnt W16,)),+ ( "popcnt32", (MO_PopCnt W32,)),+ ( "popcnt64", (MO_PopCnt W64,)), - ( "pdep8", (,) $ MO_Pdep W8 ),- ( "pdep16", (,) $ MO_Pdep W16 ),- ( "pdep32", (,) $ MO_Pdep W32 ),- ( "pdep64", (,) $ MO_Pdep W64 ),+ ( "pdep8", (MO_Pdep W8,)),+ ( "pdep16", (MO_Pdep W16,)),+ ( "pdep32", (MO_Pdep W32,)),+ ( "pdep64", (MO_Pdep W64,)), - ( "pext8", (,) $ MO_Pext W8 ),- ( "pext16", (,) $ MO_Pext W16 ),- ( "pext32", (,) $ MO_Pext W32 ),- ( "pext64", (,) $ MO_Pext W64 ),+ ( "pext8", (MO_Pext W8,)),+ ( "pext16", (MO_Pext W16,)),+ ( "pext32", (MO_Pext W32,)),+ ( "pext64", (MO_Pext W64,)), - ( "cmpxchg8", (,) $ MO_Cmpxchg W8 ),- ( "cmpxchg16", (,) $ MO_Cmpxchg W16 ),- ( "cmpxchg32", (,) $ MO_Cmpxchg W32 ),- ( "cmpxchg64", (,) $ MO_Cmpxchg W64 )+ ( "cmpxchg8", (MO_Cmpxchg W8,)),+ ( "cmpxchg16", (MO_Cmpxchg W16,)),+ ( "cmpxchg32", (MO_Cmpxchg W32,)),+ ( "cmpxchg64", (MO_Cmpxchg W64,)) -- ToDo: the rest, maybe -- edit: which rest?
compiler/cmm/CmmPipeline.hs view
@@ -26,7 +26,7 @@ import HscTypes import Control.Monad import Outputable-import Platform+import GHC.Platform ----------------------------------------------------------------------------- -- | Top level driver for C-- pipeline
compiler/cmm/CmmProcPoint.hs view
@@ -23,7 +23,7 @@ import Maybes import Control.Monad import Outputable-import Platform+import GHC.Platform import UniqSupply import Hoopl.Block import Hoopl.Collections
compiler/cmm/CmmSink.hs view
@@ -14,7 +14,7 @@ import Hoopl.Collections import Hoopl.Graph import CodeGen.Platform-import Platform (isARM, platformArch)+import GHC.Platform (isARM, platformArch) import DynFlags import Unique
compiler/cmm/Hoopl/Block.hs view
@@ -1,7 +1,9 @@+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE StandaloneDeriving #-} module Hoopl.Block ( C , O@@ -64,14 +66,8 @@ JustC :: t -> MaybeC C t NothingC :: MaybeC O t --instance Functor (MaybeO ex) where- fmap _ NothingO = NothingO- fmap f (JustO a) = JustO (f a)--instance Functor (MaybeC ex) where- fmap _ NothingC = NothingC- fmap f (JustC a) = JustC (f a)+deriving instance Functor (MaybeO ex)+deriving instance Functor (MaybeC ex) -- ----------------------------------------------------------------------------- -- The Block type
compiler/cmm/MkGraph.hs view
@@ -335,8 +335,8 @@ local = CmmLocal reg width = cmmRegWidth dflags local expr = CmmMachOp (MO_XX_Conv (wordWidth dflags) width) [stack_slot]- in CmmAssign local expr - + in CmmAssign local expr+ | otherwise = CmmAssign (CmmLocal reg) (CmmLoad (CmmStackSlot area off) ty) where ty = localRegType reg
compiler/cmm/PprC.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, GADTs #-}+{-# LANGUAGE CPP, DeriveFunctor, GADTs, PatternSynonyms #-} ----------------------------------------------------------------------------- --@@ -44,7 +44,7 @@ import DynFlags import FastString import Outputable-import Platform+import GHC.Platform import UniqSet import UniqFM import Unique@@ -61,7 +61,7 @@ import Data.Word import System.IO import qualified Data.Map as Map-import Control.Monad (liftM, ap)+import Control.Monad (ap) import qualified Data.Array.Unsafe as U ( castSTUArray ) import Data.Array.ST @@ -713,6 +713,10 @@ (panic $ "PprC.pprMachOp_for_C: MO_VU_Rem" ++ " should have been handled earlier!") + MO_VF_Broadcast {} -> pprTrace "offending mop:"+ (text "MO_VF_Broadcast")+ (panic $ "PprC.pprMachOp_for_C: MO_VF_Broadcast"+ ++ " should have been handled earlier!") MO_VF_Insert {} -> pprTrace "offending mop:" (text "MO_VF_Insert") (panic $ "PprC.pprMachOp_for_C: MO_VF_Insert"@@ -788,7 +792,9 @@ MO_F64_Acosh -> text "acosh" MO_F64_Atan -> text "atan" MO_F64_Log -> text "log"+ MO_F64_Log1P -> text "log1p" MO_F64_Exp -> text "exp"+ MO_F64_ExpM1 -> text "expm1" MO_F64_Sqrt -> text "sqrt" MO_F64_Fabs -> text "fabs" MO_F32_Pwr -> text "powf"@@ -805,9 +811,12 @@ MO_F32_Acosh -> text "acoshf" MO_F32_Atanh -> text "atanhf" MO_F32_Log -> text "logf"+ MO_F32_Log1P -> text "log1pf" MO_F32_Exp -> text "expf"+ MO_F32_ExpM1 -> text "expm1f" MO_F32_Sqrt -> text "sqrtf" MO_F32_Fabs -> text "fabsf"+ MO_ReadBarrier -> text "load_load_barrier" MO_WriteBarrier -> text "write_barrier" MO_Memcpy _ -> text "memcpy" MO_Memset _ -> text "memset"@@ -1078,10 +1087,7 @@ <> semi type TEState = (UniqSet LocalReg, Map CLabel ())-newtype TE a = TE { unTE :: TEState -> (a, TEState) }--instance Functor TE where- fmap = liftM+newtype TE a = TE { unTE :: TEState -> (a, TEState) } deriving (Functor) instance Applicative TE where pure a = TE $ \s -> (a, s)
compiler/cmm/PprCmmExpr.hs view
@@ -261,9 +261,9 @@ FloatReg n -> char 'F' <> int n DoubleReg n -> char 'D' <> int n LongReg n -> char 'L' <> int n- XmmReg n -> text "XMM" <> int n- YmmReg n -> text "YMM" <> int n- ZmmReg n -> text "ZMM" <> int n+ XmmReg n _ _ _ -> text "XMM" <> int n+ YmmReg n _ _ _ -> text "YMM" <> int n+ ZmmReg n _ _ _ -> text "ZMM" <> int n Sp -> text "Sp" SpLim -> text "SpLim" Hp -> text "Hp"
compiler/cmm/SMRep.hs view
@@ -49,7 +49,7 @@ import BasicTypes( ConTagZ ) import DynFlags import Outputable-import Platform+import GHC.Platform import FastString import Data.Word
compiler/codeGen/CgUtils.hs view
@@ -57,27 +57,27 @@ baseRegOffset dflags (DoubleReg 5) = oFFSET_StgRegTable_rD5 dflags baseRegOffset dflags (DoubleReg 6) = oFFSET_StgRegTable_rD6 dflags baseRegOffset _ (DoubleReg n) = panic ("Registers above D6 are not supported (tried to use D" ++ show n ++ ")")-baseRegOffset dflags (XmmReg 1) = oFFSET_StgRegTable_rXMM1 dflags-baseRegOffset dflags (XmmReg 2) = oFFSET_StgRegTable_rXMM2 dflags-baseRegOffset dflags (XmmReg 3) = oFFSET_StgRegTable_rXMM3 dflags-baseRegOffset dflags (XmmReg 4) = oFFSET_StgRegTable_rXMM4 dflags-baseRegOffset dflags (XmmReg 5) = oFFSET_StgRegTable_rXMM5 dflags-baseRegOffset dflags (XmmReg 6) = oFFSET_StgRegTable_rXMM6 dflags-baseRegOffset _ (XmmReg n) = panic ("Registers above XMM6 are not supported (tried to use XMM" ++ show n ++ ")")-baseRegOffset dflags (YmmReg 1) = oFFSET_StgRegTable_rYMM1 dflags-baseRegOffset dflags (YmmReg 2) = oFFSET_StgRegTable_rYMM2 dflags-baseRegOffset dflags (YmmReg 3) = oFFSET_StgRegTable_rYMM3 dflags-baseRegOffset dflags (YmmReg 4) = oFFSET_StgRegTable_rYMM4 dflags-baseRegOffset dflags (YmmReg 5) = oFFSET_StgRegTable_rYMM5 dflags-baseRegOffset dflags (YmmReg 6) = oFFSET_StgRegTable_rYMM6 dflags-baseRegOffset _ (YmmReg n) = panic ("Registers above YMM6 are not supported (tried to use YMM" ++ show n ++ ")")-baseRegOffset dflags (ZmmReg 1) = oFFSET_StgRegTable_rZMM1 dflags-baseRegOffset dflags (ZmmReg 2) = oFFSET_StgRegTable_rZMM2 dflags-baseRegOffset dflags (ZmmReg 3) = oFFSET_StgRegTable_rZMM3 dflags-baseRegOffset dflags (ZmmReg 4) = oFFSET_StgRegTable_rZMM4 dflags-baseRegOffset dflags (ZmmReg 5) = oFFSET_StgRegTable_rZMM5 dflags-baseRegOffset dflags (ZmmReg 6) = oFFSET_StgRegTable_rZMM6 dflags-baseRegOffset _ (ZmmReg n) = panic ("Registers above ZMM6 are not supported (tried to use ZMM" ++ show n ++ ")")+baseRegOffset dflags (XmmReg 1 _ _ _) = oFFSET_StgRegTable_rXMM1 dflags+baseRegOffset dflags (XmmReg 2 _ _ _) = oFFSET_StgRegTable_rXMM2 dflags+baseRegOffset dflags (XmmReg 3 _ _ _) = oFFSET_StgRegTable_rXMM3 dflags+baseRegOffset dflags (XmmReg 4 _ _ _) = oFFSET_StgRegTable_rXMM4 dflags+baseRegOffset dflags (XmmReg 5 _ _ _) = oFFSET_StgRegTable_rXMM5 dflags+baseRegOffset dflags (XmmReg 6 _ _ _) = oFFSET_StgRegTable_rXMM6 dflags+baseRegOffset _ (XmmReg n _ _ _) = panic ("Registers above XMM6 are not supported (tried to use XMM" ++ show n ++ ")")+baseRegOffset dflags (YmmReg 1 _ _ _) = oFFSET_StgRegTable_rYMM1 dflags+baseRegOffset dflags (YmmReg 2 _ _ _) = oFFSET_StgRegTable_rYMM2 dflags+baseRegOffset dflags (YmmReg 3 _ _ _) = oFFSET_StgRegTable_rYMM3 dflags+baseRegOffset dflags (YmmReg 4 _ _ _) = oFFSET_StgRegTable_rYMM4 dflags+baseRegOffset dflags (YmmReg 5 _ _ _) = oFFSET_StgRegTable_rYMM5 dflags+baseRegOffset dflags (YmmReg 6 _ _ _) = oFFSET_StgRegTable_rYMM6 dflags+baseRegOffset _ (YmmReg n _ _ _) = panic ("Registers above YMM6 are not supported (tried to use YMM" ++ show n ++ ")")+baseRegOffset dflags (ZmmReg 1 _ _ _) = oFFSET_StgRegTable_rZMM1 dflags+baseRegOffset dflags (ZmmReg 2 _ _ _) = oFFSET_StgRegTable_rZMM2 dflags+baseRegOffset dflags (ZmmReg 3 _ _ _) = oFFSET_StgRegTable_rZMM3 dflags+baseRegOffset dflags (ZmmReg 4 _ _ _) = oFFSET_StgRegTable_rZMM4 dflags+baseRegOffset dflags (ZmmReg 5 _ _ _) = oFFSET_StgRegTable_rZMM5 dflags+baseRegOffset dflags (ZmmReg 6 _ _ _) = oFFSET_StgRegTable_rZMM6 dflags+baseRegOffset _ (ZmmReg n _ _ _) = panic ("Registers above ZMM6 are not supported (tried to use ZMM" ++ show n ++ ")") baseRegOffset dflags Sp = oFFSET_StgRegTable_rSp dflags baseRegOffset dflags SpLim = oFFSET_StgRegTable_rSpLim dflags baseRegOffset dflags (LongReg 1) = oFFSET_StgRegTable_rL1 dflags
compiler/codeGen/CodeGen/Platform.hs view
@@ -6,7 +6,7 @@ import GhcPrelude import CmmExpr-import Platform+import GHC.Platform import Reg import qualified CodeGen.Platform.ARM as ARM
compiler/codeGen/StgCmmBind.hs view
@@ -632,6 +632,7 @@ when eager_blackholing $ do emitStore (cmmOffsetW dflags node (fixedHdrSizeW dflags)) currentTSOExpr+ -- See Note [Heap memory barriers] in SMP.h. emitPrimCall [] MO_WriteBarrier [] emitStore node (CmmReg (CmmGlobal EagerBlackholeInfo)) @@ -664,7 +665,7 @@ ; if closureUpdReqd closure_info then do -- Blackhole the (updatable) CAF:- { upd_closure <- link_caf node True+ { upd_closure <- link_caf node ; pushUpdateFrame mkBHUpdInfoLabel upd_closure body } else do {tickyUpdateFrameOmitted; body} }@@ -704,11 +705,10 @@ -- See Note [CAF management] in rts/sm/Storage.c link_caf :: LocalReg -- pointer to the closure- -> Bool -- True <=> updatable, False <=> single-entry -> FCode CmmExpr -- Returns amode for closure to be updated -- This function returns the address of the black hole, so it can be -- updated with the new value when available.-link_caf node _is_upd = do+link_caf node = do { dflags <- getDynFlags -- Call the RTS function newCAF, returning the newly-allocated -- blackhole indirection closure
compiler/codeGen/StgCmmCon.hs view
@@ -44,7 +44,7 @@ import Literal import PrelInfo import Outputable-import Platform+import GHC.Platform import Util import MonadUtils (mapMaybeM)
compiler/codeGen/StgCmmExtCode.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveFunctor #-} -- | Our extended FCode monad. -- We add a mapping from names to CmmExpr, to support local variable names in@@ -53,7 +54,7 @@ import Unique import UniqSupply -import Control.Monad (liftM, ap)+import Control.Monad (ap) -- | The environment contains variable definitions or blockids. data Named@@ -73,6 +74,7 @@ -- and a list of local declarations. Returns the resulting list of declarations. newtype CmmParse a = EC { unEC :: String -> Env -> Decls -> FCode (Decls, a) }+ deriving (Functor) type ExtCode = CmmParse () @@ -81,9 +83,6 @@ thenExtFC :: CmmParse a -> (a -> CmmParse b) -> CmmParse b thenExtFC (EC m) k = EC $ \c e s -> do (s',r) <- m c e s; unEC (k r) c e s'--instance Functor CmmParse where- fmap = liftM instance Applicative CmmParse where pure = returnExtFC
compiler/codeGen/StgCmmForeign.hs view
@@ -34,7 +34,6 @@ import MkGraph import Type import RepType-import TysPrim import CLabel import SMRep import ForeignCall@@ -44,20 +43,26 @@ import UniqSupply import BasicTypes +import TyCoRep+import TysPrim+import Util (zipEqual)+ import Control.Monad ----------------------------------------------------------------------------- -- Code generation for Foreign Calls ----------------------------------------------------------------------------- --- | emit code for a foreign call, and return the results to the sequel.---+-- | Emit code for a foreign call, and return the results to the sequel.+-- Precondition: the length of the arguments list is the same as the+-- arity of the foreign function. cgForeignCall :: ForeignCall -- the op+ -> Type -- type of foreign function -> [StgArg] -- x,y arguments -> Type -- result type -> FCode ReturnKind -cgForeignCall (CCall (CCallSpec target cconv safety)) stg_args res_ty+cgForeignCall (CCall (CCallSpec target cconv safety)) typ stg_args res_ty = do { dflags <- getDynFlags ; let -- in the stdcall calling convention, the symbol needs @size appended -- to it, where size is the total number of bytes of arguments. We@@ -70,7 +75,7 @@ -- ToDo: this might not be correct for 64-bit API arg_size (arg, _) = max (widthInBytes $ typeWidth $ cmmExprType dflags arg) (wORD_SIZE dflags)- ; cmm_args <- getFCallArgs stg_args+ ; cmm_args <- getFCallArgs stg_args typ ; (res_regs, res_hints) <- newUnboxedTupleRegs res_ty ; let ((call_args, arg_hints), cmm_target) = case target of@@ -492,43 +497,131 @@ closureField :: DynFlags -> ByteOff -> ByteOff closureField dflags off = off + fixedHdrSize dflags --- -----------------------------------------------------------------------------+-- Note [Unlifted boxed arguments to foreign calls]+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+-- -- For certain types passed to foreign calls, we adjust the actual--- value passed to the call. For ByteArray#/Array# we pass the--- address of the actual array, not the address of the heap object.+-- value passed to the call. For ByteArray#, Array#, SmallArray#,+-- and ArrayArray#, we pass the address of the array's payload, not+-- the address of the heap object. For example, consider+-- foreign import "c_foo" foo :: ByteArray# -> Int# -> IO ()+-- At a Haskell call like `foo x y`, we'll generate a C call that+-- is more like+-- c_foo( x+8, y )+-- where the "+8" takes the heap pointer (x :: ByteArray#) and moves+-- it past the header words of the ByteArray object to point directly+-- to the data inside the ByteArray#. (The exact offset depends+-- on the target architecture and on profiling) By contrast, (y :: Int#)+-- requires no such adjustment.+--+-- This adjustment is performed by 'add_shim'. The size of the+-- adjustment depends on the type of heap object. But+-- how can we determine that type? There are two available options.+-- We could use the types of the actual values that the foreign call+-- has been applied to, or we could use the types present in the+-- foreign function's type. Prior to GHC 8.10, we used the former+-- strategy since it's a little more simple. However, in issue #16650+-- and more compellingly in the comments of+-- https://gitlab.haskell.org/ghc/ghc/merge_requests/939, it was+-- demonstrated that this leads to bad behavior in the presence+-- of unsafeCoerce#. Returning to the above example, suppose the+-- Haskell call looked like+-- foo (unsafeCoerce# p)+-- where the types of expressions comprising the arguments are+-- p :: (Any :: TYPE 'UnliftedRep)+-- i :: Int#+-- so that the unsafe-coerce is between Any and ByteArray#.+-- These two types have the same kind (they are both represented by+-- a heap pointer) so no GC errors will occur if we do this unsafe coerce.+-- By the time this gets to the code generator the cast has been+-- discarded so we have+-- foo p y+-- But we *must* adjust the pointer to p by a ByteArray# shim,+-- *not* by an Any shim (the Any shim involves no offset at all).+--+-- To avoid this bad behavior, we adopt the second strategy: use+-- the types present in the foreign function's type.+-- In collectStgFArgTypes, we convert the foreign function's+-- type to a list of StgFArgType. Then, in add_shim, we interpret+-- these as numeric offsets. -getFCallArgs :: [StgArg] -> FCode [(CmmExpr, ForeignHint)]+getFCallArgs ::+ [StgArg]+ -> Type -- the type of the foreign function+ -> FCode [(CmmExpr, ForeignHint)] -- (a) Drop void args -- (b) Add foreign-call shim code -- It's (b) that makes this differ from getNonVoidArgAmodes--getFCallArgs args- = do { mb_cmms <- mapM get args+-- Precondition: args and typs have the same length+-- See Note [Unlifted boxed arguments to foreign calls]+getFCallArgs args typ+ = do { mb_cmms <- mapM get (zipEqual "getFCallArgs" args (collectStgFArgTypes typ)) ; return (catMaybes mb_cmms) } where- get arg | null arg_reps- = return Nothing- | otherwise- = do { cmm <- getArgAmode (NonVoid arg)- ; dflags <- getDynFlags- ; return (Just (add_shim dflags arg_ty cmm, hint)) }- where- arg_ty = stgArgType arg- arg_reps = typePrimRep arg_ty- hint = typeForeignHint arg_ty+ get (arg,typ)+ | null arg_reps+ = return Nothing+ | otherwise+ = do { cmm <- getArgAmode (NonVoid arg)+ ; dflags <- getDynFlags+ ; return (Just (add_shim dflags typ cmm, hint)) }+ where+ arg_ty = stgArgType arg+ arg_reps = typePrimRep arg_ty+ hint = typeForeignHint arg_ty -add_shim :: DynFlags -> Type -> CmmExpr -> CmmExpr-add_shim dflags arg_ty expr- | tycon == arrayPrimTyCon || tycon == mutableArrayPrimTyCon- = cmmOffsetB dflags expr (arrPtrsHdrSize dflags)+-- The minimum amount of information needed to determine+-- the offset to apply to an argument to a foreign call.+-- See Note [Unlifted boxed arguments to foreign calls]+data StgFArgType+ = StgPlainType+ | StgArrayType+ | StgSmallArrayType+ | StgByteArrayType - | tycon == smallArrayPrimTyCon || tycon == smallMutableArrayPrimTyCon- = cmmOffsetB dflags expr (smallArrPtrsHdrSize dflags)+-- See Note [Unlifted boxed arguments to foreign calls]+add_shim :: DynFlags -> StgFArgType -> CmmExpr -> CmmExpr+add_shim dflags ty expr = case ty of+ StgPlainType -> expr+ StgArrayType -> cmmOffsetB dflags expr (arrPtrsHdrSize dflags)+ StgSmallArrayType -> cmmOffsetB dflags expr (smallArrPtrsHdrSize dflags)+ StgByteArrayType -> cmmOffsetB dflags expr (arrWordsHdrSize dflags) - | tycon == byteArrayPrimTyCon || tycon == mutableByteArrayPrimTyCon- = cmmOffsetB dflags expr (arrWordsHdrSize dflags)+-- From a function, extract information needed to determine+-- the offset of each argument when used as a C FFI argument.+-- See Note [Unlifted boxed arguments to foreign calls]+collectStgFArgTypes :: Type -> [StgFArgType]+collectStgFArgTypes = go []+ where+ -- Skip foralls+ go bs (ForAllTy _ res) = go bs res+ go bs (AppTy{}) = reverse bs+ go bs (TyConApp{}) = reverse bs+ go bs (LitTy{}) = reverse bs+ go bs (TyVarTy{}) = reverse bs+ go _ (CastTy{}) = panic "myCollectTypeArgs: CastTy"+ go _ (CoercionTy{}) = panic "myCollectTypeArgs: CoercionTy"+ go bs (FunTy {ft_arg = arg, ft_res=res}) =+ go (typeToStgFArgType arg:bs) res - | otherwise = expr+-- Choose the offset based on the type. For anything other+-- than an unlifted boxed type, there is no offset.+-- See Note [Unlifted boxed arguments to foreign calls]+typeToStgFArgType :: Type -> StgFArgType+typeToStgFArgType typ+ | tycon == arrayPrimTyCon = StgArrayType+ | tycon == mutableArrayPrimTyCon = StgArrayType+ | tycon == arrayArrayPrimTyCon = StgArrayType+ | tycon == mutableArrayArrayPrimTyCon = StgArrayType+ | tycon == smallArrayPrimTyCon = StgSmallArrayType+ | tycon == smallMutableArrayPrimTyCon = StgSmallArrayType+ | tycon == byteArrayPrimTyCon = StgByteArrayType+ | tycon == mutableByteArrayPrimTyCon = StgByteArrayType+ | otherwise = StgPlainType where- tycon = tyConAppTyCon (unwrapType arg_ty)- -- should be a tycon app, since this is a foreign call+ -- Should be a tycon app, since this is a foreign call. We look+ -- through newtypes so the offset does not change if a user replaces+ -- a type in a foreign function signature with a representationally+ -- equivalent newtype.+ tycon = tyConAppTyCon (unwrapType typ)+
compiler/codeGen/StgCmmMonad.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE GADTs #-} -----------------------------------------------------------------------------@@ -111,9 +112,7 @@ -------------------------------------------------------- newtype FCode a = FCode { doFCode :: CgInfoDownwards -> CgState -> (a, CgState) }--instance Functor FCode where- fmap f (FCode g) = FCode $ \i s -> case g i s of (a, s') -> (f a, s')+ deriving (Functor) instance Applicative FCode where pure val = FCode (\_info_down state -> (val, state))
compiler/codeGen/StgCmmPrim.hs view
@@ -31,7 +31,7 @@ import StgCmmProf ( costCentreFrom ) import DynFlags-import Platform+import GHC.Platform import BasicTypes import BlockId import MkGraph@@ -71,8 +71,8 @@ -> FCode ReturnKind -- Foreign calls-cgOpApp (StgFCallOp fcall _) stg_args res_ty- = cgForeignCall fcall stg_args res_ty+cgOpApp (StgFCallOp fcall ty) stg_args res_ty+ = cgForeignCall fcall ty stg_args res_ty -- Note [Foreign call results] -- tagToEnum# is special: we need to pull the constructor@@ -669,7 +669,7 @@ -- SIMD primops emitPrimOp dflags [res] (VecBroadcastOp vcat n w) [e] = do checkVecCompatibility dflags vcat n w- doVecPackOp (vecElemInjectCast dflags vcat w) ty zeros (replicate n e) res+ doVecBroadcastOp (vecElemInjectCast dflags vcat w) ty zeros e res where zeros :: CmmExpr zeros = CmmLit $ CmmVec (replicate n zero)@@ -1513,7 +1513,9 @@ callishOp DoubleAcoshOp = Just MO_F64_Acosh callishOp DoubleAtanhOp = Just MO_F64_Atanh callishOp DoubleLogOp = Just MO_F64_Log+callishOp DoubleLog1POp = Just MO_F64_Log1P callishOp DoubleExpOp = Just MO_F64_Exp+callishOp DoubleExpM1Op = Just MO_F64_ExpM1 callishOp DoubleSqrtOp = Just MO_F64_Sqrt callishOp FloatPowerOp = Just MO_F32_Pwr@@ -1530,7 +1532,9 @@ callishOp FloatAcoshOp = Just MO_F32_Acosh callishOp FloatAtanhOp = Just MO_F32_Atanh callishOp FloatLogOp = Just MO_F32_Log+callishOp FloatLog1POp = Just MO_F32_Log1P callishOp FloatExpOp = Just MO_F32_Exp+callishOp FloatExpM1Op = Just MO_F32_ExpM1 callishOp FloatSqrtOp = Just MO_F32_Sqrt callishOp _ = Nothing@@ -1761,9 +1765,8 @@ checkVecCompatibility :: DynFlags -> PrimOpVecCat -> Length -> Width -> FCode () checkVecCompatibility dflags vcat l w = do- when (hscTarget dflags /= HscLlvm) $ do- sorry $ unlines ["SIMD vector instructions require the LLVM back-end."- ,"Please use -fllvm."]+ when (hscTarget dflags /= HscLlvm && hscTarget dflags /= HscAsm) $ do+ sorry "SIMD vector instructions not supported for the C backend or GHCi" check vecWidth vcat l w where check :: Width -> PrimOpVecCat -> Length -> Width -> FCode ()@@ -1788,7 +1791,39 @@ ------------------------------------------------------------------------------ -- Helpers for translating vector packing and unpacking.+doVecBroadcastOp :: Maybe MachOp -- Cast from element to vector component+ -> CmmType -- Type of vector+ -> CmmExpr -- Initial vector+ -> CmmExpr -- Elements+ -> CmmFormal -- Destination for result+ -> FCode ()+doVecBroadcastOp maybe_pre_write_cast ty z es res = do+ dst <- newTemp ty+ emitAssign (CmmLocal dst) z+ vecBroadcast dst es 0+ where+ vecBroadcast :: CmmFormal -> CmmExpr -> Int -> FCode ()+ vecBroadcast src e _ = do+ dst <- newTemp ty+ if isFloatType (vecElemType ty)+ then emitAssign (CmmLocal dst) (CmmMachOp (MO_VF_Broadcast len wid)+ [CmmReg (CmmLocal src), cast e])+ --TODO : Add the MachOp MO_V_Broadcast+ else emitAssign (CmmLocal dst) (CmmMachOp (MO_V_Insert len wid)+ [CmmReg (CmmLocal src), cast e])+ emitAssign (CmmLocal res) (CmmReg (CmmLocal dst)) + cast :: CmmExpr -> CmmExpr+ cast val = case maybe_pre_write_cast of+ Nothing -> val+ Just cast -> CmmMachOp cast [val]++ len :: Length+ len = vecLength ty++ wid :: Width+ wid = typeWidth (vecElemType ty)+ doVecPackOp :: Maybe MachOp -- Cast from element to vector component -> CmmType -- Type of vector -> CmmExpr -- Initial vector@@ -1805,16 +1840,16 @@ emitAssign (CmmLocal res) (CmmReg (CmmLocal src)) vecPack src (e : es) i = do- dst <- newTemp ty- if isFloatType (vecElemType ty)- then emitAssign (CmmLocal dst) (CmmMachOp (MO_VF_Insert len wid)- [CmmReg (CmmLocal src), cast e, iLit])- else emitAssign (CmmLocal dst) (CmmMachOp (MO_V_Insert len wid)- [CmmReg (CmmLocal src), cast e, iLit])- vecPack dst es (i + 1)+ dst <- newTemp ty+ if isFloatType (vecElemType ty)+ then emitAssign (CmmLocal dst) (CmmMachOp (MO_VF_Insert len wid)+ [CmmReg (CmmLocal src), cast e, iLit])+ else emitAssign (CmmLocal dst) (CmmMachOp (MO_V_Insert len wid)+ [CmmReg (CmmLocal src), cast e, iLit])+ vecPack dst es (i + 1) where -- vector indices are always 32-bits- iLit = CmmLit (CmmInt (toInteger i) W32)+ iLit = CmmLit (CmmInt ((toInteger i) * 16) W32) cast :: CmmExpr -> CmmExpr cast val = case maybe_pre_write_cast of
compiler/coreSyn/CoreLint.hs view
@@ -7,6 +7,7 @@ -} {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} module CoreLint ( lintCoreBindings, lintUnfolding,@@ -2076,6 +2077,7 @@ LintEnv -> WarnsAndErrs -> -- Warning and error messages so far (Maybe a, WarnsAndErrs) } -- Result and messages (if any)+ deriving (Functor) type WarnsAndErrs = (Bag MsgDoc, Bag MsgDoc) @@ -2145,9 +2147,6 @@ lint the result. Reason: want to check that synonyms are saturated when the type is expanded. -}--instance Functor LintM where- fmap = liftM instance Applicative LintM where pure x = LintM $ \ _ errs -> (Just x, errs)
compiler/coreSyn/CorePrep.hs view
@@ -53,7 +53,7 @@ import Util import Pair import Outputable-import Platform+import GHC.Platform import FastString import Name ( NamedThing(..), nameSrcSpan ) import SrcLoc ( SrcSpan(..), realSrcLocSpan, mkRealSrcLoc )@@ -71,7 +71,7 @@ The goal of this pass is to prepare for code generation. -1. Saturate constructor and primop applications.+1. Saturate constructor applications. 2. Convert to A-normal form; that is, function arguments are always variables.@@ -1063,8 +1063,21 @@ -- Building the saturated syntax -- --------------------------------------------------------------------------- -maybeSaturate deals with saturating primops and constructors-The type is the type of the entire application+Note [Eta expansion of hasNoBinding things in CorePrep]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+maybeSaturate deals with eta expanding to saturate things that can't deal with+unsaturated applications (identified by 'hasNoBinding', currently just+foreign calls and unboxed tuple/sum constructors).++Note that eta expansion in CorePrep is very fragile due to the "prediction" of+CAFfyness made by TidyPgm (see Note [CAFfyness inconsistencies due to eta+expansion in CorePrep] in TidyPgm for details. We previously saturated primop+applications here as well but due to this fragility (see #16846) we now deal+with this another way, as described in Note [Primop wrappers] in PrimOp.++It's quite likely that eta expansion of constructor applications will+eventually break in a similar way to how primops did. We really should+eliminate this case as well. -} maybeSaturate :: Id -> CpeApp -> Int -> UniqSM CpeRhs
compiler/deSugar/Check.hs view
@@ -25,6 +25,7 @@ import GhcPrelude import TmOracle+import PmPpr import Unify( tcMatchTy ) import DynFlags import HsSyn@@ -579,7 +580,7 @@ pmInitialTmTyCs :: PmM Delta pmInitialTmTyCs = do ty_cs <- liftD getDictsDs- tm_cs <- map toComplex . bagToList <$> liftD getTmCsDs+ tm_cs <- bagToList <$> liftD getTmCsDs sat_ty <- tyOracle ty_cs let initTyCs = if sat_ty then ty_cs else emptyBag initTmState = fromMaybe initialTmState (tmOracle initialTmState tm_cs)@@ -627,7 +628,7 @@ pmIsSatisfiable :: Delta -- ^ The ambient term and type constraints -- (known to be satisfiable).- -> ComplexEq -- ^ The new term constraint.+ -> TmVarCt -- ^ The new term constraint. -> Bag EvVar -- ^ The new type constraints. -> [Type] -- ^ The strict argument types. -> PmM (Maybe Delta)@@ -653,7 +654,7 @@ tmTyCsAreSatisfiable :: Delta -- ^ The ambient term and type constraints -- (known to be satisfiable).- -> ComplexEq -- ^ The new term constraint.+ -> TmVarCt -- ^ The new term constraint. -> Bag EvVar -- ^ The new type constraints. -> PmM (Maybe Delta) -- ^ @'Just' delta@ if the constraints (@delta@) are@@ -1463,7 +1464,7 @@ data InhabitationCandidate = InhabitationCandidate { ic_val_abs :: ValAbs- , ic_tm_ct :: ComplexEq+ , ic_tm_ct :: TmVarCt , ic_ty_cs :: Bag EvVar , ic_strict_arg_tys :: [Type] }@@ -1660,7 +1661,7 @@ strict_arg_tys = filterByList arg_is_banged arg_tys' return $ InhabitationCandidate { ic_val_abs = con_abs- , ic_tm_ct = (PmExprVar (idName x), vaToPmExpr con_abs)+ , ic_tm_ct = TVC x (vaToPmExpr con_abs) , ic_ty_cs = listToBag evvars , ic_strict_arg_tys = strict_arg_tys }@@ -1678,21 +1679,15 @@ | PmExprOther {} <- expr -> pure PmFake | otherwise -> pure (PmGrd pv expr) --- | Create a term equality of the form: `(False ~ (x ~ lit))`-mkNegEq :: Id -> PmLit -> ComplexEq-mkNegEq x l = (falsePmExpr, PmExprVar (idName x) `PmExprEq` PmExprLit l)-{-# INLINE mkNegEq #-}- -- | Create a term equality of the form: `(x ~ lit)`-mkPosEq :: Id -> PmLit -> ComplexEq-mkPosEq x l = (PmExprVar (idName x), PmExprLit l)+mkPosEq :: Id -> PmLit -> TmVarCt+mkPosEq x l = TVC x (PmExprLit l) {-# INLINE mkPosEq #-} -- | Create a term equality of the form: `(x ~ x)` -- (always discharged by the term oracle)-mkIdEq :: Id -> ComplexEq-mkIdEq x = (PmExprVar name, PmExprVar name)- where name = idName x+mkIdEq :: Id -> TmVarCt+mkIdEq x = TVC x (PmExprVar (idName x)) {-# INLINE mkIdEq #-} -- | Generate a variable pattern of a given type@@ -2059,8 +2054,7 @@ -- Var pmcheckHd (PmVar x) ps guards va (ValVec vva delta)- | Just tm_state <- solveOneEq (delta_tm_cs delta)- (PmExprVar (idName x), vaToPmExpr va)+ | Just tm_state <- solveOneEq (delta_tm_cs delta) (TVC x (vaToPmExpr va)) = ucon va <$> pmcheckI ps guards (ValVec vva (delta {delta_tm_cs = tm_state})) | otherwise = return mempty @@ -2122,7 +2116,8 @@ ValVec vva (delta {delta_tm_cs = tm_state}) Nothing -> return mempty where- us | Just tm_state <- solveOneEq (delta_tm_cs delta) (mkNegEq x l)+ -- See Note [Refutable shapes] in TmOracle+ us | Just tm_state <- addSolveRefutableAltCon (delta_tm_cs delta) x (PmAltLit l) = [ValVec (PmNLit x [l] : vva) (delta { delta_tm_cs = tm_state })] | otherwise = [] @@ -2142,7 +2137,8 @@ (ValVec vva (delta { delta_tm_cs = tm_state })) | otherwise = return non_matched where- us | Just tm_state <- solveOneEq (delta_tm_cs delta) (mkNegEq x l)+ -- See Note [Refutable shapes] in TmOracle+ us | Just tm_state <- addSolveRefutableAltCon (delta_tm_cs delta) x (PmAltLit l) = [ValVec (PmNLit x (l:lits) : vva) (delta { delta_tm_cs = tm_state })] | otherwise = [] @@ -2407,22 +2403,22 @@ genCaseTmCs2 :: Maybe (LHsExpr GhcTc) -- Scrutinee -> [Pat GhcTc] -- LHS (should have length 1) -> [Id] -- MatchVars (should have length 1)- -> DsM (Bag SimpleEq)+ -> DsM (Bag TmVarCt) genCaseTmCs2 Nothing _ _ = return emptyBag genCaseTmCs2 (Just scr) [p] [var] = do fam_insts <- dsGetFamInstEnvs [e] <- map vaToPmExpr . coercePatVec <$> translatePat fam_insts p let scr_e = lhsExprToPmExpr scr- return $ listToBag [(var, e), (var, scr_e)]+ return $ listToBag [(TVC var e), (TVC var scr_e)] genCaseTmCs2 _ _ _ = panic "genCaseTmCs2: HsCase" -- | Generate a simple equality when checking a case expression: -- case x of { matches } -- When checking matches we record that (x ~ y) where y is the initial -- uncovered. All matches will have to satisfy this equality.-genCaseTmCs1 :: Maybe (LHsExpr GhcTc) -> [Id] -> Bag SimpleEq+genCaseTmCs1 :: Maybe (LHsExpr GhcTc) -> [Id] -> Bag TmVarCt genCaseTmCs1 Nothing _ = emptyBag-genCaseTmCs1 (Just scr) [var] = unitBag (var, lhsExprToPmExpr scr)+genCaseTmCs1 (Just scr) [var] = unitBag (TVC var (lhsExprToPmExpr scr)) genCaseTmCs1 _ _ = panic "genCaseTmCs1: HsCase" {- Note [Literals in PmPat]@@ -2484,21 +2480,15 @@ instance Outputable ValVec where ppr (ValVec vva delta)- = let (residual_eqs, subst) = wrapUpTmState (delta_tm_cs delta)- vector = substInValAbs subst vva- in ppr_uncovered (vector, residual_eqs)+ = let (subst, refuts) = wrapUpTmState (delta_tm_cs delta)+ vector = substInValAbs subst vva+ in pprUncovered (vector, refuts) -- | Apply a term substitution to a value vector abstraction. All VAs are -- transformed to PmExpr (used only before pretty printing).-substInValAbs :: PmVarEnv -> [ValAbs] -> [PmExpr]+substInValAbs :: TmVarCtEnv -> [ValAbs] -> [PmExpr] substInValAbs subst = map (exprDeepLookup subst . vaToPmExpr) --- | Wrap up the term oracle's state once solving is complete. Drop any--- information about unhandled constraints (involving HsExprs) and flatten--- (height 1) the substitution.-wrapUpTmState :: TmState -> ([ComplexEq], PmVarEnv)-wrapUpTmState (residual, (_, subst)) = (residual, flattenPmVarEnv subst)- -- | Issue all the warnings (coverage, exhaustiveness, inaccessibility) dsPmWarn :: DynFlags -> DsMatchContext -> PmResult -> DsM () dsPmWarn dflags ctx@(DsMatchContext kind loc) pm_result@@ -2538,10 +2528,11 @@ maxPatterns = maxUncoveredPatterns dflags -- Print a single clause (for redundant/with-inaccessible-rhs)- pprEqn q txt = pp_context True ctx (text txt) $ \f -> ppr_eqn f kind q+ pprEqn q txt = pprContext True ctx (text txt) $ \f ->+ f (pprPats kind (map unLoc q)) -- Print several clauses (for uncovered clauses)- pprEqns qs = pp_context False ctx (text "are non-exhaustive") $ \_ ->+ pprEqns qs = pprContext False ctx (text "are non-exhaustive") $ \_ -> case qs of -- See #11245 [ValVec [] _] -> text "Guards do not cover entire pattern space"@@ -2552,7 +2543,7 @@ -- Print a type-annotated wildcard (for non-exhaustive `EmptyCase`s for -- which we only know the type and have no inhabitants at hand)- warnEmptyCase ty = pp_context False ctx (text "are non-exhaustive") $ \_ ->+ warnEmptyCase ty = pprContext False ctx (text "are non-exhaustive") $ \_ -> hang (text "Patterns not matched:") 4 (underscore <+> dcolon <+> ppr ty) {- Note [Inaccessible warnings for record updates]@@ -2589,7 +2580,7 @@ msg is = fsep [ text "Pattern match checker exceeded" , parens (ppr is), text "iterations in", ctxt <> dot , text "(Use -fmax-pmcheck-iterations=n"- , text "to set the maximun number of iterations to n)" ]+ , text "to set the maximum number of iterations to n)" ] flag_i = wopt Opt_WarnOverlappingPatterns dflags flag_u = exhaustive dflags kind@@ -2624,8 +2615,8 @@ -- incomplete -- True <==> singular-pp_context :: Bool -> DsMatchContext -> SDoc -> ((SDoc -> SDoc) -> SDoc) -> SDoc-pp_context singular (DsMatchContext kind _loc) msg rest_of_msg_fun+pprContext :: Bool -> DsMatchContext -> SDoc -> ((SDoc -> SDoc) -> SDoc) -> SDoc+pprContext singular (DsMatchContext kind _loc) msg rest_of_msg_fun = vcat [text txt <+> msg, sep [ text "In" <+> ppr_match <> char ':' , nest 4 (rest_of_msg_fun pref)]]@@ -2639,87 +2630,10 @@ -> (pprMatchContext kind, \ pp -> ppr fun <+> pp) _ -> (pprMatchContext kind, \ pp -> pp) -ppr_pats :: HsMatchContext Name -> [Pat GhcTc] -> SDoc-ppr_pats kind pats+pprPats :: HsMatchContext Name -> [Pat GhcTc] -> SDoc+pprPats kind pats = sep [sep (map ppr pats), matchSeparator kind, text "..."] -ppr_eqn :: (SDoc -> SDoc) -> HsMatchContext Name -> [LPat GhcTc] -> SDoc-ppr_eqn prefixF kind eqn = prefixF (ppr_pats kind (map unLoc eqn))--ppr_constraint :: (SDoc,[PmLit]) -> SDoc-ppr_constraint (var, lits) = var <+> text "is not one of"- <+> braces (pprWithCommas ppr lits)--ppr_uncovered :: ([PmExpr], [ComplexEq]) -> SDoc-ppr_uncovered (expr_vec, complex)- | null cs = fsep vec -- there are no literal constraints- | otherwise = hang (fsep vec) 4 $- text "where" <+> vcat (map ppr_constraint cs)- where- sdoc_vec = mapM pprPmExprWithParens expr_vec- (vec,cs) = runPmPprM sdoc_vec (filterComplex complex)--{- Note [Representation of Term Equalities]-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-In the paper, term constraints always take the form (x ~ e). Of course, a more-general constraint of the form (e1 ~ e1) can always be transformed to an-equivalent set of the former constraints, by introducing a fresh, intermediate-variable: { y ~ e1, y ~ e1 }. Yet, implementing this representation gave rise-to #11160 (incredibly bad performance for literal pattern matching). Two are-the main sources of this problem (the actual problem is how these two interact-with each other):--1. Pattern matching on literals generates twice as many constraints as needed.- Consider the following (tests/ghci/should_run/ghcirun004):-- foo :: Int -> Int- foo 1 = 0- ...- foo 5000 = 4999-- The covered and uncovered set *should* look like:- U0 = { x |> {} }-- C1 = { 1 |> { x ~ 1 } }- U1 = { x |> { False ~ (x ~ 1) } }- ...- C10 = { 10 |> { False ~ (x ~ 1), .., False ~ (x ~ 9), x ~ 10 } }- U10 = { x |> { False ~ (x ~ 1), .., False ~ (x ~ 9), False ~ (x ~ 10) } }- ...-- If we replace { False ~ (x ~ 1) } with { y ~ False, y ~ (x ~ 1) }- we get twice as many constraints. Also note that half of them are just the- substitution [x |-> False].--2. The term oracle (`tmOracle` in deSugar/TmOracle) uses equalities of the form- (x ~ e) as substitutions [x |-> e]. More specifically, function- `extendSubstAndSolve` applies such substitutions in the residual constraints- and partitions them in the affected and non-affected ones, which are the new- worklist. Essentially, this gives quadradic behaviour on the number of the- residual constraints. (This would not be the case if the term oracle used- mutable variables but, since we use it to handle disjunctions on value set- abstractions (`Union` case), we chose a pure, incremental interface).--Now the problem becomes apparent (e.g. for clause 300):- * Set U300 contains 300 substituting constraints [y_i |-> False] and 300- constraints that we know that will not reduce (stay in the worklist).- * To check for consistency, we apply the substituting constraints ONE BY ONE- (since `tmOracle` is called incrementally, it does not have all of them- available at once). Hence, we go through the (non-progressing) constraints- over and over, achieving over-quadradic behaviour.--If instead we allow constraints of the form (e ~ e),- * All uncovered sets Ui contain no substituting constraints and i- non-progressing constraints of the form (False ~ (x ~ lit)) so the oracle- behaves linearly.- * All covered sets Ci contain exactly (i-1) non-progressing constraints and- a single substituting constraint. So the term oracle goes through the- constraints only once.--The performance improvement becomes even more important when more arguments are-involved.--}- -- Debugging Infrastructre tracePm :: String -> SDoc -> PmM ()@@ -2757,3 +2671,5 @@ pprValVecDebug :: ValVec -> SDoc pprValVecDebug (ValVec vas _d) = text "ValVec" <+> parens (pprValAbs vas)+ -- <not a haddock> $$ ppr (delta_tm_cs _d)+ -- <not a haddock> $$ ppr (delta_ty_cs _d)
compiler/deSugar/Coverage.hs view
@@ -6,6 +6,7 @@ {-# LANGUAGE NondecreasingIndentation, RecordWildCards #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DeriveFunctor #-} module Coverage (addTicksToBinds, hpcInitCode) where @@ -1071,11 +1072,9 @@ -- over what free variables we track. data TM a = TM { unTM :: TickTransEnv -> TickTransState -> (a,FreeVars,TickTransState) }+ deriving (Functor) -- a combination of a state monad (TickTransState) and a writer -- monad (FreeVars).--instance Functor TM where- fmap = liftM instance Applicative TM where pure a = TM $ \ _env st -> (a,noFVs,st)
compiler/deSugar/DsExpr.hs view
@@ -1091,7 +1091,7 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We cannot have levity polymorphic function arguments. See Note [Levity polymorphism invariants] in CoreSyn. But we *can* have-functions that take levity polymorphism arguments, as long as these+functions that take levity polymorphic arguments, as long as these functions are eta-reduced. (See #12708 for an example.) However, we absolutely cannot do this for functions that have no@@ -1162,7 +1162,11 @@ levPolyPrimopErr :: Id -> Type -> [Type] -> DsM () levPolyPrimopErr primop ty bad_tys- = errDs $ vcat [ hang (text "Cannot use primitive with levity-polymorphic arguments:")- 2 (ppr primop <+> dcolon <+> pprWithTYPE ty)- , hang (text "Levity-polymorphic arguments:")- 2 (vcat (map (\t -> pprWithTYPE t <+> dcolon <+> pprWithTYPE (typeKind t)) bad_tys)) ]+ = errDs $ vcat+ [ hang (text "Cannot use function with levity-polymorphic arguments:")+ 2 (ppr primop <+> dcolon <+> pprWithTYPE ty)+ , hang (text "Levity-polymorphic arguments:")+ 2 $ vcat $ map+ (\t -> pprWithTYPE t <+> dcolon <+> pprWithTYPE (typeKind t))+ bad_tys+ ]
compiler/deSugar/DsForeign.hs view
@@ -49,7 +49,7 @@ import Outputable import FastString import DynFlags-import Platform+import GHC.Platform import OrdList import Pair import Util
compiler/deSugar/DsMeta.hs view
@@ -1332,13 +1332,21 @@ = notHandled "monad comprehension and [: :]" (ppr e) repE (ExplicitList _ _ es) = do { xs <- repLEs es; repListExp xs }-repE e@(ExplicitTuple _ es boxed)- | not (all tupArgPresent es) = notHandled "Tuple sections" (ppr e)- | isBoxed boxed = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]- ; repTup xs }- | otherwise = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]- ; repUnboxedTup xs }+repE (ExplicitTuple _ es boxity) =+ let tupArgToCoreExp :: LHsTupArg GhcRn -> DsM (Core (Maybe TH.ExpQ))+ tupArgToCoreExp a+ | L _ (Present _ e) <- dL a = do { e' <- repLE e+ ; coreJust expQTyConName e' }+ | otherwise = coreNothing expQTyConName + in do { args <- mapM tupArgToCoreExp es+ ; expQTy <- lookupType expQTyConName+ ; let maybeExpQTy = mkTyConApp maybeTyCon [expQTy]+ listArg = coreList' maybeExpQTy args+ ; if isBoxed boxity+ then repTup listArg+ else repUnboxedTup listArg }+ repE (ExplicitSum _ alt arity e) = do { e1 <- repLE e ; repUnboxedSum e1 alt arity }@@ -2077,10 +2085,10 @@ repLamCase :: Core [TH.MatchQ] -> DsM (Core TH.ExpQ) repLamCase (MkC ms) = rep2 lamCaseEName [ms] -repTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)+repTup :: Core [Maybe TH.ExpQ] -> DsM (Core TH.ExpQ) repTup (MkC es) = rep2 tupEName [es] -repUnboxedTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)+repUnboxedTup :: Core [Maybe TH.ExpQ] -> DsM (Core TH.ExpQ) repUnboxedTup (MkC es) = rep2 unboxedTupEName [es] repUnboxedSum :: Core TH.ExpQ -> TH.SumAlt -> TH.SumArity -> DsM (Core TH.ExpQ)
compiler/deSugar/DsMonad.hs view
@@ -396,11 +396,11 @@ = updLclEnv (\env -> env { dsl_dicts = unionBags ev_vars (dsl_dicts env) }) -- | Get in-scope term constraints (pm check)-getTmCsDs :: DsM (Bag SimpleEq)+getTmCsDs :: DsM (Bag TmVarCt) getTmCsDs = do { env <- getLclEnv; return (dsl_tm_cs env) } -- | Add in-scope term constraints (pm check)-addTmCsDs :: Bag SimpleEq -> DsM a -> DsM a+addTmCsDs :: Bag TmVarCt -> DsM a -> DsM a addTmCsDs tm_cs = updLclEnv (\env -> env { dsl_tm_cs = unionBags tm_cs (dsl_tm_cs env) })
compiler/deSugar/ExtractDocs.hs view
@@ -20,6 +20,7 @@ import TcRnTypes import Control.Applicative+import Data.Bifunctor (first) import Data.List import Data.Map (Map) import qualified Data.Map as M@@ -214,9 +215,10 @@ InfixCon arg1 arg2 -> go 0 ([unLoc arg1, unLoc arg2] ++ ret) RecCon _ -> go 1 ret where- go n (HsDocTy _ _ (dL->L _ ds) : tys) = M.insert n ds $ go (n+1) tys- go n (_ : tys) = go (n+1) tys- go _ [] = M.empty+ go n = M.fromList . catMaybes . zipWith f [n..]+ where+ f n (HsDocTy _ _ lds) = Just (n, unLoc lds)+ f _ _ = Nothing ret = case con of ConDeclGADT { con_res_ty = res_ty } -> [ unLoc res_ty ]@@ -262,14 +264,13 @@ typeDocs :: HsType GhcRn -> Map Int (HsDocString) typeDocs = go 0 where- go n (HsForAllTy { hst_body = ty }) = go n (unLoc ty)- go n (HsQualTy { hst_body = ty }) = go n (unLoc ty)- go n (HsFunTy _ (dL->L _- (HsDocTy _ _ (dL->L _ x))) (dL->L _ ty)) =- M.insert n x $ go (n+1) ty- go n (HsFunTy _ _ ty) = go (n+1) (unLoc ty)- go n (HsDocTy _ _ (dL->L _ doc)) = M.singleton n doc- go _ _ = M.empty+ go n = \case+ HsForAllTy { hst_body = ty } -> go n (unLoc ty)+ HsQualTy { hst_body = ty } -> go n (unLoc ty)+ HsFunTy _ (unLoc->HsDocTy _ _ x) ty -> M.insert n (unLoc x) $ go (n+1) (unLoc ty)+ HsFunTy _ _ ty -> go (n+1) (unLoc ty)+ HsDocTy _ _ doc -> M.singleton n (unLoc doc)+ _ -> M.empty -- | The top-level declarations of a module that we care about, -- ordered by source location, with documentation attached if it exists.@@ -289,11 +290,11 @@ mkDecls (valbinds . hs_valds) (ValD noExt) group_ where typesigs (XValBindsLR (NValBinds _ sigs)) = filter (isUserSig . unLoc) sigs- typesigs _ = error "expected ValBindsOut"+ typesigs ValBinds{} = error "expected XValBindsLR" valbinds (XValBindsLR (NValBinds binds _)) = concatMap bagToList . snd . unzip $ binds- valbinds _ = error "expected ValBindsOut"+ valbinds ValBinds{} = error "expected XValBindsLR" -- | Sort by source location sortByLoc :: [Located a] -> [Located a]@@ -304,17 +305,16 @@ -- A declaration may have multiple doc strings attached to it. collectDocs :: [LHsDecl pass] -> [(LHsDecl pass, [HsDocString])] -- ^ This is an example.-collectDocs = go Nothing []+collectDocs = go [] Nothing where- go Nothing _ [] = []- go (Just prev) docs [] = finished prev docs []- go prev docs ((dL->L _ (DocD _ (DocCommentNext str))) : ds)- | Nothing <- prev = go Nothing (str:docs) ds- | Just decl <- prev = finished decl docs (go Nothing [str] ds)- go prev docs ((dL->L _ (DocD _ (DocCommentPrev str))) : ds) =- go prev (str:docs) ds- go Nothing docs (d:ds) = go (Just d) docs ds- go (Just prev) docs (d:ds) = finished prev docs (go (Just d) [] ds)+ go docs mprev decls = case (decls, mprev) of+ ((unLoc->DocD _ (DocCommentNext s)) : ds, Nothing) -> go (s:docs) Nothing ds+ ((unLoc->DocD _ (DocCommentNext s)) : ds, Just prev) -> finished prev docs $ go [s] Nothing ds+ ((unLoc->DocD _ (DocCommentPrev s)) : ds, mprev) -> go (s:docs) mprev ds+ (d : ds, Nothing) -> go docs (Just d) ds+ (d : ds, Just prev) -> finished prev docs $ go [] (Just d) ds+ ([] , Nothing) -> []+ ([] , Just prev) -> finished prev docs [] finished decl docs rest = (decl, reverse docs) : rest @@ -335,13 +335,12 @@ -- | Go through all class declarations and filter their sub-declarations filterClasses :: [(LHsDecl a, doc)] -> [(LHsDecl a, doc)]-filterClasses decls = [ if isClassD d then (cL loc (filterClass d), doc) else x- | x@(dL->L loc d, doc) <- decls ]+filterClasses = map (first (mapLoc filterClass)) where- filterClass (TyClD x c) =+ filterClass (TyClD x c@(ClassDecl {})) = TyClD x $ c { tcdSigs = filter (liftA2 (||) (isUserSig . unLoc) isMinimalLSig) (tcdSigs c) }- filterClass _ = error "expected TyClD"+ filterClass d = d -- | Was this signature given by the user? isUserSig :: Sig name -> Bool@@ -350,12 +349,10 @@ isUserSig PatSynSig {} = True isUserSig _ = False -isClassD :: HsDecl a -> Bool-isClassD (TyClD _ d) = isClassDecl d-isClassD _ = False- -- | Take a field of declarations from a data structure and create HsDecls -- using the given constructor-mkDecls :: (a -> [Located b]) -> (b -> c) -> a -> [Located c]-mkDecls field con struct = [ cL loc (con decl)- | (dL->L loc decl) <- field struct ]+mkDecls :: (struct -> [Located decl])+ -> (decl -> hsDecl)+ -> struct+ -> [Located hsDecl]+mkDecls field con = map (mapLoc con) . field
+ compiler/deSugar/PmPpr.hs view
@@ -0,0 +1,191 @@+{-# LANGUAGE CPP #-}++-- | Provides factilities for pretty-printing 'PmExpr's in a way approriate for+-- user facing pattern match warnings.+module PmPpr (+ pprUncovered+ ) where++#include "HsVersions.h"++import GhcPrelude++import Name+import NameEnv+import NameSet+import UniqDFM+import UniqSet+import ConLike+import DataCon+import TysWiredIn+import Outputable+import Control.Monad.Trans.State.Strict+import Maybes+import Util++import TmOracle++-- | Pretty-print the guts of an uncovered value vector abstraction, i.e., its+-- components and refutable shapes associated to any mentioned variables.+--+-- Example for @([Just p, q], [p :-> [3,4], q :-> [0,5]]):+--+-- @+-- (Just p) q+-- where p is not one of {3, 4}+-- q is not one of {0, 5}+-- @+pprUncovered :: ([PmExpr], PmRefutEnv) -> SDoc+pprUncovered (expr_vec, refuts)+ | null cs = fsep vec -- there are no literal constraints+ | otherwise = hang (fsep vec) 4 $+ text "where" <+> vcat (map pprRefutableShapes cs)+ where+ sdoc_vec = mapM pprPmExprWithParens expr_vec+ (vec,cs) = runPmPpr sdoc_vec (prettifyRefuts refuts)++-- | Output refutable shapes of a variable in the form of @var is not one of {2,+-- Nothing, 3}@.+pprRefutableShapes :: (SDoc,[PmAltCon]) -> SDoc+pprRefutableShapes (var, alts)+ = var <+> text "is not one of" <+> braces (pprWithCommas ppr_alt alts)+ where+ ppr_alt (PmAltLit lit) = ppr lit++{- 1. Literals+~~~~~~~~~~~~~~+Starting with a function definition like:++ f :: Int -> Bool+ f 5 = True+ f 6 = True++The uncovered set looks like:+ { var |> var /= 5, var /= 6 }++Yet, we would like to print this nicely as follows:+ x , where x not one of {5,6}++Since these variables will be shown to the programmer, we give them better names+(t1, t2, ..) in 'prettifyRefuts', hence the SDoc in 'PrettyPmRefutEnv'.++2. Residual Constraints+~~~~~~~~~~~~~~~~~~~~~~~+Unhandled constraints that refer to HsExpr are typically ignored by the solver+(it does not even substitute in HsExpr so they are even printed as wildcards).+Additionally, the oracle returns a substitution if it succeeds so we apply this+substitution to the vectors before printing them out (see function `pprOne' in+Check.hs) to be more precise.+-}++-- | A 'PmRefutEnv' with pretty names for the occuring variables.+type PrettyPmRefutEnv = DNameEnv (SDoc, [PmAltCon])++-- | Assigns pretty names to constraint variables in the domain of the given+-- 'PmRefutEnv'.+prettifyRefuts :: PmRefutEnv -> PrettyPmRefutEnv+prettifyRefuts = listToUDFM . zipWith rename nameList . udfmToList+ where+ rename new (old, lits) = (old, (new, lits))+ -- Try nice names p,q,r,s,t before using the (ugly) t_i+ nameList :: [SDoc]+ nameList = map text ["p","q","r","s","t"] +++ [ text ('t':show u) | u <- [(0 :: Int)..] ]++type PmPprM a = State (PrettyPmRefutEnv, NameSet) a+-- (the first part of the state is read only. make it a reader?)++runPmPpr :: PmPprM a -> PrettyPmRefutEnv -> (a, [(SDoc,[PmAltCon])])+runPmPpr m lit_env = (result, mapMaybe is_used (udfmToList lit_env))+ where+ (result, (_lit_env, used)) = runState m (lit_env, emptyNameSet)++ is_used (k,v)+ | elemUniqSet_Directly k used = Just v+ | otherwise = Nothing++addUsed :: Name -> PmPprM ()+addUsed x = modify (\(negated, used) -> (negated, extendNameSet used x))++checkNegation :: Name -> PmPprM (Maybe SDoc) -- the clean name if it is negated+checkNegation x = do+ negated <- gets fst+ return $ case lookupDNameEnv negated x of+ Just (new, _) -> Just new+ Nothing -> Nothing++-- | Pretty print a pmexpr, but remember to prettify the names of the variables+-- that refer to neg-literals. The ones that cannot be shown are printed as+-- underscores.+pprPmExpr :: PmExpr -> PmPprM SDoc+pprPmExpr (PmExprVar x) = do+ mb_name <- checkNegation x+ case mb_name of+ Just name -> addUsed x >> return name+ Nothing -> return underscore+pprPmExpr (PmExprCon con args) = pprPmExprCon con args+pprPmExpr (PmExprLit l) = return (ppr l)+pprPmExpr (PmExprOther _) = return underscore -- don't show++needsParens :: PmExpr -> Bool+needsParens (PmExprVar {}) = False+needsParens (PmExprLit l) = isNegatedPmLit l+needsParens (PmExprOther {}) = False -- will become a wildcard+needsParens (PmExprCon (RealDataCon c) es)+ | isTupleDataCon c+ || isConsDataCon c || null es = False+ | otherwise = True+needsParens (PmExprCon (PatSynCon _) es) = not (null es)++pprPmExprWithParens :: PmExpr -> PmPprM SDoc+pprPmExprWithParens expr+ | needsParens expr = parens <$> pprPmExpr expr+ | otherwise = pprPmExpr expr++pprPmExprCon :: ConLike -> [PmExpr] -> PmPprM SDoc+pprPmExprCon (RealDataCon con) args+ | isTupleDataCon con = mkTuple <$> mapM pprPmExpr args+ | isConsDataCon con = pretty_list+ where+ mkTuple :: [SDoc] -> SDoc+ mkTuple = parens . fsep . punctuate comma++ -- lazily, to be used in the list case only+ pretty_list :: PmPprM SDoc+ pretty_list = case isNilPmExpr (last list) of+ True -> brackets . fsep . punctuate comma <$> mapM pprPmExpr (init list)+ False -> parens . hcat . punctuate colon <$> mapM pprPmExpr list++ list = list_elements args++ list_elements [x,y]+ | PmExprCon c es <- y, RealDataCon nilDataCon == c+ = ASSERT(null es) [x,y]+ | PmExprCon c es <- y, RealDataCon consDataCon == c+ = x : list_elements es+ | otherwise = [x,y]+ list_elements list = pprPanic "list_elements:" (ppr list)+pprPmExprCon cl args+ | conLikeIsInfix cl = case args of+ [x, y] -> do x' <- pprPmExprWithParens x+ y' <- pprPmExprWithParens y+ return (x' <+> ppr cl <+> y')+ -- can it be infix but have more than two arguments?+ list -> pprPanic "pprPmExprCon:" (ppr list)+ | null args = return (ppr cl)+ | otherwise = do args' <- mapM pprPmExprWithParens args+ return (fsep (ppr cl : args'))++-- | Check whether a literal is negated+isNegatedPmLit :: PmLit -> Bool+isNegatedPmLit (PmOLit b _) = b+isNegatedPmLit _other_lit = False++-- | Check whether a PmExpr is syntactically e+isNilPmExpr :: PmExpr -> Bool+isNilPmExpr (PmExprCon c _) = c == RealDataCon nilDataCon+isNilPmExpr _other_expr = False++-- | Check if a DataCon is (:).+isConsDataCon :: DataCon -> Bool+isConsDataCon con = consDataCon == con
compiler/deSugar/TmOracle.hs view
@@ -1,23 +1,27 @@ {- Author: George Karachalias <george.karachalias@cs.kuleuven.be>--The term equality oracle. The main export of the module is function `tmOracle'. -} {-# LANGUAGE CPP, MultiWayIf #-} +-- | The term equality oracle. The main export of the module are the functions+-- 'tmOracle', 'solveOneEq' and 'addSolveRefutableAltCon'.+--+-- If you are looking for an oracle that can solve type-level constraints, look+-- at 'TcSimplify.tcCheckSatisfiability'. module TmOracle ( -- re-exported from PmExpr- PmExpr(..), PmLit(..), SimpleEq, ComplexEq, PmVarEnv, falsePmExpr,- eqPmLit, filterComplex, isNotPmExprOther, runPmPprM, lhsExprToPmExpr,- hsExprToPmExpr, pprPmExprWithParens,+ PmExpr(..), PmLit(..), PmAltCon(..), TmVarCt(..), TmVarCtEnv,+ PmRefutEnv, eqPmLit, isNotPmExprOther, lhsExprToPmExpr, hsExprToPmExpr, -- the term oracle- tmOracle, TmState, initialTmState, solveOneEq, extendSubst, canDiverge,+ tmOracle, TmState, initialTmState, wrapUpTmState, solveOneEq,+ extendSubst, canDiverge, isRigid,+ addSolveRefutableAltCon, lookupRefutableAltCons, -- misc.- toComplex, exprDeepLookup, pmLitType, flattenPmVarEnv+ exprDeepLookup, pmLitType ) where #include "HsVersions.h"@@ -26,16 +30,19 @@ import PmExpr +import Util import Id import Name import Type import HsLit import TcHsSyn import MonadUtils-import Util+import ListSetOps (insertNoDup, unionLists)+import Maybes import Outputable- import NameEnv+import UniqFM+import UniqDFM {- %************************************************************************@@ -45,202 +52,261 @@ %************************************************************************ -} --- | The type of substitutions.-type PmVarEnv = NameEnv PmExpr+-- | Pretty much a @['TmVarCt']@ association list where the domain is 'Name'+-- instead of 'Id'. This is the type of 'tm_pos', where we store solutions for+-- rigid pattern match variables.+type TmVarCtEnv = NameEnv PmExpr --- | The environment of the oracle contains--- 1. A Bool (are there any constraints we cannot handle? (PmExprOther)).--- 2. A substitution we extend with every step and return as a result.-type TmOracleEnv = (Bool, PmVarEnv)+-- | An environment assigning shapes to variables that immediately lead to a+-- refutation. So, if this maps @x :-> [3]@, then trying to solve a 'TmVarCt'+-- like @x ~ 3@ immediately leads to a contradiction.+-- Determinism is important since we use this for warning messages in+-- 'PmPpr.pprUncovered'. We don't do the same for 'TmVarCtEnv', so that is a plain+-- 'NameEnv'.+--+-- See also Note [Refutable shapes] in TmOracle.+type PmRefutEnv = DNameEnv [PmAltCon] +-- | The state of the term oracle. Tracks all term-level facts of the form "x is+-- @True@" ('tm_pos') and "x is not @5@" ('tm_neg').+--+-- Subject to Note [The Pos/Neg invariant].+data TmState = TmS+ { tm_pos :: !TmVarCtEnv+ -- ^ A substitution with solutions we extend with every step and return as a+ -- result. The substitution is in /triangular form/: It might map @x@ to @y@+ -- where @y@ itself occurs in the domain of 'tm_pos', rendering lookup+ -- non-idempotent. This means that 'varDeepLookup' potentially has to walk+ -- along a chain of var-to-var mappings until we find the solution but has the+ -- advantage that when we update the solution for @y@ above, we automatically+ -- update the solution for @x@ in a union-find-like fashion.+ -- Invariant: Only maps to other variables ('PmExprVar') or to WHNFs+ -- ('PmExprLit', 'PmExprCon'). Ergo, never maps to a 'PmExprOther'.+ , tm_neg :: !PmRefutEnv+ -- ^ Maps each variable @x@ to a list of 'PmAltCon's that @x@ definitely+ -- cannot match. Example, @x :-> [3, 4]@ means that @x@ cannot match a literal+ -- 3 or 4. Should we later solve @x@ to a variable @y@+ -- ('extendSubstAndSolve'), we merge the refutable shapes of @x@ into those of+ -- @y@. See also Note [The Pos/Neg invariant].+ }++{- Note [The Pos/Neg invariant]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+Invariant: In any 'TmState', The domains of 'tm_pos' and 'tm_neg' are disjoint.++For example, it would make no sense to say both+ tm_pos = [...x :-> 3 ...]+ tm_neg = [...x :-> [4,42]... ]+The positive information is strictly more informative than the negative.++Suppose we are adding the (positive) fact @x :-> e@ to 'tm_pos'. Then we must+delete any binding for @x@ from 'tm_neg', to uphold the invariant.++But there is more! Suppose we are adding @x :-> y@ to 'tm_pos', and 'tm_neg'+contains @x :-> cs, y :-> ds@. Then we want to update 'tm_neg' to+@y :-> (cs ++ ds)@, to make use of the negative information we have about @x@.+-}++instance Outputable TmState where+ ppr state = braces (fsep (punctuate comma (pos ++ neg)))+ where+ pos = map pos_eq (nonDetUFMToList (tm_pos state))+ neg = map neg_eq (udfmToList (tm_neg state))+ pos_eq (l, r) = ppr l <+> char '~' <+> ppr r+ neg_eq (l, r) = ppr l <+> char '≁' <+> ppr r++-- | Initial state of the oracle.+initialTmState :: TmState+initialTmState = TmS emptyNameEnv emptyDNameEnv++-- | Wrap up the term oracle's state once solving is complete. Return the+-- flattened 'tm_pos' and 'tm_neg'.+wrapUpTmState :: TmState -> (TmVarCtEnv, PmRefutEnv)+wrapUpTmState solver_state+ = (flattenTmVarCtEnv (tm_pos solver_state), tm_neg solver_state)++-- | Flatten the triangular subsitution.+flattenTmVarCtEnv :: TmVarCtEnv -> TmVarCtEnv+flattenTmVarCtEnv env = mapNameEnv (exprDeepLookup env) env+ -- | Check whether a constraint (x ~ BOT) can succeed, -- given the resulting state of the term oracle. canDiverge :: Name -> TmState -> Bool-canDiverge x (standby, (_unhandled, env))+canDiverge x TmS{ tm_pos = pos, tm_neg = neg } -- If the variable seems not evaluated, there is a possibility for- -- constraint x ~ BOT to be satisfiable.- | PmExprVar y <- varDeepLookup env x -- seems not forced- -- If it is involved (directly or indirectly) in any equality in the- -- worklist, we can assume that it is already indirectly evaluated,- -- as a side-effect of equality checking. If not, then we can assume- -- that the constraint is satisfiable.- = not $ any (isForcedByEq x) standby || any (isForcedByEq y) standby- -- Variable x is already in WHNF so the constraint is non-satisfiable+ -- constraint x ~ BOT to be satisfiable. That's the case when we haven't found+ -- a solution (i.e. some equivalent literal or constructor) for it yet.+ | (_, PmExprVar y) <- varDeepLookup pos x -- seems not forced+ -- Even if we don't have a solution yet, it might be involved in a negative+ -- constraint, in which case we must already have evaluated it earlier.+ , Nothing <- lookupDNameEnv neg y+ = True+ -- Variable x is already in WHNF or we know some refutable shape, so the+ -- constraint is non-satisfiable | otherwise = False - where- isForcedByEq :: Name -> ComplexEq -> Bool- isForcedByEq y (e1, e2) = varIn y e1 || varIn y e2+-- | Check whether the equality @x ~ e@ leads to a refutation. Make sure that+-- @x@ and @e@ are completely substituted before!+isRefutable :: Name -> PmExpr -> PmRefutEnv -> Bool+isRefutable x e env+ = fromMaybe False $ elem <$> exprToAlt e <*> lookupDNameEnv env x --- | Check whether a variable is in the free variables of an expression-varIn :: Name -> PmExpr -> Bool-varIn x e = case e of- PmExprVar y -> x == y- PmExprCon _ es -> any (x `varIn`) es- PmExprLit _ -> False- PmExprEq e1 e2 -> (x `varIn` e1) || (x `varIn` e2)- PmExprOther _ -> False+-- | Solve an equality (top-level).+solveOneEq :: TmState -> TmVarCt -> Maybe TmState+solveOneEq solver_env (TVC x e) = unify solver_env (PmExprVar (idName x), e) --- | Flatten the DAG (Could be improved in terms of performance.).-flattenPmVarEnv :: PmVarEnv -> PmVarEnv-flattenPmVarEnv env = mapNameEnv (exprDeepLookup env) env+exprToAlt :: PmExpr -> Maybe PmAltCon+exprToAlt (PmExprLit l) = Just (PmAltLit l)+exprToAlt _ = Nothing --- | The state of the term oracle (includes complex constraints that cannot--- progress unless we get more information).-type TmState = ([ComplexEq], TmOracleEnv)+-- | Record that a particular 'Id' can't take the shape of a 'PmAltCon' in the+-- 'TmState' and return @Nothing@ if that leads to a contradiction.+addSolveRefutableAltCon :: TmState -> Id -> PmAltCon -> Maybe TmState+addSolveRefutableAltCon original@TmS{ tm_pos = pos, tm_neg = neg } x nalt+ = case exprToAlt e of+ -- We have to take care to preserve Note [The Pos/Neg invariant]+ Nothing -> Just extended -- Not solved yet+ Just alt -- We have a solution+ | alt == nalt -> Nothing -- ... which is contradictory+ | otherwise -> Just original -- ... which is compatible, rendering the+ where -- refutation redundant+ (y, e) = varDeepLookup pos (idName x)+ extended = original { tm_neg = neg' }+ neg' = alterDNameEnv (delNulls (insertNoDup nalt)) neg y --- | Initial state of the oracle.-initialTmState :: TmState-initialTmState = ([], (False, emptyNameEnv))+-- | When updating 'tm_neg', we want to delete any 'null' entries. This adapter+-- intends to provide a suitable interface for 'alterDNameEnv'.+delNulls :: ([a] -> [a]) -> Maybe [a] -> Maybe [a]+delNulls f mb_entry+ | ret@(_:_) <- f (fromMaybe [] mb_entry) = Just ret+ | otherwise = Nothing --- | Solve a complex equality (top-level).-solveOneEq :: TmState -> ComplexEq -> Maybe TmState-solveOneEq solver_env@(_,(_,env)) complex- = solveComplexEq solver_env -- do the actual *merging* with existing state- $ simplifyComplexEq -- simplify as much as you can- $ applySubstComplexEq env complex -- replace everything we already know+-- | Return all 'PmAltCon' shapes that are impossible for 'Id' to take, i.e.+-- would immediately lead to a refutation by the term oracle.+lookupRefutableAltCons :: Id -> TmState -> [PmAltCon]+lookupRefutableAltCons x TmS { tm_neg = neg }+ = fromMaybe [] (lookupDNameEnv neg (idName x)) --- | Solve a complex equality.--- Nothing => definitely unsatisfiable--- Just tms => I have added the complex equality and added--- it to the tmstate; the result may or may not be--- satisfiable-solveComplexEq :: TmState -> ComplexEq -> Maybe TmState-solveComplexEq solver_state@(standby, (unhandled, env)) eq@(e1, e2) = case eq of+-- | Is the given variable /rigid/ (i.e., we have a solution for it) or+-- /flexible/ (i.e., no solution)? Returns the solution if /rigid/. A+-- semantically helpful alias for 'lookupNameEnv'.+isRigid :: TmState -> Name -> Maybe PmExpr+isRigid TmS{ tm_pos = pos } x = lookupNameEnv pos x++-- | @isFlexible tms = isNothing . 'isRigid' tms@+isFlexible :: TmState -> Name -> Bool+isFlexible tms = isNothing . isRigid tms++-- | Try to unify two 'PmExpr's and record the gained knowledge in the+-- 'TmState'.+--+-- Returns @Nothing@ when there's a contradiction. Returns @Just tms@+-- when the constraint was compatible with prior facts, in which case @tms@ has+-- integrated the knowledge from the equality constraint.+unify :: TmState -> (PmExpr, PmExpr) -> Maybe TmState+unify tms eq@(e1, e2) = case eq of -- We cannot do a thing about these cases- (PmExprOther _,_) -> Just (standby, (True, env))- (_,PmExprOther _) -> Just (standby, (True, env))+ (PmExprOther _,_) -> boring+ (_,PmExprOther _) -> boring (PmExprLit l1, PmExprLit l2) -> case eqPmLit l1 l2 of -- See Note [Undecidable Equality for Overloaded Literals]- True -> Just solver_state- False -> Nothing+ True -> boring+ False -> unsat (PmExprCon c1 ts1, PmExprCon c2 ts2)- | c1 == c2 -> foldlM solveComplexEq solver_state (zip ts1 ts2)- | otherwise -> Nothing- (PmExprCon _ [], PmExprEq t1 t2)- | isTruePmExpr e1 -> solveComplexEq solver_state (t1, t2)- | isFalsePmExpr e1 -> Just (eq:standby, (unhandled, env))- (PmExprEq t1 t2, PmExprCon _ [])- | isTruePmExpr e2 -> solveComplexEq solver_state (t1, t2)- | isFalsePmExpr e2 -> Just (eq:standby, (unhandled, env))+ | c1 == c2 -> foldlM unify tms (zip ts1 ts2)+ | otherwise -> unsat (PmExprVar x, PmExprVar y)- | x == y -> Just solver_state- | otherwise -> extendSubstAndSolve x e2 solver_state+ | x == y -> boring - (PmExprVar x, _) -> extendSubstAndSolve x e2 solver_state- (_, PmExprVar x) -> extendSubstAndSolve x e1 solver_state+ -- It's important to handle both rigid cases first, otherwise we get cyclic+ -- substitutions. Cf. 'extendSubstAndSolve' and+ -- @testsuite/tests/pmcheck/should_compile/CyclicSubst.hs@.+ (PmExprVar x, _)+ | Just e1' <- isRigid tms x -> unify tms (e1', e2)+ (_, PmExprVar y)+ | Just e2' <- isRigid tms y -> unify tms (e1, e2')+ (PmExprVar x, PmExprVar y) -> Just (equate x y tms)+ (PmExprVar x, _) -> trySolve x e2 tms+ (_, PmExprVar y) -> trySolve y e1 tms - (PmExprEq _ _, PmExprEq _ _) -> Just (eq:standby, (unhandled, env))+ _ -> WARN( True, text "unify: Catch all" <+> ppr eq)+ boring -- I HATE CATCH-ALLS+ where+ boring = Just tms+ unsat = Nothing - _ -> WARN( True, text "solveComplexEq: Catch all" <+> ppr eq )- Just (standby, (True, env)) -- I HATE CATCH-ALLS+-- | Merges the equivalence classes of @x@ and @y@ by extending the substitution+-- with @x :-> y@.+-- Preconditions: @x /= y@ and both @x@ and @y@ are flexible (cf.+-- 'isFlexible'/'isRigid').+equate :: Name -> Name -> TmState -> TmState+equate x y tms@TmS{ tm_pos = pos, tm_neg = neg }+ = ASSERT( x /= y )+ ASSERT( isFlexible tms x )+ ASSERT( isFlexible tms y )+ tms'+ where+ pos' = extendNameEnv pos x (PmExprVar y)+ -- Be careful to uphold Note [The Pos/Neg invariant] by merging the refuts+ -- of x into those of y+ nalts = fromMaybe [] (lookupDNameEnv neg x)+ neg' = alterDNameEnv (delNulls (unionLists nalts)) neg y+ `delFromDNameEnv` x+ tms' = TmS { tm_pos = pos', tm_neg = neg' } --- | Extend the substitution and solve the (possibly updated) constraints.-extendSubstAndSolve :: Name -> PmExpr -> TmState -> Maybe TmState-extendSubstAndSolve x e (standby, (unhandled, env))- = foldlM solveComplexEq new_incr_state (map simplifyComplexEq changed)+-- | Extend the substitution with a mapping @x: -> e@ if compatible with+-- refutable shapes of @x@ and its solution, reject (@Nothing@) otherwise.+--+-- Precondition: @x@ is flexible (cf. 'isFlexible'/'isRigid').+-- Precondition: @e@ is a 'PmExprCon' or 'PmExprLit'+trySolve:: Name -> PmExpr -> TmState -> Maybe TmState+trySolve x e _tms@TmS{ tm_pos = pos, tm_neg = neg }+ | ASSERT( isFlexible _tms x )+ ASSERT( _is_whnf e )+ isRefutable x e neg+ = Nothing+ | otherwise+ = Just (TmS (extendNameEnv pos x e) (delFromDNameEnv neg x)) where- -- Apply the substitution to the worklist and partition them to the ones- -- that had some progress and the rest. Then, recurse over the ones that- -- had some progress. Careful about performance:- -- See Note [Representation of Term Equalities] in deSugar/Check.hs- (changed, unchanged) = partitionWith (substComplexEq x e) standby- new_incr_state = (unchanged, (unhandled, extendNameEnv env x e))+ _is_whnf PmExprCon{} = True+ _is_whnf PmExprLit{} = True+ _is_whnf _ = False -- | When we know that a variable is fresh, we do not actually have to -- check whether anything changes, we know that nothing does. Hence,--- `extendSubst` simply extends the substitution, unlike what--- `extendSubstAndSolve` does.+-- @extendSubst@ simply extends the substitution, unlike what+-- 'extendSubstAndSolve' does. extendSubst :: Id -> PmExpr -> TmState -> TmState-extendSubst y e (standby, (unhandled, env))+extendSubst y e solver_state@TmS{ tm_pos = pos } | isNotPmExprOther simpl_e- = (standby, (unhandled, extendNameEnv env x simpl_e))- | otherwise = (standby, (True, env))+ = solver_state { tm_pos = extendNameEnv pos x simpl_e }+ | otherwise = solver_state where x = idName y- simpl_e = fst $ simplifyPmExpr $ exprDeepLookup env e---- | Simplify a complex equality.-simplifyComplexEq :: ComplexEq -> ComplexEq-simplifyComplexEq (e1, e2) = (fst $ simplifyPmExpr e1, fst $ simplifyPmExpr e2)---- | Simplify an expression. The boolean indicates if there has been any--- simplification or if the operation was a no-op.-simplifyPmExpr :: PmExpr -> (PmExpr, Bool)--- See Note [Deep equalities]-simplifyPmExpr e = case e of- PmExprCon c ts -> case mapAndUnzip simplifyPmExpr ts of- (ts', bs) -> (PmExprCon c ts', or bs)- PmExprEq t1 t2 -> simplifyEqExpr t1 t2- _other_expr -> (e, False) -- the others are terminals---- | Simplify an equality expression. The equality is given in parts.-simplifyEqExpr :: PmExpr -> PmExpr -> (PmExpr, Bool)--- See Note [Deep equalities]-simplifyEqExpr e1 e2 = case (e1, e2) of- -- Varables- (PmExprVar x, PmExprVar y)- | x == y -> (truePmExpr, True)-- -- Literals- (PmExprLit l1, PmExprLit l2) -> case eqPmLit l1 l2 of- -- See Note [Undecidable Equality for Overloaded Literals]- True -> (truePmExpr, True)- False -> (falsePmExpr, True)-- -- Can potentially be simplified- (PmExprEq {}, _) -> case (simplifyPmExpr e1, simplifyPmExpr e2) of- ((e1', True ), (e2', _ )) -> simplifyEqExpr e1' e2'- ((e1', _ ), (e2', True )) -> simplifyEqExpr e1' e2'- ((e1', False), (e2', False)) -> (PmExprEq e1' e2', False) -- cannot progress- (_, PmExprEq {}) -> case (simplifyPmExpr e1, simplifyPmExpr e2) of- ((e1', True ), (e2', _ )) -> simplifyEqExpr e1' e2'- ((e1', _ ), (e2', True )) -> simplifyEqExpr e1' e2'- ((e1', False), (e2', False)) -> (PmExprEq e1' e2', False) -- cannot progress-- -- Constructors- (PmExprCon c1 ts1, PmExprCon c2 ts2)- | c1 == c2 ->- let (ts1', bs1) = mapAndUnzip simplifyPmExpr ts1- (ts2', bs2) = mapAndUnzip simplifyPmExpr ts2- (tss, _bss) = zipWithAndUnzip simplifyEqExpr ts1' ts2'- worst_case = PmExprEq (PmExprCon c1 ts1') (PmExprCon c2 ts2')- in if | not (or bs1 || or bs2) -> (worst_case, False) -- no progress- | all isTruePmExpr tss -> (truePmExpr, True)- | any isFalsePmExpr tss -> (falsePmExpr, True)- | otherwise -> (worst_case, False)- | otherwise -> (falsePmExpr, True)-- -- We cannot do anything about the rest..- _other_equality -> (original, False)-- where- original = PmExprEq e1 e2 -- reconstruct equality---- | Apply an (un-flattened) substitution to a simple equality.-applySubstComplexEq :: PmVarEnv -> ComplexEq -> ComplexEq-applySubstComplexEq env (e1,e2) = (exprDeepLookup env e1, exprDeepLookup env e2)+ simpl_e = exprDeepLookup pos e --- | Apply an (un-flattened) substitution to a variable.-varDeepLookup :: PmVarEnv -> Name -> PmExpr-varDeepLookup env x- | Just e <- lookupNameEnv env x = exprDeepLookup env e -- go deeper- | otherwise = PmExprVar x -- terminal+-- | Apply an (un-flattened) substitution to a variable and return its+-- representative in the triangular substitution @env@ and the completely+-- substituted expression. The latter may just be the representative wrapped+-- with 'PmExprVar' if we haven't found a solution for it yet.+varDeepLookup :: TmVarCtEnv -> Name -> (Name, PmExpr)+varDeepLookup env x = case lookupNameEnv env x of+ Just (PmExprVar y) -> varDeepLookup env y+ Just e -> (x, exprDeepLookup env e) -- go deeper+ Nothing -> (x, PmExprVar x) -- terminal {-# INLINE varDeepLookup #-} -- | Apply an (un-flattened) substitution to an expression.-exprDeepLookup :: PmVarEnv -> PmExpr -> PmExpr-exprDeepLookup env (PmExprVar x) = varDeepLookup env x+exprDeepLookup :: TmVarCtEnv -> PmExpr -> PmExpr+exprDeepLookup env (PmExprVar x) = snd (varDeepLookup env x) exprDeepLookup env (PmExprCon c es) = PmExprCon c (map (exprDeepLookup env) es)-exprDeepLookup env (PmExprEq e1 e2) = PmExprEq (exprDeepLookup env e1)- (exprDeepLookup env e2) exprDeepLookup _ other_expr = other_expr -- PmExprLit, PmExprOther -- | External interface to the term oracle.-tmOracle :: TmState -> [ComplexEq] -> Maybe TmState+tmOracle :: TmState -> [TmVarCt] -> Maybe TmState tmOracle tm_state eqs = foldlM solveOneEq tm_state eqs -- | Type of a PmLit@@ -248,18 +314,49 @@ pmLitType (PmSLit lit) = hsLitType lit pmLitType (PmOLit _ lit) = overLitType lit -{- Note [Deep equalities]-~~~~~~~~~~~~~~~~~~~~~~~~~-Solving nested equalities is the most difficult part. The general strategy-is the following:+{- Note [Refutable shapes]+~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Equalities of the form (True ~ (e1 ~ e2)) are transformed to just- (e1 ~ e2) and then treated recursively.+Consider a pattern match like - * Equalities of the form (False ~ (e1 ~ e2)) cannot be analyzed unless- we know more about the inner equality (e1 ~ e2). That's exactly what- `simplifyEqExpr' tries to do: It takes e1 and e2 and either returns- truePmExpr, falsePmExpr or (e1' ~ e2') in case it is uncertain. Note- that it is not e but rather e', since it may perform some- simplifications deeper.+ foo x+ | 0 <- x = 42+ | 0 <- x = 43+ | 1 <- x = 44+ | otherwise = 45++This will result in the following initial matching problem:++ PatVec: x (0 <- x)+ ValVec: $tm_y++Where the first line is the pattern vector and the second line is the value+vector abstraction. When we handle the first pattern guard in Check, it will be+desugared to a match of the form++ PatVec: x 0+ ValVec: $tm_y x++In LitVar, this will split the value vector abstraction for `x` into a positive+`PmLit 0` and a negative `PmLit x [0]` value abstraction. While the former is+immediately matched against the pattern vector, the latter (vector value+abstraction `~[0] $tm_y`) is completely uncovered by the clause.++`pmcheck` proceeds by *discarding* the the value vector abstraction involving+the guard to accomodate for the desugaring. But this also discards the valuable+information that `x` certainly is not the literal 0! Consequently, we wouldn't+be able to report the second clause as redundant.++That's a typical example of why we need the term oracle, and in this specific+case, the ability to encode that `x` certainly is not the literal 0. Now the+term oracle can immediately refute the constraint `x ~ 0` generated by the+second clause and report the clause as redundant. After the third clause, the+set of such *refutable* literals is again extended to `[0, 1]`.++In general, we want to store a set of refutable shapes (`PmAltCon`) for each+variable. That's the purpose of the `PmRefutEnv`. `addSolveRefutableAltCon` will+add such a refutable mapping to the `PmRefutEnv` in the term oracles state and+check if causes any immediate contradiction. Whenever we record a solution in+the substitution via `extendSubstAndSolve`, the refutable environment is checked+for any matching refutable `PmAltCon`. -}
compiler/ghci/ByteCodeAsm.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE BangPatterns, CPP, MagicHash, RecordWildCards #-}+{-# LANGUAGE BangPatterns, CPP, DeriveFunctor, MagicHash, RecordWildCards #-} {-# OPTIONS_GHC -optc-DNON_POSIX_SOURCE #-} -- -- (c) The University of Glasgow 2002-2006@@ -33,7 +33,7 @@ import SMRep import DynFlags import Outputable-import Platform+import GHC.Platform import Util import Unique import UniqDSet@@ -224,9 +224,7 @@ | AllocLabel Word16 (Assembler a) | Emit Word16 [Operand] (Assembler a) | NullAsm a--instance Functor Assembler where- fmap = liftM+ deriving (Functor) instance Applicative Assembler where pure = NullAsm
compiler/ghci/ByteCodeGen.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP, MagicHash, RecordWildCards, BangPatterns #-}+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# OPTIONS_GHC -fprof-auto-top #-} --@@ -22,7 +23,7 @@ import BasicTypes import DynFlags import Outputable-import Platform+import GHC.Platform import Name import MkId import Id@@ -1861,7 +1862,7 @@ -- See Note [generating code for top-level string literal bindings]. } -newtype BcM r = BcM (BcM_State -> IO (BcM_State, r))+newtype BcM r = BcM (BcM_State -> IO (BcM_State, r)) deriving (Functor) ioToBc :: IO a -> BcM a ioToBc io = BcM $ \st -> do@@ -1890,9 +1891,6 @@ returnBc :: a -> BcM a returnBc result = BcM $ \st -> (return (st, result))--instance Functor BcM where- fmap = liftM instance Applicative BcM where pure = returnBc
compiler/ghci/GHCi.hs view
@@ -51,7 +51,7 @@ import GhcPrelude import GHCi.Message-#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) import GHCi.Run #endif import GHCi.RemoteTypes@@ -157,7 +157,7 @@ * Note [Remote Template Haskell] in libraries/ghci/GHCi/TH.hs -} -#if !defined(GHCI)+#if !defined(HAVE_INTERNAL_INTERPRETER) needExtInt :: IO a needExtInt = throwIO (InstallationError "this operation requires -fexternal-interpreter")@@ -175,7 +175,7 @@ uninterruptibleMask_ $ do -- Note [uninterruptibleMask_] iservCall iserv msg | otherwise = -- Just run it directly-#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) run msg #else needExtInt@@ -391,7 +391,7 @@ writeIORef iservLookupSymbolCache $! addToUFM cache str p return (Just p) | otherwise =-#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) fmap fromRemotePtr <$> run (LookupSymbol (unpackFS str)) #else needExtInt@@ -642,7 +642,7 @@ | gopt Opt_ExternalInterpreter dflags = throwIO (InstallationError "this operation requires -fno-external-interpreter")-#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) | otherwise = localRef _r #else
compiler/ghci/Linker.hs view
@@ -50,7 +50,7 @@ import qualified Maybes import UniqDSet import FastString-import Platform+import GHC.Platform import SysTools import FileCleanup @@ -343,7 +343,7 @@ -- Add directories to library search paths, this only has an effect -- on Windows. On Unix OSes this function is a NOP.- let all_paths = let paths = takeDirectory (fst $ pgm_c dflags)+ let all_paths = let paths = takeDirectory (pgm_c dflags) : framework_paths ++ lib_paths_base ++ [ takeDirectory dll | DLLPath dll <- libspecs ]@@ -352,8 +352,10 @@ all_paths_env <- addEnvPaths "LD_LIBRARY_PATH" all_paths pathCache <- mapM (addLibrarySearchPath hsc_env) all_paths_env + let merged_specs = mergeStaticObjects cmdline_lib_specs pls1 <- foldM (preloadLib hsc_env lib_paths framework_paths) pls- cmdline_lib_specs+ merged_specs+ maybePutStr dflags "final link ... " ok <- resolveObjs hsc_env @@ -365,6 +367,19 @@ return pls1 +-- | Merge runs of consecutive of 'Objects'. This allows for resolution of+-- cyclic symbol references when dynamically linking. Specifically, we link+-- together all of the static objects into a single shared object, avoiding+-- the issue we saw in #13786.+mergeStaticObjects :: [LibrarySpec] -> [LibrarySpec]+mergeStaticObjects specs = go [] specs+ where+ go :: [FilePath] -> [LibrarySpec] -> [LibrarySpec]+ go accum (Objects objs : rest) = go (objs ++ accum) rest+ go accum@(_:_) rest = Objects (reverse accum) : go [] rest+ go [] (spec:rest) = spec : go [] rest+ go [] [] = []+ {- Note [preload packages] Why do we need to preload packages from the command line? This is an@@ -392,7 +407,7 @@ classifyLdInput :: DynFlags -> FilePath -> IO (Maybe LibrarySpec) classifyLdInput dflags f- | isObjectFilename platform f = return (Just (Object f))+ | isObjectFilename platform f = return (Just (Objects [f])) | isDynLibFilename platform f = return (Just (DLLPath f)) | otherwise = do putLogMsg dflags NoReason SevInfo noSrcSpan@@ -407,8 +422,8 @@ preloadLib hsc_env lib_paths framework_paths pls lib_spec = do maybePutStr dflags ("Loading object " ++ showLS lib_spec ++ " ... ") case lib_spec of- Object static_ish -> do- (b, pls1) <- preload_static lib_paths static_ish+ Objects static_ishs -> do+ (b, pls1) <- preload_statics lib_paths static_ishs maybePutStrLn dflags (if b then "done" else "not found") return pls1 @@ -467,13 +482,13 @@ intercalate "\n" (map (" "++) paths))) -- Not interested in the paths in the static case.- preload_static _paths name- = do b <- doesFileExist name+ preload_statics _paths names+ = do b <- or <$> mapM doesFileExist names if not b then return (False, pls) else if dynamicGhc- then do pls1 <- dynLoadObjs hsc_env pls [name]+ then do pls1 <- dynLoadObjs hsc_env pls names return (True, pls1)- else do loadObj hsc_env name+ else do mapM_ (loadObj hsc_env) names return (True, pls) preload_static_archive _paths name@@ -1123,7 +1138,10 @@ -- We don't do any cleanup when linking objects with the -- dynamic linker. Doing so introduces extra complexity for -- not much benefit.- | otherwise++ -- Code unloading currently disabled due to instability.+ -- See #16841.+ | False -- otherwise = mapM_ (unloadObj hsc_env) [f | DotO f <- linkableUnlinked lnk] -- The components of a BCO linkable may contain -- dot-o files. Which is very confusing.@@ -1131,6 +1149,7 @@ -- But the BCO parts can be unlinked just by -- letting go of them (plus of course depopulating -- the symbol table which is done in the main body)+ | otherwise = return () -- see #16841 {- ********************************************************************** @@ -1139,7 +1158,9 @@ ********************************************************************* -} data LibrarySpec- = Object FilePath -- Full path name of a .o file, including trailing .o+ = Objects [FilePath] -- Full path names of set of .o files, including trailing .o+ -- We allow batched loading to ensure that cyclic symbol+ -- references can be resolved (see #13786). -- For dynamic objects only, try to find the object -- file in all the directories specified in -- v_Library_paths before giving up.@@ -1173,7 +1194,7 @@ ["base", "template-haskell", "editline"] showLS :: LibrarySpec -> String-showLS (Object nm) = "(static) " ++ nm+showLS (Objects nms) = "(static) [" ++ intercalate ", " nms ++ "]" showLS (Archive nm) = "(static archive) " ++ nm showLS (DLL nm) = "(dynamic) " ++ nm showLS (DLLPath nm) = "(dynamic) " ++ nm@@ -1270,7 +1291,8 @@ -- Complication: all the .so's must be loaded before any of the .o's. let known_dlls = [ dll | DLLPath dll <- classifieds ] dlls = [ dll | DLL dll <- classifieds ]- objs = [ obj | Object obj <- classifieds ]+ objs = [ obj | Objects objs <- classifieds+ , obj <- objs ] archs = [ arch | Archive arch <- classifieds ] -- Add directories to library search paths@@ -1478,8 +1500,8 @@ (ArchX86_64, OSSolaris2) -> "64" </> so_name _ -> so_name - findObject = liftM (fmap Object) $ findFile dirs obj_file- findDynObject = liftM (fmap Object) $ findFile dirs dyn_obj_file+ findObject = liftM (fmap $ Objects . (:[])) $ findFile dirs obj_file+ findDynObject = liftM (fmap $ Objects . (:[])) $ findFile dirs dyn_obj_file findArchive = let local name = liftM (fmap Archive) $ findFile dirs name in apply (map local arch_files) findHSDll = liftM (fmap DLLPath) $ findFile dirs hs_dyn_lib_file
compiler/hieFile/HieBin.hs view
@@ -4,6 +4,8 @@ {-# LANGUAGE ScopedTypeVariables #-} module HieBin ( readHieFile, readHieFileWithVersion, HieHeader, writeHieFile, HieName(..), toHieName, HieFileResult(..), hieMagic) where +import GHC.Settings ( maybeRead )+ import Config ( cProjectVersion ) import GhcPrelude import Binary@@ -17,7 +19,6 @@ import PrelInfo import SrcLoc import UniqSupply ( takeUniqFromSupply )-import Util ( maybeRead ) import Unique import UniqFM
compiler/hsSyn/Convert.hs view
@@ -6,6 +6,7 @@ This module converts Template Haskell syntax into HsSyn -} +{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-}@@ -40,7 +41,7 @@ import MonadUtils ( foldrM ) import qualified Data.ByteString as BS-import Control.Monad( unless, liftM, ap )+import Control.Monad( unless, ap ) import Data.Maybe( catMaybes, isNothing ) import Language.Haskell.TH as TH hiding (sigP)@@ -71,6 +72,7 @@ ------------------------------------------------------------------- newtype CvtM a = CvtM { unCvtM :: SrcSpan -> Either MsgDoc (SrcSpan, a) }+ deriving (Functor) -- Push down the source location; -- Can fail, with a single error message @@ -83,9 +85,6 @@ -- In particular, we want it on binding locations, so that variables bound in -- the spliced-in declarations get a location that at least relates to the splice point -instance Functor CvtM where- fmap = liftM- instance Applicative CvtM where pure x = CvtM $ \loc -> Right (loc,x) (<*>) = ap@@ -892,17 +891,11 @@ ; return $ HsLamCase noExt (mkMatchGroup FromSource ms') }- cvt (TupE [e]) = do { e' <- cvtl e; return $ HsPar noExt e' }+ cvt (TupE [Just e]) = do { e' <- cvtl e; return $ HsPar noExt e' } -- Note [Dropping constructors] -- Singleton tuples treated like nothing (just parens)- cvt (TupE es) = do { es' <- mapM cvtl es- ; return $ ExplicitTuple noExt- (map (noLoc . (Present noExt)) es')- Boxed }- cvt (UnboxedTupE es) = do { es' <- mapM cvtl es- ; return $ ExplicitTuple noExt- (map (noLoc . (Present noExt)) es')- Unboxed }+ cvt (TupE es) = cvt_tup es Boxed+ cvt (UnboxedTupE es) = cvt_tup es Unboxed cvt (UnboxedSumE e alt arity) = do { e' <- cvtl e ; unboxedSumChecks alt arity ; return $ ExplicitSum noExt@@ -1013,6 +1006,15 @@ cvtDD (FromThenR x y) = do { x' <- cvtl x; y' <- cvtl y; return $ FromThen x' y' } cvtDD (FromToR x y) = do { x' <- cvtl x; y' <- cvtl y; return $ FromTo x' y' } cvtDD (FromThenToR x y z) = do { x' <- cvtl x; y' <- cvtl y; z' <- cvtl z; return $ FromThenTo x' y' z' }++cvt_tup :: [Maybe Exp] -> Boxity -> CvtM (HsExpr GhcPs)+cvt_tup es boxity = do { let cvtl_maybe Nothing = return missingTupArg+ cvtl_maybe (Just e) = fmap (Present noExt) (cvtl e)+ ; es' <- mapM cvtl_maybe es+ ; return $ ExplicitTuple+ noExt+ (map noLoc es')+ boxity } {- Note [Operator assocation] We must be quite careful about adding parens:
compiler/iface/BinIface.hs view
@@ -42,7 +42,7 @@ import Unique import Outputable import NameCache-import Platform+import GHC.Platform import FastString import Constants import Util
compiler/llvmGen/LlvmCodeGen.hs view
@@ -3,7 +3,7 @@ -- ----------------------------------------------------------------------------- -- | This is the top-level module in the LLVM code generator. ---module LlvmCodeGen ( llvmCodeGen, llvmFixupAsm ) where+module LlvmCodeGen ( LlvmVersion (..), llvmCodeGen, llvmFixupAsm ) where #include "HsVersions.h"
compiler/llvmGen/LlvmCodeGen/Base.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} -- ---------------------------------------------------------------------------- -- | Base LLVM Code Generation module@@ -12,7 +13,7 @@ LiveGlobalRegs, LlvmUnresData, LlvmData, UnresLabel, UnresStatic, - LlvmVersion, supportedLlvmVersion, llvmVersionStr,+ LlvmVersion (..), supportedLlvmVersion, llvmVersionStr, LlvmM, runLlvm, liftStream, withClearVars, varLookup, varInsert,@@ -48,7 +49,7 @@ import FastString import Cmm hiding ( succ ) import Outputable as Outp-import Platform+import GHC.Platform import UniqFM import Unique import BufWrite ( BufHandle )@@ -151,12 +152,12 @@ where platform = targetPlatform dflags isLive r = not (isSSE r) || r `elem` alwaysLive || r `elem` live isPassed r = not (isSSE r) || isLive r- isSSE (FloatReg _) = True- isSSE (DoubleReg _) = True- isSSE (XmmReg _) = True- isSSE (YmmReg _) = True- isSSE (ZmmReg _) = True- isSSE _ = False+ isSSE (FloatReg _) = True+ isSSE (DoubleReg _) = True+ isSSE (XmmReg _ _ _ _ ) = True+ isSSE (YmmReg _ _ _ _ ) = True+ isSSE (ZmmReg _ _ _ _ ) = True+ isSSE _ = False -- | Llvm standard fun attributes llvmStdFunAttrs :: [LlvmFuncAttr]@@ -176,14 +177,25 @@ -- -- | LLVM Version Number-type LlvmVersion = (Int, Int)+data LlvmVersion+ = LlvmVersion Int+ | LlvmVersionOld Int Int+ deriving Eq +-- Custom show instance for backwards compatibility.+instance Show LlvmVersion where+ show (LlvmVersion maj) = show maj+ show (LlvmVersionOld maj min) = show maj ++ "." ++ show min+ -- | The LLVM Version that is currently supported. supportedLlvmVersion :: LlvmVersion-supportedLlvmVersion = sUPPORTED_LLVM_VERSION+supportedLlvmVersion = LlvmVersion sUPPORTED_LLVM_VERSION llvmVersionStr :: LlvmVersion -> String-llvmVersionStr (major, minor) = show major ++ "." ++ show minor+llvmVersionStr v =+ case v of+ LlvmVersion maj -> show maj+ LlvmVersionOld maj min -> show maj ++ "." ++ show min -- ---------------------------------------------------------------------------- -- * Environment Handling@@ -209,10 +221,7 @@ -- | The Llvm monad. Wraps @LlvmEnv@ state as well as the @IO@ monad newtype LlvmM a = LlvmM { runLlvmM :: LlvmEnv -> IO (a, LlvmEnv) }--instance Functor LlvmM where- fmap f m = LlvmM $ \env -> do (x, env') <- runLlvmM m env- return (f x, env')+ deriving (Functor) instance Applicative LlvmM where pure x = LlvmM $ \env -> return (x, env)
compiler/llvmGen/LlvmCodeGen/CodeGen.hs view
@@ -29,7 +29,7 @@ import ForeignCall import Outputable hiding (panic, pprPanic) import qualified Outputable-import Platform+import GHC.Platform import OrdList import UniqSupply import Unique@@ -169,17 +169,25 @@ let s = Fence False SyncSeqCst return (unitOL s, []) +-- | Insert a 'barrier', unless the target platform is in the provided list of+-- exceptions (where no code will be emitted instead).+barrierUnless :: [Arch] -> LlvmM StmtData+barrierUnless exs = do+ platform <- getLlvmPlatform+ if platformArch platform `elem` exs+ then return (nilOL, [])+ else barrier+ -- | Foreign Calls genCall :: ForeignTarget -> [CmmFormal] -> [CmmActual] -> LlvmM StmtData --- Write barrier needs to be handled specially as it is implemented as an LLVM--- intrinsic function.+-- Barriers need to be handled specially as they are implemented as LLVM+-- intrinsic functions.+genCall (PrimTarget MO_ReadBarrier) _ _ =+ barrierUnless [ArchX86, ArchX86_64, ArchSPARC] genCall (PrimTarget MO_WriteBarrier) _ _ = do- platform <- getLlvmPlatform- if platformArch platform `elem` [ArchX86, ArchX86_64, ArchSPARC]- then return (nilOL, [])- else barrier+ barrierUnless [ArchX86, ArchX86_64, ArchSPARC] genCall (PrimTarget MO_Touch) _ _ = return (nilOL, [])@@ -745,7 +753,9 @@ return $ case mop of MO_F32_Exp -> fsLit "expf"+ MO_F32_ExpM1 -> fsLit "expm1f" MO_F32_Log -> fsLit "logf"+ MO_F32_Log1P -> fsLit "log1pf" MO_F32_Sqrt -> fsLit "llvm.sqrt.f32" MO_F32_Fabs -> fsLit "llvm.fabs.f32" MO_F32_Pwr -> fsLit "llvm.pow.f32"@@ -767,7 +777,9 @@ MO_F32_Atanh -> fsLit "atanhf" MO_F64_Exp -> fsLit "exp"+ MO_F64_ExpM1 -> fsLit "expm1" MO_F64_Log -> fsLit "log"+ MO_F64_Log1P -> fsLit "log1p" MO_F64_Sqrt -> fsLit "llvm.sqrt.f64" MO_F64_Fabs -> fsLit "llvm.fabs.f64" MO_F64_Pwr -> fsLit "llvm.pow.f64"@@ -827,6 +839,7 @@ -- We support MO_U_Mul2 through ordinary LLVM mul instruction, see the -- appropriate case of genCall. MO_U_Mul2 {} -> unsupported+ MO_ReadBarrier -> unsupported MO_WriteBarrier -> unsupported MO_Touch -> unsupported MO_UF_Conv _ -> unsupported@@ -1274,6 +1287,7 @@ MO_VU_Quot _ _ -> panicOp MO_VU_Rem _ _ -> panicOp + MO_VF_Broadcast _ _ -> panicOp MO_VF_Insert _ _ -> panicOp MO_VF_Extract _ _ -> panicOp @@ -1470,6 +1484,7 @@ MO_VS_Neg {} -> panicOp + MO_VF_Broadcast {} -> panicOp MO_VF_Insert {} -> panicOp MO_VF_Extract {} -> panicOp @@ -1831,9 +1846,9 @@ let liveRegs = alwaysLive ++ live isSSE (FloatReg _) = True isSSE (DoubleReg _) = True- isSSE (XmmReg _) = True- isSSE (YmmReg _) = True- isSSE (ZmmReg _) = True+ isSSE (XmmReg _ _ _ _) = True+ isSSE (YmmReg _ _ _ _) = True+ isSSE (ZmmReg _ _ _ _) = True isSSE _ = False -- Set to value or "undef" depending on whether the register is
compiler/llvmGen/LlvmCodeGen/Data.hs view
@@ -18,7 +18,7 @@ import CLabel import Cmm import DynFlags-import Platform+import GHC.Platform import FastString import Outputable
compiler/llvmGen/LlvmCodeGen/Regs.hs view
@@ -60,24 +60,24 @@ DoubleReg 4 -> doubleGlobal $ "D4" ++ suf DoubleReg 5 -> doubleGlobal $ "D5" ++ suf DoubleReg 6 -> doubleGlobal $ "D6" ++ suf- XmmReg 1 -> xmmGlobal $ "XMM1" ++ suf- XmmReg 2 -> xmmGlobal $ "XMM2" ++ suf- XmmReg 3 -> xmmGlobal $ "XMM3" ++ suf- XmmReg 4 -> xmmGlobal $ "XMM4" ++ suf- XmmReg 5 -> xmmGlobal $ "XMM5" ++ suf- XmmReg 6 -> xmmGlobal $ "XMM6" ++ suf- YmmReg 1 -> ymmGlobal $ "YMM1" ++ suf- YmmReg 2 -> ymmGlobal $ "YMM2" ++ suf- YmmReg 3 -> ymmGlobal $ "YMM3" ++ suf- YmmReg 4 -> ymmGlobal $ "YMM4" ++ suf- YmmReg 5 -> ymmGlobal $ "YMM5" ++ suf- YmmReg 6 -> ymmGlobal $ "YMM6" ++ suf- ZmmReg 1 -> zmmGlobal $ "ZMM1" ++ suf- ZmmReg 2 -> zmmGlobal $ "ZMM2" ++ suf- ZmmReg 3 -> zmmGlobal $ "ZMM3" ++ suf- ZmmReg 4 -> zmmGlobal $ "ZMM4" ++ suf- ZmmReg 5 -> zmmGlobal $ "ZMM5" ++ suf- ZmmReg 6 -> zmmGlobal $ "ZMM6" ++ suf+ XmmReg 1 _ _ _ -> xmmGlobal $ "XMM1" ++ suf+ XmmReg 2 _ _ _ -> xmmGlobal $ "XMM2" ++ suf+ XmmReg 3 _ _ _ -> xmmGlobal $ "XMM3" ++ suf+ XmmReg 4 _ _ _ -> xmmGlobal $ "XMM4" ++ suf+ XmmReg 5 _ _ _ -> xmmGlobal $ "XMM5" ++ suf+ XmmReg 6 _ _ _ -> xmmGlobal $ "XMM6" ++ suf+ YmmReg 1 _ _ _ -> ymmGlobal $ "YMM1" ++ suf+ YmmReg 2 _ _ _ -> ymmGlobal $ "YMM2" ++ suf+ YmmReg 3 _ _ _ -> ymmGlobal $ "YMM3" ++ suf+ YmmReg 4 _ _ _ -> ymmGlobal $ "YMM4" ++ suf+ YmmReg 5 _ _ _ -> ymmGlobal $ "YMM5" ++ suf+ YmmReg 6 _ _ _ -> ymmGlobal $ "YMM6" ++ suf+ ZmmReg 1 _ _ _ -> zmmGlobal $ "ZMM1" ++ suf+ ZmmReg 2 _ _ _ -> zmmGlobal $ "ZMM2" ++ suf+ ZmmReg 3 _ _ _ -> zmmGlobal $ "ZMM3" ++ suf+ ZmmReg 4 _ _ _ -> zmmGlobal $ "ZMM4" ++ suf+ ZmmReg 5 _ _ _ -> zmmGlobal $ "ZMM5" ++ suf+ ZmmReg 6 _ _ _ -> zmmGlobal $ "ZMM6" ++ suf MachSp -> wordGlobal $ "MachSp" ++ suf _other -> panic $ "LlvmCodeGen.Reg: GlobalReg (" ++ (show reg) ++ ") not supported!"
compiler/llvmGen/LlvmMangler.hs view
@@ -14,7 +14,7 @@ import GhcPrelude import DynFlags ( DynFlags, targetPlatform )-import Platform ( platformArch, Arch(..) )+import GHC.Platform ( platformArch, Arch(..) ) import ErrUtils ( withTiming ) import Outputable ( text )
compiler/main/DriverPipeline.hs view
@@ -56,9 +56,9 @@ import BasicTypes ( SuccessFlag(..) ) import Maybes ( expectJust ) import SrcLoc-import LlvmCodeGen ( llvmFixupAsm )+import LlvmCodeGen ( LlvmVersion (..), llvmFixupAsm ) import MonadUtils-import Platform+import GHC.Platform import TcRnTypes import ToolSettings import Hooks@@ -1190,9 +1190,6 @@ ----------------------------------------------------------------------------- -- Cc phase --- we don't support preprocessing .c files (with -E) now. Doing so introduces--- way too many hacks, and I can't say I've ever used it anyway.- runPhase (RealPhase cc_phase) input_fn dflags | any (cc_phase `eqPhase`) [Cc, Ccxx, HCc, Cobjc, Cobjcxx] = do@@ -1214,6 +1211,16 @@ (includePathsQuote cmdline_include_paths) let include_paths = include_paths_quote ++ include_paths_global + -- pass -D or -optP to preprocessor when compiling foreign C files+ -- (#16737). Doing it in this way is simpler and also enable the C+ -- compiler to performs preprocessing and parsing in a single pass,+ -- but it may introduce inconsistency if a different pgm_P is specified.+ let more_preprocessor_opts = concat+ [ ["-Xpreprocessor", i]+ | not hcc+ , i <- getOpts dflags opt_P+ ]+ let gcc_extra_viac_flags = extraGccViaCFlags dflags let pic_c_flags = picCCOpts dflags @@ -1223,7 +1230,7 @@ -- hc code doesn't not #include any header files anyway, so these -- options aren't necessary. pkg_extra_cc_opts <- liftIO $- if cc_phase `eqPhase` HCc+ if hcc then return [] else getPackageExtraCcOpts dflags pkgs @@ -1305,6 +1312,7 @@ ++ [ "-include", ghcVersionH ] ++ framework_paths ++ include_paths+ ++ more_preprocessor_opts ++ pkg_extra_cc_opts )) @@ -2030,7 +2038,8 @@ getBackendDefs dflags | hscTarget dflags == HscLlvm = do llvmVer <- figureLlvmVersion dflags return $ case llvmVer of- Just n -> [ "-D__GLASGOW_HASKELL_LLVM__=" ++ format n ]+ Just (LlvmVersion n) -> [ "-D__GLASGOW_HASKELL_LLVM__=" ++ format (n,0) ]+ Just (LlvmVersionOld m n) -> [ "-D__GLASGOW_HASKELL_LLVM__=" ++ format (m,n) ] _ -> [] where format (major, minor)
compiler/main/DynamicLoading.hs view
@@ -3,7 +3,7 @@ -- | Dynamically lookup up values from modules and loading them. module DynamicLoading ( initializePlugins,-#if defined(GHCI)+#if defined(HAVE_INTERPRETER) -- * Loading plugins loadFrontendPlugin, @@ -27,7 +27,7 @@ import GhcPrelude import DynFlags -#if defined(GHCI)+#if defined(HAVE_INTERPRETER) import Linker ( linkModule, getHValue ) import GHCi ( wormhole ) import SrcLoc ( noSrcSpan )@@ -76,7 +76,7 @@ -- actual compilation starts. Idempotent operation. Should be re-called if -- pluginModNames or pluginModNameOpts changes. initializePlugins :: HscEnv -> DynFlags -> IO DynFlags-#if !defined(GHCI)+#if !defined(HAVE_INTERPRETER) initializePlugins _ df = do let pluginMods = pluginModNames df unless (null pluginMods) (pluginError pluginMods)@@ -96,7 +96,7 @@ #endif -#if defined(GHCI)+#if defined(HAVE_INTERPRETER) loadPlugins :: HscEnv -> IO [LoadedPlugin] loadPlugins hsc_env
compiler/main/GHC.hs view
@@ -219,6 +219,8 @@ Kind, PredType, ThetaType, pprForAll, pprThetaArrowTy,+ parseInstanceHead,+ getInstancesForType, -- ** Entities TyThing(..),@@ -336,7 +338,7 @@ import Annotations import Module import Panic-import Platform+import GHC.Platform import Bag ( listToBag ) import ErrUtils import MonadUtils
compiler/main/GhcMake.hs view
@@ -267,7 +267,75 @@ load :: GhcMonad m => LoadHowMuch -> m SuccessFlag load how_much = do mod_graph <- depanal [] False- load' how_much (Just batchMsg) mod_graph+ success <- load' how_much (Just batchMsg) mod_graph+ warnUnusedPackages+ pure success++-- Note [Unused packages]+--+-- Cabal passes `--package-id` flag for each direct dependency. But GHC+-- loads them lazily, so when compilation is done, we have a list of all+-- actually loaded packages. All the packages, specified on command line,+-- but never loaded, are probably unused dependencies.++warnUnusedPackages :: GhcMonad m => m ()+warnUnusedPackages = do+ hsc_env <- getSession+ eps <- liftIO $ hscEPS hsc_env++ let dflags = hsc_dflags hsc_env+ pit = eps_PIT eps++ let loadedPackages+ = map (getPackageDetails dflags)+ . nub . sort+ . map moduleUnitId+ . moduleEnvKeys+ $ pit++ requestedArgs = mapMaybe packageArg (packageFlags dflags)++ unusedArgs+ = filter (\arg -> not $ any (matching dflags arg) loadedPackages)+ requestedArgs++ let warn = makeIntoWarning+ (Reason Opt_WarnUnusedPackages)+ (mkPlainErrMsg dflags noSrcSpan msg)+ msg = vcat [ text "The following packages were specified" <+>+ text "via -package or -package-id flags,"+ , text "but were not needed for compilation:"+ , nest 2 (vcat (map (withDash . pprUnusedArg) unusedArgs)) ]++ when (wopt Opt_WarnUnusedPackages dflags && not (null unusedArgs)) $+ logWarnings (listToBag [warn])++ where+ packageArg (ExposePackage _ arg _) = Just arg+ packageArg _ = Nothing++ pprUnusedArg (PackageArg str) = text str+ pprUnusedArg (UnitIdArg uid) = ppr uid++ withDash = (<+>) (text "-")++ matchingStr :: String -> PackageConfig -> Bool+ matchingStr str p+ = str == sourcePackageIdString p+ || str == packageNameString p++ matching :: DynFlags -> PackageArg -> PackageConfig -> Bool+ matching _ (PackageArg str) p = matchingStr str p+ matching dflags (UnitIdArg uid) p = uid == realUnitId dflags p++ -- For wired-in packages, we have to unwire their id,+ -- otherwise they won't match package flags+ realUnitId :: DynFlags -> PackageConfig -> UnitId+ realUnitId dflags+ = unwireUnitId dflags+ . DefiniteUnitId+ . DefUnitId+ . installedPackageConfigId -- | Generalized version of 'load' which also supports a custom -- 'Messager' (for reporting progress) and 'ModuleGraph' (generally
compiler/main/HscMain.hs view
@@ -67,6 +67,7 @@ , hscDecls, hscParseDeclsWithLocation, hscDeclsWithLocation, hscParsedDecls , hscTcExpr, TcRnExprMode(..), hscImport, hscKcType , hscParseExpr+ , hscParseType , hscCompileCoreExpr -- * Low-level exports for hooks , hscCompileCoreExpr'@@ -113,6 +114,7 @@ import TcRnDriver import TcIface ( typecheckIface ) import TcRnMonad+import TcHsSyn ( ZonkFlexi (DefaultFlexi) ) import NameCache ( initNameCache ) import LoadIface ( ifaceStats, initExternalPackageState ) import PrelInfo@@ -147,7 +149,7 @@ import DynFlags import ErrUtils-import Platform ( platformOS, osSubsectionsViaSymbols )+import GHC.Platform ( platformOS, osSubsectionsViaSymbols ) import Outputable import NameEnv@@ -496,6 +498,14 @@ hsc_env <- getHscEnv dflags <- getDynFlags + -- -Wmissing-safe-haskell-mode+ when (not (safeHaskellModeEnabled dflags)+ && wopt Opt_WarnMissingSafeHaskellMode dflags) $+ logWarnings $ unitBag $+ makeIntoWarning (Reason Opt_WarnMissingSafeHaskellMode) $+ mkPlainWarnMsg dflags (getLoc (hpm_module mod)) $+ warnMissingSafeHaskellMode+ tcg_res <- {-# SCC "Typecheck-Rename" #-} ioMsgMaybe $ tcRnModule hsc_env sum@@ -518,7 +528,9 @@ safe <- liftIO $ fst <$> readIORef (tcg_safeInfer tcg_res') when safe $ do case wopt Opt_WarnSafe dflags of- True -> (logWarnings $ unitBag $+ True+ | safeHaskell dflags == Sf_Safe -> return ()+ | otherwise -> (logWarnings $ unitBag $ makeIntoWarning (Reason Opt_WarnSafe) $ mkPlainWarnMsg dflags (warnSafeOnLoc dflags) $ errSafe tcg_res')@@ -540,6 +552,8 @@ errSafe t = quotes (pprMod t) <+> text "has been inferred as safe!" errTwthySafe t = quotes (pprMod t) <+> text "is marked as Trustworthy but has been inferred as safe!"+ warnMissingSafeHaskellMode = ppr (moduleName (ms_mod sum))+ <+> text "is missing Safe Haskell mode" -- | Convert a typechecked module to Core hscDesugar :: HscEnv -> ModSummary -> TcGblEnv -> IO ModGuts@@ -1105,21 +1119,36 @@ let trust = getSafeMode $ mi_trust iface' trust_own_pkg = mi_trust_pkg iface' -- check module is trusted- safeM = trust `elem` [Sf_Safe, Sf_Trustworthy]+ safeM = trust `elem` [Sf_Safe, Sf_SafeInferred, Sf_Trustworthy] -- check package is trusted safeP = packageTrusted dflags trust trust_own_pkg m -- pkg trust reqs pkgRs = S.fromList . map fst $ filter snd $ dep_pkgs $ mi_deps iface'+ -- warn if Safe module imports Safe-Inferred module.+ warns = if wopt Opt_WarnInferredSafeImports dflags+ && safeLanguageOn dflags+ && trust == Sf_SafeInferred+ then inferredImportWarn+ else emptyBag -- General errors we throw but Safe errors we log errs = case (safeM, safeP) of (True, True ) -> emptyBag (True, False) -> pkgTrustErr (False, _ ) -> modTrustErr in do+ logWarnings warns logWarnings errs return (trust == Sf_Trustworthy, pkgRs) where+ inferredImportWarn = unitBag+ $ makeIntoWarning (Reason Opt_WarnInferredSafeImports)+ $ mkErrMsg dflags l (pkgQual dflags)+ $ sep+ [ text "Importing Safe-Inferred module "+ <> ppr (moduleName m)+ <> text " from explicitly Safe module"+ ] pkgTrustErr = unitBag $ mkErrMsg dflags l (pkgQual dflags) $ sep [ ppr (moduleName m) <> text ": Can't be safely imported!"@@ -1142,6 +1171,7 @@ packageTrusted dflags _ _ _ | not (packageTrustOn dflags) = True packageTrusted _ Sf_Safe False _ = True+ packageTrusted _ Sf_SafeInferred False _ = True packageTrusted dflags _ _ m | isHomePkg dflags m = True | otherwise = trusted $ getPackageDetails dflags (moduleUnitId m)@@ -1761,7 +1791,7 @@ hscKcType hsc_env0 normalise str = runInteractiveHsc hsc_env0 $ do hsc_env <- getHscEnv ty <- hscParseType str- ioMsgMaybe $ tcRnType hsc_env normalise ty+ ioMsgMaybe $ tcRnType hsc_env DefaultFlexi normalise ty hscParseExpr :: String -> Hsc (LHsExpr GhcPs) hscParseExpr expr = do
compiler/main/InteractiveEval.hs view
@@ -30,6 +30,8 @@ exprType, typeKind, parseName,+ parseInstanceHead,+ getInstancesForType, getDocs, GetDocsFailure(..), showModule,@@ -102,6 +104,19 @@ import Data.Array import Exception +import TcRnDriver ( runTcInteractive, tcRnType )+import TcHsSyn ( ZonkFlexi (SkolemiseFlexi) )++import TcEnv (tcGetInstEnvs)++import Inst (instDFunType)+import TcSimplify (solveWanteds)+import TcRnMonad+import TcEvidence+import Data.Bifunctor (second)++import TcSMonad (runTcS)+ -- ----------------------------------------------------------------------------- -- running a statement interactively @@ -936,6 +951,161 @@ typeKind :: GhcMonad m => Bool -> String -> m (Type, Kind) typeKind normalise str = withSession $ \hsc_env -> do liftIO $ hscKcType hsc_env normalise str++-- ----------------------------------------------------------------------------+-- Getting the class instances for a type++{-+ Note [Querying instances for a type]++ Here is the implementation of GHC proposal 41.+ (https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0041-ghci-instances.rst)++ The objective is to take a query string representing a (partial) type, and+ report all the class single-parameter class instances available to that type.+ Extending this feature to multi-parameter typeclasses is left as future work.++ The general outline of how we solve this is:++ 1. Parse the type, leaving skolems in the place of type-holes.+ 2. For every class, get a list of all instances that match with the query type.+ 3. For every matching instance, ask GHC for the context the instance dictionary needs.+ 4. Format and present the results, substituting our query into the instance+ and simplifying the context.++ For example, given the query "Maybe Int", we want to return:++ instance Show (Maybe Int)+ instance Read (Maybe Int)+ instance Eq (Maybe Int)+ ....++ [Holes in queries]++ Often times we want to know what instances are available for a polymorphic type,+ like `Maybe a`, and we'd like to return instances such as:++ instance Show a => Show (Maybe a)+ ....++ These queries are expressed using type holes, so instead of `Maybe a` the user writes+ `Maybe _`, we parse the type and during zonking, we skolemise it, replacing the holes+ with (un-named) type variables.++ When zonking the type holes we have two real choices: replace them with Any or replace+ them with skolem typevars. Using skolem type variables ensures that the output is more+ intuitive to end users, and there is no difference in the results between Any and skolems.++-}++-- Find all instances that match a provided type+getInstancesForType :: GhcMonad m => Type -> m [ClsInst]+getInstancesForType ty = withSession $ \hsc_env -> do+ liftIO $ runInteractiveHsc hsc_env $ do+ ioMsgMaybe $ runTcInteractive hsc_env $ do+ matches <- findMatchingInstances ty+ fmap catMaybes . forM matches $ uncurry checkForExistence++-- Parse a type string and turn any holes into skolems+parseInstanceHead :: GhcMonad m => String -> m Type+parseInstanceHead str = withSession $ \hsc_env0 -> do+ (ty, _) <- liftIO $ runInteractiveHsc hsc_env0 $ do+ hsc_env <- getHscEnv+ ty <- hscParseType str+ ioMsgMaybe $ tcRnType hsc_env SkolemiseFlexi True ty++ return ty++-- Get all the constraints required of a dictionary binding+getDictionaryBindings :: PredType -> TcM WantedConstraints+getDictionaryBindings theta = do+ dictName <- newName (mkDictOcc (mkVarOcc "magic"))+ let dict_var = mkVanillaGlobal dictName theta+ loc <- getCtLocM (GivenOrigin UnkSkol) Nothing+ let wCs = mkSimpleWC [CtDerived+ { ctev_pred = varType dict_var+ , ctev_loc = loc+ }]++ return wCs++{-+ When we've found an instance that a query matches against, we still need to+ check that all the instance's constraints are satisfiable. checkForExistence+ creates an instance dictionary and verifies that any unsolved constraints+ mention a type-hole, meaning it is blocked on an unknown.++ If the instance satisfies this condition, then we return it with the query+ substituted into the instance and all constraints simplified, for example given:++ instance D a => C (MyType a b) where++ and the query `MyType _ String`++ the unsolved constraints will be [D _] so we apply the substitution:++ { a -> _; b -> String}++ and return the instance:++ instance D _ => C (MyType _ String)++-}++checkForExistence :: ClsInst -> [DFunInstType] -> TcM (Maybe ClsInst)+checkForExistence res mb_inst_tys = do+ (tys, thetas) <- instDFunType (is_dfun res) mb_inst_tys++ wanteds <- forM thetas getDictionaryBindings+ (residuals, _) <- second evBindMapBinds <$> runTcS (solveWanteds (unionsWC wanteds))++ let all_residual_constraints = bagToList $ wc_simple residuals+ let preds = map ctPred all_residual_constraints+ if all isSatisfiablePred preds && (null $ wc_impl residuals)+ then return . Just $ substInstArgs tys preds res+ else return Nothing++ where++ -- Stricter version of isTyVarClassPred that requires all TyConApps to have at least+ -- one argument or for the head to be a TyVar. The reason is that we want to ensure+ -- that all residual constraints mention a type-hole somewhere in the constraint,+ -- meaning that with the correct choice of a concrete type it could be possible for+ -- the constraint to be discharged.+ isSatisfiablePred :: PredType -> Bool+ isSatisfiablePred ty = case getClassPredTys_maybe ty of+ Just (_, tys@(_:_)) -> all isTyVarTy tys+ _ -> isTyVarTy ty++ empty_subst = mkEmptyTCvSubst (mkInScopeSet (tyCoVarsOfType (idType $ is_dfun res)))++ {- Create a ClsInst with instantiated arguments and constraints.++ The thetas are the list of constraints that couldn't be solved because+ they mention a type-hole.+ -}+ substInstArgs :: [Type] -> [PredType] -> ClsInst -> ClsInst+ substInstArgs tys thetas inst = let+ subst = foldl' (\a b -> uncurry (extendTvSubstAndInScope a) b) empty_subst (zip dfun_tvs tys)+ -- Build instance head with arguments substituted in+ tau = mkClassPred cls (substTheta subst args)+ -- Constrain the instance with any residual constraints+ phi = mkPhiTy thetas tau+ sigma = mkForAllTys (map (\v -> Bndr v Inferred) dfun_tvs) phi++ in inst { is_dfun = (is_dfun inst) { varType = sigma }}+ where+ (dfun_tvs, _, cls, args) = instanceSig inst++-- Find instances where the head unifies with the provided type+findMatchingInstances :: Type -> TcM [(ClsInst, [DFunInstType])]+findMatchingInstances ty = do+ ies@(InstEnvs {ie_global = ie_global, ie_local = ie_local}) <- tcGetInstEnvs+ let allClasses = instEnvClasses ie_global ++ instEnvClasses ie_local++ concat <$> mapM (\cls -> do+ let (matches, _, _) = lookupInstEnv True ies cls [ty]+ return matches) allClasses ----------------------------------------------------------------------------- -- Compile an expression, run it, and deliver the result
compiler/main/StaticPtrTable.hs view
@@ -135,7 +135,7 @@ import Module import Name import Outputable-import Platform+import GHC.Platform import PrelNames import TcEnv (lookupGlobal) import Type
compiler/main/SysTools.hs view
@@ -40,17 +40,19 @@ import GhcPrelude +import GHC.Settings+ import Module import Packages import Config import Outputable import ErrUtils-import Platform-import Util+import GHC.Platform import DynFlags import Fingerprint import ToolSettings +import qualified Data.Map as Map import System.FilePath import System.IO import System.Directory@@ -151,41 +153,29 @@ settingsStr <- readFile settingsFile platformConstantsStr <- readFile platformConstantsFile- mySettings <- case maybeReadFuzzy settingsStr of+ settingsList <- case maybeReadFuzzy settingsStr of Just s -> return s Nothing -> pgmError ("Can't parse " ++ show settingsFile)+ let mySettings = Map.fromList settingsList platformConstants <- case maybeReadFuzzy platformConstantsStr of Just s -> return s Nothing -> pgmError ("Can't parse " ++ show platformConstantsFile)- let getSetting key = case lookup key mySettings of- Just xs -> return $ expandTopDir top_dir xs- Nothing -> pgmError ("No entry for " ++ show key ++ " in " ++ show settingsFile)+ -- See Note [Settings file] for a little more about this file. We're+ -- just partially applying those functions and throwing 'Left's; they're+ -- written in a very portable style to keep ghc-boot light.+ let getSetting key = either pgmError pure $+ getFilePathSetting0 top_dir settingsFile mySettings key+ getToolSetting :: String -> IO String getToolSetting key = expandToolDir mtool_dir <$> getSetting key- getBooleanSetting key = case lookup key mySettings of- Just "YES" -> return True- Just "NO" -> return False- Just xs -> pgmError ("Bad value for " ++ show key ++ ": " ++ show xs)- Nothing -> pgmError ("No entry for " ++ show key ++ " in " ++ show settingsFile)- readSetting key = case lookup key mySettings of- Just xs ->- case maybeRead xs of- Just v -> return v- Nothing -> pgmError ("Failed to read " ++ show key ++ " value " ++ show xs)- Nothing -> pgmError ("No entry for " ++ show key ++ " in " ++ show settingsFile)- crossCompiling <- getBooleanSetting "cross compiling"+ getBooleanSetting :: String -> IO Bool+ getBooleanSetting key = either pgmError pure $+ getBooleanSetting0 settingsFile mySettings key targetPlatformString <- getSetting "target platform string"- targetArch <- readSetting "target arch"- targetOS <- readSetting "target os"- targetWordSize <- readSetting "target word size"- targetUnregisterised <- getBooleanSetting "Unregisterised"- targetHasGnuNonexecStack <- readSetting "target has GNU nonexec stack"- targetHasIdentDirective <- readSetting "target has .ident directive"- targetHasSubsectionsViaSymbols <- readSetting "target has subsections via symbols" tablesNextToCode <- getBooleanSetting "Tables next to code" myExtraGccViaCFlags <- getSetting "GCC extra via C opts" -- On Windows, mingw is distributed with GHC,@@ -194,17 +184,21 @@ -- It would perhaps be nice to be able to override this -- with the settings file, but it would be a little fiddly -- to make that possible, so for now you can't.- gcc_prog <- getToolSetting "C compiler command"- gcc_args_str <- getSetting "C compiler flags"+ cc_prog <- getToolSetting "C compiler command"+ cc_args_str <- getSetting "C compiler flags"+ cxx_args_str <- getSetting "C++ compiler flags" gccSupportsNoPie <- getBooleanSetting "C compiler supports -no-pie" cpp_prog <- getToolSetting "Haskell CPP command" cpp_args_str <- getSetting "Haskell CPP flags"- let unreg_gcc_args = if targetUnregisterised- then ["-DNO_REGS", "-DUSE_MINIINTERPRETER"]- else []- cpp_args= map Option (words cpp_args_str)- gcc_args = map Option (words gcc_args_str- ++ unreg_gcc_args)++ platform <- either pgmError pure $ getTargetPlatform settingsFile mySettings++ let unreg_cc_args = if platformUnregisterised platform+ then ["-DNO_REGS", "-DUSE_MINIINTERPRETER"]+ else []+ cpp_args = map Option (words cpp_args_str)+ cc_args = words cc_args_str ++ unreg_cc_args+ cxx_args = words cxx_args_str ldSupportsCompactUnwind <- getBooleanSetting "ld supports compact unwind" ldSupportsBuildId <- getBooleanSetting "ld supports build-id" ldSupportsFilelist <- getBooleanSetting "ld supports filelist"@@ -236,11 +230,11 @@ -- Other things being equal, as and ld are simply gcc- gcc_link_args_str <- getSetting "C compiler link flags"- let as_prog = gcc_prog- as_args = gcc_args- ld_prog = gcc_prog- ld_args = gcc_args ++ map Option (words gcc_link_args_str)+ cc_link_args_str <- getSetting "C compiler link flags"+ let as_prog = cc_prog+ as_args = map Option cc_args+ ld_prog = cc_prog+ ld_args = map Option (cc_args ++ words cc_link_args_str) -- We just assume on command line lc_prog <- getSetting "LLVM llc command"@@ -249,17 +243,6 @@ let iserv_prog = libexec "ghc-iserv" - let platform = Platform {- platformArch = targetArch,- platformOS = targetOS,- platformWordSize = targetWordSize,- platformUnregisterised = targetUnregisterised,- platformHasGnuNonexecStack = targetHasGnuNonexecStack,- platformHasIdentDirective = targetHasIdentDirective,- platformHasSubsectionsViaSymbols = targetHasSubsectionsViaSymbols,- platformIsCrossCompiling = crossCompiling- }- integerLibrary <- getSetting "integer library" integerLibraryType <- case integerLibrary of "integer-gmp" -> pure IntegerGMP@@ -308,7 +291,7 @@ , toolSettings_pgm_L = unlit_path , toolSettings_pgm_P = (cpp_prog, cpp_args) , toolSettings_pgm_F = ""- , toolSettings_pgm_c = (gcc_prog, gcc_args)+ , toolSettings_pgm_c = cc_prog , toolSettings_pgm_a = (as_prog, as_args) , toolSettings_pgm_l = (ld_prog, ld_args) , toolSettings_pgm_dll = (mkdll_prog,mkdll_args)@@ -325,8 +308,8 @@ , toolSettings_opt_P = [] , toolSettings_opt_P_fingerprint = fingerprint0 , toolSettings_opt_F = []- , toolSettings_opt_c = []- , toolSettings_opt_cxx = []+ , toolSettings_opt_c = cc_args+ , toolSettings_opt_cxx = cxx_args , toolSettings_opt_a = [] , toolSettings_opt_l = [] , toolSettings_opt_windres = []@@ -357,7 +340,7 @@ , sPlatformConstants = platformConstants - , sRawSettings = mySettings+ , sRawSettings = settingsList }
compiler/main/SysTools/ExtraObj.hs view
@@ -17,7 +17,7 @@ import ErrUtils import DynFlags import Packages-import Platform+import GHC.Platform import Outputable import SrcLoc ( noSrcSpan ) import Module
compiler/main/SysTools/Info.hs view
@@ -19,7 +19,7 @@ import System.IO -import Platform+import GHC.Platform import GhcPrelude import SysTools.Process@@ -219,7 +219,7 @@ -- See Note [Run-time linker info]. getCompilerInfo' :: DynFlags -> IO CompilerInfo getCompilerInfo' dflags = do- let (pgm,_) = pgm_c dflags+ let pgm = pgm_c dflags -- Try to grab the info from the process output. parseCompilerInfo _stdo stde _exitc -- Regular GCC
compiler/main/SysTools/Tasks.hs view
@@ -13,7 +13,7 @@ import HscTypes import DynFlags import Outputable-import Platform+import GHC.Platform import Util import Data.Char@@ -23,7 +23,7 @@ import System.Process import GhcPrelude -import LlvmCodeGen.Base (llvmVersionStr, supportedLlvmVersion)+import LlvmCodeGen.Base (LlvmVersion (..), llvmVersionStr, supportedLlvmVersion) import SysTools.Process import SysTools.Info@@ -62,9 +62,9 @@ -- | Run compiler of C-like languages and raw objects (such as gcc or clang). runCc :: Maybe ForeignSrcLang -> DynFlags -> [Option] -> IO () runCc mLanguage dflags args = do- let (p,args0) = pgm_c dflags+ let p = pgm_c dflags args1 = map Option userOpts- args2 = args0 ++ languageOptions ++ args ++ args1+ args2 = languageOptions ++ args ++ args1 -- We take care to pass -optc flags in args1 last to ensure that the -- user can override flags passed by GHC. See #14452. mb_env <- getGccEnv args2@@ -126,12 +126,16 @@ -- -x c option. (languageOptions, userOpts) = case mLanguage of Nothing -> ([], userOpts_c)- Just language -> ([Option "-x", Option languageName], opts) where- (languageName, opts) = case language of- LangCxx -> ("c++", userOpts_cxx)- LangObjc -> ("objective-c", userOpts_c)- LangObjcxx -> ("objective-c++", userOpts_cxx)- _ -> ("c", userOpts_c)+ Just language -> ([Option "-x", Option languageName], opts)+ where+ s = settings dflags+ (languageName, opts) = case language of+ LangC -> ("c", sOpt_c s ++ userOpts_c)+ LangCxx -> ("c++", sOpt_cxx s ++ userOpts_cxx)+ LangObjc -> ("objective-c", userOpts_c)+ LangObjcxx -> ("objective-c++", userOpts_cxx)+ LangAsm -> ("assembler", [])+ RawObject -> ("c", []) -- claim C for lack of a better idea userOpts_c = getOpts dflags opt_c userOpts_cxx = getOpts dflags opt_cxx @@ -196,7 +200,7 @@ ) -- | Figure out which version of LLVM we are running this session-figureLlvmVersion :: DynFlags -> IO (Maybe (Int, Int))+figureLlvmVersion :: DynFlags -> IO (Maybe LlvmVersion) figureLlvmVersion dflags = do let (pgm,opts) = pgm_lc dflags args = filter notNull (map showOpt opts)@@ -218,8 +222,10 @@ vline <- dropWhile (not . isDigit) `fmap` hGetLine pout v <- case span (/= '.') vline of ("",_) -> fail "no digits!"- (x,y) -> return (read x- , read $ takeWhile isDigit $ drop 1 y)+ (x,"") -> return $ LlvmVersion (read x)+ (x,y) -> return $ LlvmVersionOld+ (read x)+ (read $ takeWhile isDigit $ drop 1 y) hClose pin hClose pout@@ -333,7 +339,8 @@ runWindres :: DynFlags -> [Option] -> IO () runWindres dflags args = do- let (gcc, gcc_args) = pgm_c dflags+ let cc = pgm_c dflags+ cc_args = map Option (sOpt_c (settings dflags)) windres = pgm_windres dflags opts = map Option (getOpts dflags opt_windres) quote x = "\"" ++ x ++ "\""@@ -341,8 +348,7 @@ -- spaces then windres fails to run gcc. We therefore need -- to tell it what command to use... Option ("--preprocessor=" ++- unwords (map quote (gcc :- map showOpt gcc_args +++ unwords (map quote (cc : map showOpt opts ++ ["-E", "-xc", "-DRC_INVOKED"]))) -- ...but if we do that then if windres calls popen then@@ -351,7 +357,7 @@ -- See #1828. : Option "--use-temp-file" : args- mb_env <- getGccEnv gcc_args+ mb_env <- getGccEnv cc_args runSomethingFiltered dflags id "Windres" windres args' Nothing mb_env touch :: DynFlags -> String -> String -> IO ()
compiler/main/TidyPgm.hs view
@@ -4,10 +4,10 @@ \section{Tidying up Core} -} -{-# LANGUAGE CPP, ViewPatterns #-}+{-# LANGUAGE CPP, DeriveFunctor, ViewPatterns #-} module TidyPgm (- mkBootModDetailsTc, tidyProgram, globaliseAndTidyId+ mkBootModDetailsTc, tidyProgram ) where #include "HsVersions.h"@@ -39,13 +39,11 @@ import MkId ( mkDictSelRhs ) import IdInfo import InstEnv-import FamInstEnv import Type ( tidyTopType ) import Demand ( appIsBottom, isTopSig, isBottomingSig ) import BasicTypes import Name hiding (varName) import NameSet-import NameEnv import NameCache import Avail import IfaceEnv@@ -60,6 +58,7 @@ import Maybes import UniqSupply import Outputable+import Util( filterOut ) import qualified ErrUtils as Err import Control.Monad@@ -149,65 +148,78 @@ Err.withTiming (pure dflags) (text "CoreTidy"<+>brackets (ppr this_mod)) (const ()) $- do { let { insts' = map (tidyClsInstDFun globaliseAndTidyId) insts- ; pat_syns' = map (tidyPatSynIds globaliseAndTidyId) pat_syns- ; type_env1 = mkBootTypeEnv (availsToNameSet exports)- (typeEnvIds type_env) tcs fam_insts- ; type_env2 = extendTypeEnvWithPatSyns pat_syns' type_env1- ; dfun_ids = map instanceDFunId insts'- ; type_env' = extendTypeEnvWithIds type_env2 dfun_ids- }- ; return (ModDetails { md_types = type_env'- , md_insts = insts'- , md_fam_insts = fam_insts- , md_rules = []- , md_anns = []- , md_exports = exports- , md_complete_sigs = complete_sigs- })- }+ return (ModDetails { md_types = type_env'+ , md_insts = insts'+ , md_fam_insts = fam_insts+ , md_rules = []+ , md_anns = []+ , md_exports = exports+ , md_complete_sigs = complete_sigs+ }) where dflags = hsc_dflags hsc_env -mkBootTypeEnv :: NameSet -> [Id] -> [TyCon] -> [FamInst] -> TypeEnv-mkBootTypeEnv exports ids tcs fam_insts- = tidyTypeEnv True $- typeEnvFromEntities final_ids tcs fam_insts- where- -- Find the LocalIds in the type env that are exported- -- Make them into GlobalIds, and tidy their types- --- -- It's very important to remove the non-exported ones- -- because we don't tidy the OccNames, and if we don't remove- -- the non-exported ones we'll get many things with the- -- same name in the interface file, giving chaos.- --- -- Do make sure that we keep Ids that are already Global.- -- When typechecking an .hs-boot file, the Ids come through as- -- GlobalIds.- final_ids = [ (if isLocalId id then globaliseAndTidyId id- else id)- `setIdUnfolding` BootUnfolding- | id <- ids+ -- Find the LocalIds in the type env that are exported+ -- Make them into GlobalIds, and tidy their types+ --+ -- It's very important to remove the non-exported ones+ -- because we don't tidy the OccNames, and if we don't remove+ -- the non-exported ones we'll get many things with the+ -- same name in the interface file, giving chaos.+ --+ -- Do make sure that we keep Ids that are already Global.+ -- When typechecking an .hs-boot file, the Ids come through as+ -- GlobalIds.+ final_ids = [ globaliseAndTidyBootId id+ | id <- typeEnvIds type_env , keep_it id ] - -- default methods have their export flag set, but everything- -- else doesn't (yet), because this is pre-desugaring, so we- -- must test both.- keep_it id = isExportedId id || idName id `elemNameSet` exports+ final_tcs = filterOut (isWiredInName . getName) tcs+ -- See Note [Drop wired-in things]+ type_env1 = typeEnvFromEntities final_ids final_tcs fam_insts+ insts' = mkFinalClsInsts type_env1 insts+ pat_syns' = mkFinalPatSyns type_env1 pat_syns+ type_env' = extendTypeEnvWithPatSyns pat_syns' type_env1 + -- Default methods have their export flag set (isExportedId),+ -- but everything else doesn't (yet), because this is+ -- pre-desugaring, so we must test against the exports too.+ keep_it id | isWiredInName id_name = False+ -- See Note [Drop wired-in things]+ | isExportedId id = True+ | id_name `elemNameSet` exp_names = True+ | otherwise = False+ where+ id_name = idName id + exp_names = availsToNameSet exports -globaliseAndTidyId :: Id -> Id--- Takes a LocalId with an External Name,+lookupFinalId :: TypeEnv -> Id -> Id+lookupFinalId type_env id+ = case lookupTypeEnv type_env (idName id) of+ Just (AnId id') -> id'+ _ -> pprPanic "lookup_final_id" (ppr id)++mkFinalClsInsts :: TypeEnv -> [ClsInst] -> [ClsInst]+mkFinalClsInsts env = map (updateClsInstDFun (lookupFinalId env))++mkFinalPatSyns :: TypeEnv -> [PatSyn] -> [PatSyn]+mkFinalPatSyns env = map (updatePatSynIds (lookupFinalId env))++extendTypeEnvWithPatSyns :: [PatSyn] -> TypeEnv -> TypeEnv+extendTypeEnvWithPatSyns tidy_patsyns type_env+ = extendTypeEnvList type_env [AConLike (PatSynCon ps) | ps <- tidy_patsyns ]++globaliseAndTidyBootId :: Id -> Id+-- For a LocalId with an External Name, -- makes it into a GlobalId -- * unchanged Name (might be Internal or External) -- * unchanged details--- * VanillaIdInfo (makes a conservative assumption about Caf-hood)-globaliseAndTidyId id- = Id.setIdType (globaliseId id) tidy_type- where- tidy_type = tidyTopType (idType id)+-- * VanillaIdInfo (makes a conservative assumption about Caf-hood and arity)+-- * BootUnfolding (see Note [Inlining and hs-boot files] in ToIface)+globaliseAndTidyBootId id+ = globaliseId id `setIdType` tidyTopType (idType id)+ `setIdUnfolding` BootUnfolding {- ************************************************************************@@ -335,13 +347,7 @@ do { let { omit_prags = gopt Opt_OmitInterfacePragmas dflags ; expose_all = gopt Opt_ExposeAllUnfoldings dflags ; print_unqual = mkPrintUnqualified dflags rdr_env- }-- ; let { type_env = typeEnvFromEntities [] tcs fam_insts-- ; implicit_binds- = concatMap getClassImplicitBinds (typeEnvClasses type_env) ++- concatMap getTyConImplicitBinds (typeEnvTyCons type_env)+ ; implicit_binds = concatMap getImplicitBinds tcs } ; (unfold_env, tidy_occ_env)@@ -353,30 +359,6 @@ ; (tidy_env, tidy_binds) <- tidyTopBinds hsc_env mod unfold_env tidy_occ_env trimmed_binds - ; let { final_ids = [ id | id <- bindersOfBinds tidy_binds,- isExternalName (idName id)]- ; type_env1 = extendTypeEnvWithIds type_env final_ids-- ; tidy_cls_insts = map (tidyClsInstDFun (tidyVarOcc tidy_env)) cls_insts- -- A DFunId will have a binding in tidy_binds, and so will now be in- -- tidy_type_env, replete with IdInfo. Its name will be unchanged since- -- it was born, but we want Global, IdInfo-rich (or not) DFunId in the- -- tidy_cls_insts. Similarly the Ids inside a PatSyn.-- ; tidy_rules = tidyRules tidy_env trimmed_rules- -- You might worry that the tidy_env contains IdInfo-rich stuff- -- and indeed it does, but if omit_prags is on, ext_rules is- -- empty-- -- Tidy the Ids inside each PatSyn, very similarly to DFunIds- -- and then override the PatSyns in the type_env with the new tidy ones- -- This is really the only reason we keep mg_patsyns at all; otherwise- -- they could just stay in type_env- ; tidy_patsyns = map (tidyPatSynIds (tidyVarOcc tidy_env)) patsyns- ; type_env2 = extendTypeEnvWithPatSyns tidy_patsyns type_env1-- ; tidy_type_env = tidyTypeEnv omit_prags type_env2- } -- See Note [Grand plan for static forms] in StaticPtrTable. ; (spt_entries, tidy_binds') <- sptCreateStaticBinds hsc_env mod tidy_binds@@ -388,20 +370,44 @@ HscInterpreted -> id -- otherwise add a C stub to do so _ -> (`appendStubC` spt_init_code)- } - ; let { -- See Note [Injecting implicit bindings]+ -- The completed type environment is gotten from+ -- a) the types and classes defined here (plus implicit things)+ -- b) adding Ids with correct IdInfo, including unfoldings,+ -- gotten from the bindings+ -- From (b) we keep only those Ids with External names;+ -- the CoreTidy pass makes sure these are all and only+ -- the externally-accessible ones+ -- This truncates the type environment to include only the+ -- exported Ids and things needed from them, which saves space+ --+ -- See Note [Don't attempt to trim data types]+ ; final_ids = [ if omit_prags then trimId id else id+ | id <- bindersOfBinds tidy_binds+ , isExternalName (idName id)+ , not (isWiredInName (getName id))+ ] -- See Note [Drop wired-in things]++ ; final_tcs = filterOut (isWiredInName . getName) tcs+ -- See Note [Drop wired-in things]+ ; type_env = typeEnvFromEntities final_ids final_tcs fam_insts+ ; tidy_cls_insts = mkFinalClsInsts type_env cls_insts+ ; tidy_patsyns = mkFinalPatSyns type_env patsyns+ ; tidy_type_env = extendTypeEnvWithPatSyns tidy_patsyns type_env+ ; tidy_rules = tidyRules tidy_env trimmed_rules++ ; -- See Note [Injecting implicit bindings] all_tidy_binds = implicit_binds ++ tidy_binds' -- Get the TyCons to generate code for. Careful! We must use- -- the untidied TypeEnv here, because we need+ -- the untidied TyCons here, because we need -- (a) implicit TyCons arising from types and classes defined -- in this module -- (b) wired-in TyCons, which are normally removed from the -- TypeEnv we put in the ModDetails -- (c) Constructors even if they are not exported (the -- tidied TypeEnv has trimmed these away)- ; alg_tycons = filter isAlgTyCon (typeEnvTyCons type_env)+ ; alg_tycons = filter isAlgTyCon tcs } ; endPassIO hsc_env print_unqual CoreTidy all_tidy_binds tidy_rules@@ -444,46 +450,19 @@ where dflags = hsc_dflags hsc_env -tidyTypeEnv :: Bool -- Compiling without -O, so omit prags- -> TypeEnv -> TypeEnv---- The completed type environment is gotten from--- a) the types and classes defined here (plus implicit things)--- b) adding Ids with correct IdInfo, including unfoldings,--- gotten from the bindings--- From (b) we keep only those Ids with External names;--- the CoreTidy pass makes sure these are all and only--- the externally-accessible ones--- This truncates the type environment to include only the--- exported Ids and things needed from them, which saves space------ See Note [Don't attempt to trim data types]--tidyTypeEnv omit_prags type_env- = let- type_env1 = filterNameEnv (not . isWiredInName . getName) type_env- -- (1) remove wired-in things- type_env2 | omit_prags = mapNameEnv trimThing type_env1- | otherwise = type_env1- -- (2) trimmed if necessary- in- type_env2- ---------------------------trimThing :: TyThing -> TyThing--- Trim off inessentials, for boot files and no -O-trimThing (AnId id)- | not (isImplicitId id)- = AnId (id `setIdInfo` vanillaIdInfo)--trimThing other_thing- = other_thing+trimId :: Id -> Id+trimId id+ | not (isImplicitId id)+ = id `setIdInfo` vanillaIdInfo+ | otherwise+ = id -extendTypeEnvWithPatSyns :: [PatSyn] -> TypeEnv -> TypeEnv-extendTypeEnvWithPatSyns tidy_patsyns type_env- = extendTypeEnvList type_env [AConLike (PatSynCon ps) | ps <- tidy_patsyns ]+{- Note [Drop wired-in things]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+We never put wired-in TyCons or Ids in an interface file.+They are wired-in, so the compiler knows about them already. -{- Note [Don't attempt to trim data types] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For some time GHC tried to avoid exporting the data constructors@@ -565,8 +544,15 @@ See Note [Data constructor workers] in CorePrep. -} +getImplicitBinds :: TyCon -> [CoreBind]+getImplicitBinds tc = cls_binds ++ getTyConImplicitBinds tc+ where+ cls_binds = maybe [] getClassImplicitBinds (tyConClass_maybe tc)+ getTyConImplicitBinds :: TyCon -> [CoreBind]-getTyConImplicitBinds tc = map get_defn (mapMaybe dataConWrapId_maybe (tyConDataCons tc))+getTyConImplicitBinds tc+ | isNewTyCon tc = [] -- See Note [Compulsory newtype unfolding] in MkId+ | otherwise = map get_defn (mapMaybe dataConWrapId_maybe (tyConDataCons tc)) getClassImplicitBinds :: Class -> [CoreBind] getClassImplicitBinds cls@@ -751,9 +737,7 @@ -- we don't want to record these as free vars -> (VarSet, [Var]) -- Input State: (set, list) of free vars so far -> ((VarSet,[Var]),a)) -- Output state--instance Functor DFFV where- fmap = liftM+ deriving (Functor) instance Applicative DFFV where pure a = DFFV $ \_ st -> (st, a)@@ -1301,7 +1285,48 @@ In particular CorePrep expands Integer and Natural literals. So in the prediction code here we resort to applying the same expansion (cvt_literal).-Ugh!+There are also numberous other ways in which we can introduce inconsistencies+between CorePrep and TidyPgm. See Note [CAFfyness inconsistencies due to eta+expansion in TidyPgm] for one such example.++Ugh! What ugliness we hath wrought.+++Note [CAFfyness inconsistencies due to eta expansion in TidyPgm]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+Eta expansion during CorePrep can have non-obvious negative consequences on+the CAFfyness computation done by TidyPgm (see Note [Disgusting computation of+CafRefs] in TidyPgm). This late expansion happens/happened for a few reasons:++ * CorePrep previously eta expanded unsaturated primop applications, as+ described in Note [Primop wrappers]).++ * CorePrep still does eta expand unsaturated data constructor applications.++In particular, consider the program:++ data Ty = Ty (RealWorld# -> (# RealWorld#, Int #))++ -- Is this CAFfy?+ x :: STM Int+ x = Ty (retry# @Int)++Consider whether x is CAFfy. One might be tempted to answer "no".+Afterall, f obviously has no CAF references and the application (retry#+@Int) is essentially just a variable reference at runtime.++However, when CorePrep expanded the unsaturated application of 'retry#'+it would rewrite this to++ x = \u []+ let sat = retry# @Int+ in Ty sat++This is now a CAF. Failing to handle this properly was the cause of+#16846. We fixed this by eliminating the need to eta expand primops, as+described in Note [Primop wrappers]), However we have not yet done the same for+data constructor applications.+ -} type CafRefEnv = (VarEnv Id, LitNumType -> Integer -> Maybe CoreExpr)
compiler/nativeGen/AsmCodeGen.hs view
@@ -6,7 +6,8 @@ -- -- ----------------------------------------------------------------------------- -{-# LANGUAGE BangPatterns, CPP, GADTs, ScopedTypeVariables, PatternSynonyms #-}+{-# LANGUAGE BangPatterns, CPP, GADTs, ScopedTypeVariables, PatternSynonyms,+ DeriveFunctor #-} #if !defined(GHC_LOADED_INTO_GHCI) {-# LANGUAGE UnboxedTuples #-}@@ -59,7 +60,7 @@ import AsmUtils import TargetReg-import Platform+import GHC.Platform import BlockLayout import Config import Instruction@@ -1038,13 +1039,11 @@ {-# COMPLETE OptMResult #-} #else -data OptMResult a = OptMResult !a ![CLabel]+data OptMResult a = OptMResult !a ![CLabel] deriving (Functor) #endif newtype CmmOptM a = CmmOptM (DynFlags -> Module -> [CLabel] -> OptMResult a)--instance Functor CmmOptM where- fmap = liftM+ deriving (Functor) instance Applicative CmmOptM where pure x = CmmOptM $ \_ _ imports -> OptMResult x imports
compiler/nativeGen/Dwarf.hs view
@@ -12,7 +12,7 @@ import DynFlags import Module import Outputable-import Platform+import GHC.Platform import Unique import UniqSupply
compiler/nativeGen/Dwarf/Constants.hs view
@@ -7,7 +7,7 @@ import AsmUtils import FastString-import Platform+import GHC.Platform import Outputable import Reg
compiler/nativeGen/Dwarf/Types.hs view
@@ -30,7 +30,7 @@ import Encoding import FastString import Outputable-import Platform+import GHC.Platform import Unique import Reg import SrcLoc
compiler/nativeGen/Format.hs view
@@ -10,9 +10,11 @@ -- module Format ( Format(..),+ ScalarFormat(..), intFormat, floatFormat, isFloatFormat,+ isVecFormat, cmmTypeFormat, formatToWidth, formatInBytes@@ -25,6 +27,29 @@ import Cmm import Outputable ++-- Note [GHC's data format representations]+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+--+-- GHC has severals types that represent various aspects of data format.+-- These include:+--+-- * 'CmmType.CmmType': The data classification used throughout the C--+-- pipeline. This is a pair of a CmmCat and a Width.+--+-- * 'CmmType.CmmCat': What the bits in a C-- value mean (e.g. a pointer, integer, or floating-point value)+--+-- * 'CmmType.Width': The width of a C-- value.+--+-- * 'CmmType.Length': The width (measured in number of scalars) of a vector value.+--+-- * 'Format.Format': The data format representation used by much of the backend.+--+-- * 'Format.ScalarFormat': The format of a 'Format.VecFormat'\'s scalar.+--+-- * 'RegClass.RegClass': Whether a register is an integer, float-point, or vector register+--+ -- It looks very like the old MachRep, but it's now of purely local -- significance, here in the native code generator. You can change it -- without global consequences.@@ -47,8 +72,16 @@ | II64 | FF32 | FF64+ | VecFormat !Length !ScalarFormat !Width deriving (Show, Eq) +data ScalarFormat = FmtInt8+ | FmtInt16+ | FmtInt32+ | FmtInt64+ | FmtFloat+ | FmtDouble+ deriving (Show, Eq) -- | Get the integer format of this width. intFormat :: Width -> Format@@ -81,13 +114,33 @@ FF64 -> True _ -> False +-- | Check if a format represents a vector+isVecFormat :: Format -> Bool+isVecFormat (VecFormat {}) = True+isVecFormat _ = False -- | Convert a Cmm type to a Format. cmmTypeFormat :: CmmType -> Format cmmTypeFormat ty | isFloatType ty = floatFormat (typeWidth ty)+ | isVecType ty = vecFormat ty | otherwise = intFormat (typeWidth ty) +vecFormat :: CmmType -> Format+vecFormat ty =+ let l = vecLength ty+ elemTy = vecElemType ty+ in if isFloatType elemTy+ then case typeWidth elemTy of+ W32 -> VecFormat l FmtFloat W32+ W64 -> VecFormat l FmtDouble W64+ _ -> pprPanic "Incorrect vector element width" (ppr elemTy)+ else case typeWidth elemTy of+ W8 -> VecFormat l FmtInt8 W8+ W16 -> VecFormat l FmtInt16 W16+ W32 -> VecFormat l FmtInt32 W32+ W64 -> VecFormat l FmtInt64 W64+ _ -> pprPanic "Incorrect vector element width" (ppr elemTy) -- | Get the Width of a Format. formatToWidth :: Format -> Width@@ -99,7 +152,7 @@ II64 -> W64 FF32 -> W32 FF64 -> W64-+ VecFormat l _ w -> widthFromBytes (l*widthInBytes w) formatInBytes :: Format -> Int formatInBytes = widthInBytes . formatToWidth
compiler/nativeGen/Instruction.hs view
@@ -23,7 +23,7 @@ import Hoopl.Label import DynFlags import Cmm hiding (topInfoTable)-import Platform+import GHC.Platform -- | Holds a list of source and destination registers used by a -- particular instruction.
compiler/nativeGen/NCGMonad.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} -- ----------------------------------------------------------------------------- --@@ -59,7 +60,7 @@ import DynFlags import Module -import Control.Monad ( liftM, ap )+import Control.Monad ( ap ) import Instruction import Outputable (SDoc, pprPanic, ppr)@@ -113,6 +114,7 @@ type DwarfFiles = UniqFM (FastString, Int) newtype NatM result = NatM (NatM_State -> (result, NatM_State))+ deriving (Functor) unNat :: NatM a -> NatM_State -> (a, NatM_State) unNat (NatM a) = a@@ -138,9 +140,6 @@ initNat init_st m = case unNat m init_st of { (r,st) -> (r,st) } -instance Functor NatM where- fmap = liftM- instance Applicative NatM where pure = returnNat (<*>) = ap@@ -250,7 +249,6 @@ = do u <- getUniqueNat dflags <- getDynFlags return (RegVirtual $ targetMkVirtualReg (targetPlatform dflags) u rep)- getNewRegPairNat :: Format -> NatM (Reg,Reg) getNewRegPairNat rep
compiler/nativeGen/PIC.hs view
@@ -54,7 +54,7 @@ import qualified X86.Instr as X86 -import Platform+import GHC.Platform import Instruction import Reg import NCGMonad
compiler/nativeGen/PPC/CodeGen.hs view
@@ -41,7 +41,7 @@ import RegClass import Reg import TargetReg-import Platform+import GHC.Platform -- Our intermediate code: import BlockId@@ -1123,6 +1123,8 @@ -> [CmmFormal] -- where to put the result -> [CmmActual] -- arguments (of mixed type) -> NatM InstrBlock+genCCall (PrimTarget MO_ReadBarrier) _ _+ = return $ unitOL LWSYNC genCCall (PrimTarget MO_WriteBarrier) _ _ = return $ unitOL LWSYNC @@ -1907,6 +1909,8 @@ FF32 -> (1, 1, 4, fprs) FF64 -> (2, 1, 8, fprs) II64 -> panic "genCCall' passArguments II64"+ VecFormat {}+ -> panic "genCCall' passArguments vector format" GCP32ELF -> case cmmTypeFormat rep of@@ -1917,6 +1921,8 @@ FF32 -> (0, 1, 4, fprs) FF64 -> (0, 1, 8, fprs) II64 -> panic "genCCall' passArguments II64"+ VecFormat {}+ -> panic "genCCall' passArguments vector format" GCP64ELF _ -> case cmmTypeFormat rep of II8 -> (1, 0, 8, gprs)@@ -1928,6 +1934,8 @@ -- the FPRs. FF32 -> (1, 1, 8, fprs) FF64 -> (1, 1, 8, fprs)+ VecFormat {}+ -> panic "genCCall' passArguments vector format" moveResult reduceToFF32 = case dest_regs of@@ -1955,7 +1963,9 @@ where (functionName, reduce) = case mop of MO_F32_Exp -> (fsLit "exp", True)+ MO_F32_ExpM1 -> (fsLit "expm1", True) MO_F32_Log -> (fsLit "log", True)+ MO_F32_Log1P -> (fsLit "log1p", True) MO_F32_Sqrt -> (fsLit "sqrt", True) MO_F32_Fabs -> unsupported @@ -1977,7 +1987,9 @@ MO_F32_Atanh -> (fsLit "atanh", True) MO_F64_Exp -> (fsLit "exp", False)+ MO_F64_ExpM1 -> (fsLit "expm1", False) MO_F64_Log -> (fsLit "log", False)+ MO_F64_Log1P -> (fsLit "log1p", False) MO_F64_Sqrt -> (fsLit "sqrt", False) MO_F64_Fabs -> unsupported @@ -2026,6 +2038,7 @@ MO_AddIntC {} -> unsupported MO_SubIntC {} -> unsupported MO_U_Mul2 {} -> unsupported+ MO_ReadBarrier -> unsupported MO_WriteBarrier -> unsupported MO_Touch -> unsupported MO_Prefetch_Data _ -> unsupported
compiler/nativeGen/PPC/Instr.hs view
@@ -43,7 +43,7 @@ import FastString import CLabel import Outputable-import Platform+import GHC.Platform import UniqFM (listToUFM, lookupUFM) import UniqSupply
compiler/nativeGen/PPC/Ppr.hs view
@@ -29,8 +29,8 @@ import CLabel import PprCmmExpr () -import Unique ( pprUniqueAlways, getUnique )-import Platform+import Unique ( getUnique )+import GHC.Platform import FastString import Outputable import DynFlags@@ -168,10 +168,7 @@ = case r of RegReal (RealRegSingle i) -> ppr_reg_no i RegReal (RealRegPair{}) -> panic "PPC.pprReg: no reg pairs on this arch"- RegVirtual (VirtualRegI u) -> text "%vI_" <> pprUniqueAlways u- RegVirtual (VirtualRegHi u) -> text "%vHi_" <> pprUniqueAlways u- RegVirtual (VirtualRegF u) -> text "%vF_" <> pprUniqueAlways u- RegVirtual (VirtualRegD u) -> text "%vD_" <> pprUniqueAlways u+ RegVirtual v -> ppr v where ppr_reg_no :: Int -> SDoc@@ -190,7 +187,8 @@ II32 -> sLit "w" II64 -> sLit "d" FF32 -> sLit "fs"- FF64 -> sLit "fd")+ FF64 -> sLit "fd"+ VecFormat _ _ _ -> panic "PPC.Ppr.pprFormat: VecFormat") pprCond :: Cond -> SDoc@@ -375,6 +373,7 @@ II64 -> sLit "d" FF32 -> sLit "fs" FF64 -> sLit "fd"+ VecFormat _ _ _ -> panic "PPC.Ppr.pprInstr: VecFormat" ), case addr of AddrRegImm _ _ -> empty AddrRegReg _ _ -> char 'x',@@ -414,6 +413,7 @@ II64 -> sLit "d" FF32 -> sLit "fs" FF64 -> sLit "fd"+ VecFormat _ _ _ -> panic "PPC.Ppr.pprInstr: VecFormat" ), case addr of AddrRegImm _ _ -> empty AddrRegReg _ _ -> char 'x',
compiler/nativeGen/PPC/Regs.hs view
@@ -63,7 +63,7 @@ import CodeGen.Platform import DynFlags import Outputable-import Platform+import GHC.Platform import Data.Word ( Word8, Word16, Word32, Word64 ) import Data.Int ( Int8, Int16, Int32, Int64 )
compiler/nativeGen/PprBase.hs view
@@ -28,7 +28,7 @@ import DynFlags import FastString import Outputable-import Platform+import GHC.Platform import FileCleanup import qualified Data.Array.Unsafe as U ( castSTUArray )
compiler/nativeGen/Reg.hs view
@@ -56,6 +56,7 @@ | VirtualRegHi {-# UNPACK #-} !Unique -- High part of 2-word register | VirtualRegF {-# UNPACK #-} !Unique | VirtualRegD {-# UNPACK #-} !Unique+ | VirtualRegVec {-# UNPACK #-} !Unique deriving (Eq, Show) @@ -69,6 +70,7 @@ compare (VirtualRegHi a) (VirtualRegHi b) = nonDetCmpUnique a b compare (VirtualRegF a) (VirtualRegF b) = nonDetCmpUnique a b compare (VirtualRegD a) (VirtualRegD b) = nonDetCmpUnique a b+ compare (VirtualRegVec a) (VirtualRegVec b) = nonDetCmpUnique a b compare VirtualRegI{} _ = LT compare _ VirtualRegI{} = GT@@ -76,7 +78,8 @@ compare _ VirtualRegHi{} = GT compare VirtualRegF{} _ = LT compare _ VirtualRegF{} = GT-+ compare VirtualRegVec{} _ = LT+ compare _ VirtualRegVec{} = GT instance Uniquable VirtualReg where@@ -86,6 +89,7 @@ VirtualRegHi u -> u VirtualRegF u -> u VirtualRegD u -> u+ VirtualRegVec u -> u instance Outputable VirtualReg where ppr reg@@ -95,8 +99,9 @@ -- this code is kinda wrong on x86 -- because float and double occupy the same register set -- namely SSE2 register xmm0 .. xmm15- VirtualRegF u -> text "%vFloat_" <> pprUniqueAlways u- VirtualRegD u -> text "%vDouble_" <> pprUniqueAlways u+ VirtualRegF u -> text "%vFloat_" <> pprUniqueAlways u+ VirtualRegD u -> text "%vDouble_" <> pprUniqueAlways u+ VirtualRegVec u -> text "%vVec_" <> pprUniqueAlways u @@ -107,6 +112,7 @@ VirtualRegHi _ -> VirtualRegHi u VirtualRegF _ -> VirtualRegF u VirtualRegD _ -> VirtualRegD u+ VirtualRegVec _ -> VirtualRegVec u classOfVirtualReg :: VirtualReg -> RegClass@@ -116,6 +122,8 @@ VirtualRegHi{} -> RcInteger VirtualRegF{} -> RcFloat VirtualRegD{} -> RcDouble+ -- Below is an awful, largely x86-specific hack+ VirtualRegVec{} -> RcDouble
compiler/nativeGen/RegAlloc/Graph/Main.hs view
@@ -21,7 +21,7 @@ import Bag import DynFlags import Outputable-import Platform+import GHC.Platform import UniqFM import UniqSet import UniqSupply
compiler/nativeGen/RegAlloc/Graph/Spill.hs view
@@ -23,7 +23,7 @@ import UniqSet import UniqSupply import Outputable-import Platform+import GHC.Platform import Data.List import Data.Maybe
compiler/nativeGen/RegAlloc/Graph/SpillClean.hs view
@@ -41,7 +41,7 @@ import Unique import State import Outputable-import Platform+import GHC.Platform import Hoopl.Collections import Data.List
compiler/nativeGen/RegAlloc/Graph/SpillCost.hs view
@@ -28,7 +28,7 @@ import UniqSet import Digraph (flattenSCCs) import Outputable-import Platform+import GHC.Platform import State import CFG
compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs view
@@ -16,7 +16,7 @@ import GraphBase import UniqSet-import Platform+import GHC.Platform import Panic -- trivColorable ---------------------------------------------------------------@@ -192,7 +192,6 @@ exclusions = count3 < cALLOCATABLE_REGS_DOUBLE-
compiler/nativeGen/RegAlloc/Linear/FreeRegs.hs view
@@ -2,6 +2,7 @@ module RegAlloc.Linear.FreeRegs ( FR(..),+ allFreeRegs, maxSpillSlots ) @@ -16,7 +17,7 @@ import DynFlags import Panic-import Platform+import GHC.Platform -- ----------------------------------------------------------------------------- -- The free register set@@ -68,6 +69,10 @@ frGetFreeRegs = \_ -> SPARC.getFreeRegs frInitFreeRegs = SPARC.initFreeRegs frReleaseReg = SPARC.releaseReg++-- | For debugging output.+allFreeRegs :: FR freeRegs => Platform -> freeRegs -> [RealReg]+allFreeRegs plat fr = foldMap (\rcls -> frGetFreeRegs plat rcls fr) allRegClasses maxSpillSlots :: DynFlags -> Int maxSpillSlots dflags
compiler/nativeGen/RegAlloc/Linear/Main.hs view
@@ -130,7 +130,7 @@ import UniqFM import UniqSupply import Outputable-import Platform+import GHC.Platform import Data.Maybe import Data.List@@ -884,8 +884,10 @@ $ vcat [ text "allocating vreg: " <> text (show r) , text "assignment: " <> ppr assig- , text "freeRegs: " <> text (show freeRegs)- , text "initFreeRegs: " <> text (show (frInitFreeRegs platform `asTypeOf` freeRegs)) ]+ , text "freeRegs: " <> text (showRegs freeRegs)+ , text "initFreeRegs: " <> text (showRegs (frInitFreeRegs platform `asTypeOf` freeRegs))+ ]+ where showRegs = show . map (\reg -> (reg, targetClassOfRealReg platform reg)) . allFreeRegs platform result
compiler/nativeGen/RegAlloc/Linear/PPC/FreeRegs.hs view
@@ -9,7 +9,7 @@ import Reg import Outputable-import Platform+import GHC.Platform import Data.Word import Data.Bits
compiler/nativeGen/RegAlloc/Linear/SPARC/FreeRegs.hs view
@@ -11,7 +11,7 @@ import CodeGen.Platform import Outputable-import Platform+import GHC.Platform import Data.Word import Data.Bits
compiler/nativeGen/RegAlloc/Linear/State.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, PatternSynonyms #-}+{-# LANGUAGE CPP, PatternSynonyms, DeriveFunctor #-} #if !defined(GHC_LOADED_INTO_GHCI) {-# LANGUAGE UnboxedTuples #-}@@ -50,7 +50,7 @@ import Unique import UniqSupply -import Control.Monad (liftM, ap)+import Control.Monad (ap) -- Avoids using unboxed tuples when loading into GHCi #if !defined(GHC_LOADED_INTO_GHCI)@@ -63,15 +63,14 @@ #else data RA_Result freeRegs a = RA_Result {-# UNPACK #-} !(RA_State freeRegs) !a+ deriving (Functor) #endif -- | The register allocator monad type. newtype RegM freeRegs a = RegM { unReg :: RA_State freeRegs -> RA_Result freeRegs a }--instance Functor (RegM freeRegs) where- fmap = liftM+ deriving (Functor) instance Applicative (RegM freeRegs) where pure a = RegM $ \s -> RA_Result s a
compiler/nativeGen/RegAlloc/Linear/X86/FreeRegs.hs view
@@ -9,7 +9,7 @@ import RegClass import Reg import Panic-import Platform+import GHC.Platform import Data.Word import Data.Bits
compiler/nativeGen/RegAlloc/Linear/X86_64/FreeRegs.hs view
@@ -9,7 +9,7 @@ import RegClass import Reg import Panic-import Platform+import GHC.Platform import Data.Word import Data.Bits
compiler/nativeGen/RegAlloc/Liveness.hs view
@@ -51,7 +51,7 @@ import DynFlags import MonadUtils import Outputable-import Platform+import GHC.Platform import UniqSet import UniqFM import UniqSupply
compiler/nativeGen/RegClass.hs view
@@ -1,15 +1,14 @@ -- | An architecture independent description of a register's class. module RegClass- ( RegClass (..) )--where+ ( RegClass(..)+ , allRegClasses+ ) where import GhcPrelude import Outputable import Unique - -- | The class of a register. -- Used in the register allocator. -- We treat all registers in a class as being interchangable.@@ -18,15 +17,19 @@ = RcInteger | RcFloat | RcDouble- deriving Eq+ deriving (Eq, Show) +allRegClasses :: [RegClass]+allRegClasses =+ [ RcInteger, RcFloat, RcDouble ] + instance Uniquable RegClass where getUnique RcInteger = mkRegClassUnique 0 getUnique RcFloat = mkRegClassUnique 1 getUnique RcDouble = mkRegClassUnique 2 instance Outputable RegClass where- ppr RcInteger = Outputable.text "I"- ppr RcFloat = Outputable.text "F"- ppr RcDouble = Outputable.text "D"+ ppr RcInteger = Outputable.text "I"+ ppr RcFloat = Outputable.text "F"+ ppr RcDouble = Outputable.text "D"
compiler/nativeGen/SPARC/CodeGen.hs view
@@ -59,7 +59,7 @@ import FastString import OrdList import Outputable-import Platform+import GHC.Platform import Control.Monad ( mapAndUnzipM ) @@ -401,6 +401,8 @@ -- -- In the SPARC case we don't need a barrier. --+genCCall (PrimTarget MO_ReadBarrier) _ _+ = return $ nilOL genCCall (PrimTarget MO_WriteBarrier) _ _ = return $ nilOL @@ -616,7 +618,9 @@ outOfLineMachOp_table mop = case mop of MO_F32_Exp -> fsLit "expf"+ MO_F32_ExpM1 -> fsLit "expm1f" MO_F32_Log -> fsLit "logf"+ MO_F32_Log1P -> fsLit "log1pf" MO_F32_Sqrt -> fsLit "sqrtf" MO_F32_Fabs -> unsupported MO_F32_Pwr -> fsLit "powf"@@ -638,7 +642,9 @@ MO_F32_Atanh -> fsLit "atanhf" MO_F64_Exp -> fsLit "exp"+ MO_F64_ExpM1 -> fsLit "expm1" MO_F64_Log -> fsLit "log"+ MO_F64_Log1P -> fsLit "log1p" MO_F64_Sqrt -> fsLit "sqrt" MO_F64_Fabs -> unsupported MO_F64_Pwr -> fsLit "pow"@@ -687,6 +693,7 @@ MO_AddIntC {} -> unsupported MO_SubIntC {} -> unsupported MO_U_Mul2 {} -> unsupported+ MO_ReadBarrier -> unsupported MO_WriteBarrier -> unsupported MO_Touch -> unsupported (MO_Prefetch_Data _) -> unsupported
compiler/nativeGen/SPARC/CodeGen/Base.hs view
@@ -26,7 +26,7 @@ import DynFlags import Cmm import PprCmmExpr ()-import Platform+import GHC.Platform import Outputable import OrdList
compiler/nativeGen/SPARC/Instr.hs view
@@ -46,7 +46,7 @@ import Cmm import FastString import Outputable-import Platform+import GHC.Platform -- | Register or immediate
compiler/nativeGen/SPARC/Ppr.hs view
@@ -45,9 +45,8 @@ import Hoopl.Label import Hoopl.Collections -import Unique ( pprUniqueAlways ) import Outputable-import Platform+import GHC.Platform import FastString -- -----------------------------------------------------------------------------@@ -148,12 +147,7 @@ pprReg reg = case reg of RegVirtual vr- -> case vr of- VirtualRegI u -> text "%vI_" <> pprUniqueAlways u- VirtualRegHi u -> text "%vHi_" <> pprUniqueAlways u- VirtualRegF u -> text "%vF_" <> pprUniqueAlways u- VirtualRegD u -> text "%vD_" <> pprUniqueAlways u-+ -> ppr vr RegReal rr -> case rr of@@ -221,7 +215,8 @@ II32 -> sLit "" II64 -> sLit "d" FF32 -> sLit ""- FF64 -> sLit "d")+ FF64 -> sLit "d"+ VecFormat _ _ _ -> panic "SPARC.Ppr.pprFormat: VecFormat") -- | Pretty print a format for an instruction suffix.@@ -235,7 +230,8 @@ II32 -> sLit "" II64 -> sLit "x" FF32 -> sLit ""- FF64 -> sLit "d")+ FF64 -> sLit "d"+ VecFormat _ _ _ -> panic "SPARC.Ppr.pprFormat: VecFormat")
compiler/nativeGen/SPARC/Regs.hs view
@@ -104,7 +104,6 @@ VirtualRegD{} -> 1 _other -> 0 - {-# INLINE realRegSqueeze #-} realRegSqueeze :: RegClass -> RealReg -> Int @@ -133,7 +132,6 @@ | otherwise -> 1 RealRegPair{} -> 1- -- | All the allocatable registers in the machine, -- including register pairs.
compiler/nativeGen/TargetReg.hs view
@@ -29,7 +29,7 @@ import Outputable import Unique-import Platform+import GHC.Platform import qualified X86.Regs as X86 import qualified X86.RegInfo as X86
compiler/nativeGen/X86/CodeGen.hs view
@@ -54,7 +54,7 @@ import CFG import Format import Reg-import Platform+import GHC.Platform -- Our intermediate code: import BasicTypes@@ -111,13 +111,26 @@ ArchX86 -> return True _ -> panic "trying to generate x86/x86_64 on the wrong platform" +sse4_1Enabled :: NatM Bool+sse4_1Enabled = do+ dflags <- getDynFlags+ return (isSse4_1Enabled dflags) sse4_2Enabled :: NatM Bool sse4_2Enabled = do dflags <- getDynFlags return (isSse4_2Enabled dflags) +sseEnabled :: NatM Bool+sseEnabled = do+ dflags <- getDynFlags+ return (isSseEnabled dflags) +avxEnabled :: NatM Bool+avxEnabled = do+ dflags <- getDynFlags+ return (isAvxEnabled dflags)+ cmmTopCodeGen :: RawCmmDecl -> NatM [NatCmmDecl (Alignment, CmmStatics) Instr]@@ -215,6 +228,7 @@ CmmAssign reg src | isFloatType ty -> assignReg_FltCode format reg src | is32Bit && isWord64 ty -> assignReg_I64Code reg src+ | isVecType ty -> assignReg_VecCode format reg src | otherwise -> assignReg_IntCode format reg src where ty = cmmRegType dflags reg format = cmmTypeFormat ty@@ -222,6 +236,7 @@ CmmStore addr src | isFloatType ty -> assignMem_FltCode format addr src | is32Bit && isWord64 ty -> assignMem_I64Code addr src+ | isVecType ty -> assignMem_VecCode format addr src | otherwise -> assignMem_IntCode format addr src where ty = cmmExprType dflags src format = cmmTypeFormat ty@@ -308,6 +323,15 @@ -- platform. Hence ... +getVecRegisterReg :: Platform -> Bool -> Format -> CmmReg -> Reg+getVecRegisterReg _ use_avx format (CmmLocal (LocalReg u pk))+ | isVecType pk && use_avx = RegVirtual (mkVirtualReg u format)+ | otherwise = pprPanic+ (unlines ["avx flag is not enabled" ,+ "or this is not a vector register"])+ (ppr pk)+getVecRegisterReg platform _use_avx _format c = getRegisterReg platform c+ -- | Memory addressing modes passed up the tree. data Amode = Amode AddrMode InstrBlock@@ -503,6 +527,13 @@ --------------------------------------------------------------------------------++-- This is a helper data type which helps reduce the code duplication for+-- the code generation of arithmetic operations. This is not specifically+-- targetted for any particular type like Int8, Int32 etc+data VectorArithInstns = VA_Add | VA_Sub | VA_Mul | VA_Div++ getRegister :: CmmExpr -> NatM Register getRegister e = do dflags <- getDynFlags is32Bit <- is32BitPlatform@@ -520,16 +551,24 @@ do reg' <- getPicBaseNat (archWordFormat is32Bit) return (Fixed (archWordFormat is32Bit) reg' nilOL) _ ->- do- let- fmt = cmmTypeFormat (cmmRegType dflags reg)- format = fmt- --- let platform = targetPlatform dflags- return (Fixed format- (getRegisterReg platform reg)- nilOL)+ do use_sse2 <- sse2Enabled+ use_avx <- avxEnabled+ let cmmregtype = cmmRegType dflags reg+ if isVecType cmmregtype+ then return (vectorRegister cmmregtype use_avx use_sse2)+ else return (standardRegister cmmregtype)+ where+ vectorRegister :: CmmType -> Bool -> Bool -> Register+ vectorRegister reg_ty use_avx use_sse2+ | use_avx || use_sse2 =+ let vecfmt = cmmTypeFormat reg_ty+ platform = targetPlatform dflags+ in (Fixed vecfmt (getVecRegisterReg platform True vecfmt reg) nilOL)+ | otherwise = panic "Please enable the -mavx or -msse2 flag" + standardRegister crt =+ let platform = targetPlatform dflags+ in (Fixed (cmmTypeFormat crt) (getRegisterReg platform reg) nilOL) getRegister' dflags is32Bit (CmmRegOff r n) = getRegister' dflags is32Bit $ mangleIndexTree dflags r n@@ -631,7 +670,69 @@ return $ Any II64 (\dst -> unitOL $ LEA II64 (OpAddr (ripRel (litToImm displacement))) (OpReg dst)) +getRegister' _ _ (CmmMachOp mop [x, y, z]) = do -- ternary MachOps+ sse4_1 <- sse4_1Enabled+ sse2 <- sse2Enabled+ sse <- sseEnabled+ case mop of+ MO_VF_Insert l W32 | sse4_1 && sse -> vector_float_pack l W32 x y z+ | otherwise+ -> sorry "Please enable the -msse4 and -msse flag"+ MO_VF_Insert l W64 | sse2 && sse -> vector_float_pack l W64 x y z+ | otherwise+ -> sorry "Please enable the -msse2 and -msse flag"+ _other -> incorrectOperands+ where+ vector_float_pack :: Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_pack len W32 expr1 expr2 (CmmLit offset)+ = do+ fn <- getAnyReg expr1+ (r, exp) <- getSomeReg expr2+ let f = VecFormat len FmtFloat W32+ imm = litToImm offset+ code dst = exp `appOL`+ (fn dst) `snocOL`+ (INSERTPS f (OpImm imm) (OpReg r) dst)+ in return $ Any f code+ vector_float_pack len W64 expr1 expr2 (CmmLit offset)+ = do+ Amode addr addr_code <- getAmode expr2+ (r, exp) <- getSomeReg expr1++ -- fn <- getAnyReg expr1+ -- (r, exp) <- getSomeReg expr2+ let f = VecFormat len FmtDouble W64+ code dst+ = case offset of+ CmmInt 0 _ -> exp `appOL` addr_code `snocOL`+ (MOVL f (OpAddr addr) (OpReg r)) `snocOL`+ (MOVU f (OpReg r) (OpReg dst))+ CmmInt 16 _ -> exp `appOL` addr_code `snocOL`+ (MOVH f (OpAddr addr) (OpReg r)) `snocOL`+ (MOVU f (OpReg r) (OpReg dst))+ _ -> panic "Error in offset while packing"+ -- code dst+ -- = case offset of+ -- CmmInt 0 _ -> exp `appOL`+ -- (fn dst) `snocOL`+ -- (MOVL f (OpReg r) (OpReg dst))+ -- CmmInt 16 _ -> exp `appOL`+ -- (fn dst) `snocOL`+ -- (MOVH f (OpReg r) (OpReg dst))+ -- _ -> panic "Error in offset while packing"+ in return $ Any f code+ vector_float_pack _ _ _ c _+ = pprPanic "Pack not supported for : " (ppr c)+ getRegister' dflags is32Bit (CmmMachOp mop [x]) = do -- unary MachOps+ sse2 <- sse2Enabled+ sse <- sseEnabled+ avx <- avxEnabled case mop of MO_F_Neg w -> sse2NegCode w x @@ -708,24 +809,29 @@ MO_FS_Conv from to -> coerceFP2Int from to x MO_SF_Conv from to -> coerceInt2FP from to x - MO_V_Insert {} -> needLlvm- MO_V_Extract {} -> needLlvm- MO_V_Add {} -> needLlvm- MO_V_Sub {} -> needLlvm- MO_V_Mul {} -> needLlvm- MO_VS_Quot {} -> needLlvm- MO_VS_Rem {} -> needLlvm- MO_VS_Neg {} -> needLlvm- MO_VU_Quot {} -> needLlvm- MO_VU_Rem {} -> needLlvm- MO_VF_Insert {} -> needLlvm- MO_VF_Extract {} -> needLlvm- MO_VF_Add {} -> needLlvm- MO_VF_Sub {} -> needLlvm- MO_VF_Mul {} -> needLlvm- MO_VF_Quot {} -> needLlvm- MO_VF_Neg {} -> needLlvm+ MO_V_Insert {} -> needLlvm+ MO_V_Extract {} -> needLlvm+ MO_V_Add {} -> needLlvm+ MO_V_Sub {} -> needLlvm+ MO_V_Mul {} -> needLlvm+ MO_VS_Quot {} -> needLlvm+ MO_VS_Rem {} -> needLlvm+ MO_VS_Neg {} -> needLlvm+ MO_VU_Quot {} -> needLlvm+ MO_VU_Rem {} -> needLlvm+ MO_VF_Broadcast {} -> incorrectOperands+ MO_VF_Insert {} -> incorrectOperands+ MO_VF_Extract {} -> incorrectOperands+ MO_VF_Add {} -> incorrectOperands+ MO_VF_Sub {} -> incorrectOperands+ MO_VF_Mul {} -> incorrectOperands+ MO_VF_Quot {} -> incorrectOperands + MO_VF_Neg l w | avx -> vector_float_negate_avx l w x+ | sse && sse2 -> vector_float_negate_sse l w x+ | otherwise+ -> sorry "Please enable the -mavx or -msse, -msse2 flag"+ _other -> pprPanic "getRegister" (pprMachOp mop) where triv_ucode :: (Format -> Operand -> Instr) -> Format -> NatM Register@@ -762,8 +868,45 @@ = do e_code <- getRegister' dflags is32Bit expr return (swizzleRegisterRep e_code new_format) + vector_float_negate_avx :: Length -> Width -> CmmExpr -> NatM Register+ vector_float_negate_avx l w expr = do+ tmp <- getNewRegNat (VecFormat l FmtFloat w)+ (reg, exp) <- getSomeReg expr+ Amode addr addr_code <- memConstant (mkAlignment $ widthInBytes W32) (CmmFloat 0.0 W32)+ let format = case w of+ W32 -> VecFormat l FmtFloat w+ W64 -> VecFormat l FmtDouble w+ _ -> pprPanic "Cannot negate vector of width" (ppr w)+ code dst = case w of+ W32 -> exp `appOL` addr_code `snocOL`+ (VBROADCAST format addr tmp) `snocOL`+ (VSUB format (OpReg reg) tmp dst)+ W64 -> exp `appOL` addr_code `snocOL`+ (MOVL format (OpAddr addr) (OpReg tmp)) `snocOL`+ (MOVH format (OpAddr addr) (OpReg tmp)) `snocOL`+ (VSUB format (OpReg reg) tmp dst)+ _ -> pprPanic "Cannot negate vector of width" (ppr w)+ return (Any format code) + vector_float_negate_sse :: Length -> Width -> CmmExpr -> NatM Register+ vector_float_negate_sse l w expr = do+ tmp <- getNewRegNat (VecFormat l FmtFloat w)+ (reg, exp) <- getSomeReg expr+ let format = case w of+ W32 -> VecFormat l FmtFloat w+ W64 -> VecFormat l FmtDouble w+ _ -> pprPanic "Cannot negate vector of width" (ppr w)+ code dst = exp `snocOL`+ (XOR format (OpReg tmp) (OpReg tmp)) `snocOL`+ (MOVU format (OpReg tmp) (OpReg dst)) `snocOL`+ (SUB format (OpReg reg) (OpReg dst))+ return (Any format code)+ getRegister' _ is32Bit (CmmMachOp mop [x, y]) = do -- dyadic MachOps+ sse4_1 <- sse4_1Enabled+ sse2 <- sse2Enabled+ sse <- sseEnabled+ avx <- avxEnabled case mop of MO_F_Eq _ -> condFltReg is32Bit EQQ x y MO_F_Ne _ -> condFltReg is32Bit NE x y@@ -828,14 +971,50 @@ MO_VS_Quot {} -> needLlvm MO_VS_Rem {} -> needLlvm MO_VS_Neg {} -> needLlvm- MO_VF_Insert {} -> needLlvm- MO_VF_Extract {} -> needLlvm- MO_VF_Add {} -> needLlvm- MO_VF_Sub {} -> needLlvm- MO_VF_Mul {} -> needLlvm- MO_VF_Quot {} -> needLlvm- MO_VF_Neg {} -> needLlvm + MO_VF_Broadcast l W32 | avx -> vector_float_broadcast_avx l W32 x y+ | sse4_1 -> vector_float_broadcast_sse l W32 x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse4 flag"++ MO_VF_Broadcast l W64 | sse2 -> vector_float_broadcast_avx l W64 x y+ | otherwise -> sorry "Please enable the -msse2 flag"++ MO_VF_Extract l W32 | avx -> vector_float_unpack l W32 x y+ | sse -> vector_float_unpack_sse l W32 x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse flag"++ MO_VF_Extract l W64 | sse2 -> vector_float_unpack l W64 x y+ | otherwise -> sorry "Please enable the -msse2 flag"++ MO_VF_Add l w | avx -> vector_float_op_avx VA_Add l w x y+ | sse && w == W32 -> vector_float_op_sse VA_Add l w x y+ | sse2 && w == W64 -> vector_float_op_sse VA_Add l w x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse flag"++ MO_VF_Sub l w | avx -> vector_float_op_avx VA_Sub l w x y+ | sse && w == W32 -> vector_float_op_sse VA_Sub l w x y+ | sse2 && w == W64 -> vector_float_op_sse VA_Sub l w x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse flag"++ MO_VF_Mul l w | avx -> vector_float_op_avx VA_Mul l w x y+ | sse && w == W32 -> vector_float_op_sse VA_Mul l w x y+ | sse2 && w == W64 -> vector_float_op_sse VA_Mul l w x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse flag"++ MO_VF_Quot l w | avx -> vector_float_op_avx VA_Div l w x y+ | sse && w == W32 -> vector_float_op_sse VA_Div l w x y+ | sse2 && w == W64 -> vector_float_op_sse VA_Div l w x y+ | otherwise+ -> sorry "Please enable the -mavx or -msse flag"++ MO_VF_Insert {} -> incorrectOperands+ MO_VF_Neg {} -> incorrectOperands+ _other -> pprPanic "getRegister(x86) - binary CmmMachOp (1)" (pprMachOp mop) where --------------------@@ -930,7 +1109,171 @@ -- TODO: There are other interesting patterns we want to replace -- with a LEA, e.g. `(x + offset) + (y << shift)`. + -----------------------+ -- Vector operations---+ vector_float_op_avx :: VectorArithInstns+ -> Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_op_avx op l w expr1 expr2 = do+ (reg1, exp1) <- getSomeReg expr1+ (reg2, exp2) <- getSomeReg expr2+ let format = case w of+ W32 -> VecFormat l FmtFloat W32+ W64 -> VecFormat l FmtDouble W64+ _ -> pprPanic "Operation not supported for width " (ppr w)+ code dst = case op of+ VA_Add -> arithInstr VADD+ VA_Sub -> arithInstr VSUB+ VA_Mul -> arithInstr VMUL+ VA_Div -> arithInstr VDIV+ where+ -- opcode src2 src1 dst <==> dst = src1 `opcode` src2+ arithInstr instr = exp1 `appOL` exp2 `snocOL`+ (instr format (OpReg reg2) reg1 dst)+ return (Any format code)++ vector_float_op_sse :: VectorArithInstns+ -> Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_op_sse op l w expr1 expr2 = do+ (reg1, exp1) <- getSomeReg expr1+ (reg2, exp2) <- getSomeReg expr2+ let format = case w of+ W32 -> VecFormat l FmtFloat W32+ W64 -> VecFormat l FmtDouble W64+ _ -> pprPanic "Operation not supported for width " (ppr w)+ code dst = case op of+ VA_Add -> arithInstr ADD+ VA_Sub -> arithInstr SUB+ VA_Mul -> arithInstr MUL+ VA_Div -> arithInstr FDIV+ where+ -- opcode src2 src1 <==> src1 = src1 `opcode` src2+ arithInstr instr+ = exp1 `appOL` exp2 `snocOL`+ (MOVU format (OpReg reg1) (OpReg dst)) `snocOL`+ (instr format (OpReg reg2) (OpReg dst))+ return (Any format code) --------------------+ vector_float_unpack :: Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_unpack l W32 expr (CmmLit lit)+ = do+ (r, exp) <- getSomeReg expr+ let format = VecFormat l FmtFloat W32+ imm = litToImm lit+ code dst+ = case lit of+ CmmInt 0 _ -> exp `snocOL` (VMOVU format (OpReg r) (OpReg dst))+ CmmInt _ _ -> exp `snocOL` (VPSHUFD format (OpImm imm) (OpReg r) dst)+ _ -> panic "Error in offset while unpacking"+ return (Any format code)+ vector_float_unpack l W64 expr (CmmLit lit)+ = do+ dflags <- getDynFlags+ (r, exp) <- getSomeReg expr+ let format = VecFormat l FmtDouble W64+ addr = spRel dflags 0+ code dst+ = case lit of+ CmmInt 0 _ -> exp `snocOL`+ (MOVL format (OpReg r) (OpAddr addr)) `snocOL`+ (MOV FF64 (OpAddr addr) (OpReg dst))+ CmmInt 1 _ -> exp `snocOL`+ (MOVH format (OpReg r) (OpAddr addr)) `snocOL`+ (MOV FF64 (OpAddr addr) (OpReg dst))+ _ -> panic "Error in offset while unpacking"+ return (Any format code)+ vector_float_unpack _ w c e+ = pprPanic "Unpack not supported for : " (ppr c $$ ppr e $$ ppr w)+ -----------------------++ vector_float_unpack_sse :: Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_unpack_sse l W32 expr (CmmLit lit)+ = do+ (r,exp) <- getSomeReg expr+ let format = VecFormat l FmtFloat W32+ imm = litToImm lit+ code dst+ = case lit of+ CmmInt 0 _ -> exp `snocOL` (MOVU format (OpReg r) (OpReg dst))+ CmmInt _ _ -> exp `snocOL` (PSHUFD format (OpImm imm) (OpReg r) dst)+ _ -> panic "Error in offset while unpacking"+ return (Any format code)+ vector_float_unpack_sse _ w c e+ = pprPanic "Unpack not supported for : " (ppr c $$ ppr e $$ ppr w)+ -----------------------+ vector_float_broadcast_avx :: Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_broadcast_avx len W32 expr1 expr2+ = do+ dflags <- getDynFlags+ fn <- getAnyReg expr1+ (r', exp) <- getSomeReg expr2+ let f = VecFormat len FmtFloat W32+ addr = spRel dflags 0+ in return $ Any f (\r -> exp `appOL`+ (fn r) `snocOL`+ (MOVU f (OpReg r') (OpAddr addr)) `snocOL`+ (VBROADCAST f addr r))+ vector_float_broadcast_avx len W64 expr1 expr2+ = do+ dflags <- getDynFlags+ fn <- getAnyReg expr1+ (r', exp) <- getSomeReg expr2+ let f = VecFormat len FmtDouble W64+ addr = spRel dflags 0+ in return $ Any f (\r -> exp `appOL`+ (fn r) `snocOL`+ (MOVU f (OpReg r') (OpAddr addr)) `snocOL`+ (MOVL f (OpAddr addr) (OpReg r)) `snocOL`+ (MOVH f (OpAddr addr) (OpReg r)))+ vector_float_broadcast_avx _ _ c _+ = pprPanic "Broadcast not supported for : " (ppr c)+ -----------------------+ vector_float_broadcast_sse :: Length+ -> Width+ -> CmmExpr+ -> CmmExpr+ -> NatM Register+ vector_float_broadcast_sse len W32 expr1 expr2+ = do+ dflags <- getDynFlags+ fn <- getAnyReg expr1 -- destination+ (r, exp) <- getSomeReg expr2 -- source+ let f = VecFormat len FmtFloat W32+ addr = spRel dflags 0+ code dst = exp `appOL`+ (fn dst) `snocOL`+ (MOVU f (OpReg r) (OpAddr addr)) `snocOL`+ (insertps 0) `snocOL`+ (insertps 16) `snocOL`+ (insertps 32) `snocOL`+ (insertps 48)+ where+ insertps off =+ INSERTPS f (OpImm $ litToImm $ CmmInt off W32) (OpAddr addr) dst++ in return $ Any f code+ vector_float_broadcast_sse _ _ c _+ = pprPanic "Broadcast not supported for : " (ppr c)+ ----------------------- sub_code :: Width -> CmmExpr -> CmmExpr -> NatM Register sub_code rep x (CmmLit (CmmInt y _)) | is32BitInteger (-y) = add_int rep x (-y)@@ -983,6 +1326,21 @@ return (Fixed format result code) +getRegister' _ _ (CmmLoad mem pk)+ | isVecType pk = do+ use_avx <- avxEnabled+ use_sse <- sseEnabled+ Amode addr mem_code <- getAmode mem+ let format = cmmTypeFormat pk+ code dst+ | use_avx = mem_code `snocOL`+ VMOVU format (OpAddr addr) (OpReg dst)+ | use_sse = mem_code `snocOL`+ MOVU format (OpAddr addr) (OpReg dst)+ | otherwise = pprPanic (unlines ["avx or sse flag not enabled",+ "for loading to "])+ (ppr pk)+ return (Any format code) getRegister' _ _ (CmmLoad mem pk) | isFloatType pk@@ -1049,10 +1407,24 @@ -- small memory model (see gcc docs, -mcmodel=small). getRegister' dflags _ (CmmLit lit)- = do let format = cmmTypeFormat (cmmLitType dflags lit)- imm = litToImm lit- code dst = unitOL (MOV format (OpImm imm) (OpReg dst))- return (Any format code)+ | isVecType cmmtype = vectorRegister cmmtype+ | otherwise = standardRegister cmmtype+ where+ cmmtype = cmmLitType dflags lit+ vectorRegister ctype+ = do+ --NOTE:+ -- This operation is only used to zero a register. For loading a+ -- vector literal there are pack and broadcast operations+ let format = cmmTypeFormat ctype+ code dst = unitOL (XOR format (OpReg dst) (OpReg dst))+ return (Any format code)+ standardRegister ctype+ = do+ let format = cmmTypeFormat ctype+ imm = litToImm lit+ code dst = unitOL (MOV format (OpImm imm) (OpReg dst))+ return (Any format code) getRegister' _ _ other | isVecExpr other = needLlvm@@ -1118,8 +1490,14 @@ return (reg, code) reg2reg :: Format -> Reg -> Reg -> Instr-reg2reg format src dst = MOV format (OpReg src) (OpReg dst)-+reg2reg format@(VecFormat _ FmtFloat W32) src dst+ = VMOVU format (OpReg src) (OpReg dst)+reg2reg format@(VecFormat _ FmtDouble W64) src dst+ = VMOVU format (OpReg src) (OpReg dst)+reg2reg (VecFormat _ _ _) _ _+ = panic "MOV operation not implemented for vectors"+reg2reg format src dst+ = MOV format (OpReg src) (OpReg dst) -------------------------------------------------------------------------------- getAmode :: CmmExpr -> NatM Amode@@ -1181,6 +1559,9 @@ getAmode' _ (CmmMachOp (MO_Add _) [x,y]) = x86_complex_amode x y 0 0 +getAmode' _ (CmmLit lit@(CmmFloat _ w))+ = memConstant (mkAlignment $ widthInBytes w) lit+ getAmode' is32Bit (CmmLit lit) | is32BitLit is32Bit lit = return (Amode (ImmAddr (litToImm lit) 0) nilOL) @@ -1561,7 +1942,8 @@ assignMem_FltCode :: Format -> CmmExpr -> CmmExpr -> NatM InstrBlock assignReg_FltCode :: Format -> CmmReg -> CmmExpr -> NatM InstrBlock -+assignMem_VecCode :: Format -> CmmExpr -> CmmExpr -> NatM InstrBlock+assignReg_VecCode :: Format -> CmmReg -> CmmExpr -> NatM InstrBlock -- integer assignment to memory -- specific case of adding/subtracting an integer to a particular address.@@ -1638,7 +2020,30 @@ let platform = targetPlatform dflags return (src_code (getRegisterReg platform reg)) +assignMem_VecCode pk addr src = do+ (src_reg, src_code) <- getNonClobberedReg src+ Amode addr addr_code <- getAmode addr+ use_avx <- avxEnabled+ use_sse <- sseEnabled+ let+ code | use_avx = src_code `appOL`+ addr_code `snocOL`+ (VMOVU pk (OpReg src_reg) (OpAddr addr))+ | use_sse = src_code `appOL`+ addr_code `snocOL`+ (MOVU pk (OpReg src_reg) (OpAddr addr))+ | otherwise = sorry "Please enable the -mavx or -msse flag"+ return code +assignReg_VecCode format reg src = do+ use_avx <- avxEnabled+ use_sse <- sseEnabled+ src_code <- getAnyReg src+ dflags <- getDynFlags+ let platform = targetPlatform dflags+ flag = use_avx || use_sse+ return (src_code (getVecRegisterReg platform flag format reg))+ genJump :: CmmExpr{-the branch target-} -> [Reg] -> NatM InstrBlock genJump (CmmLoad mem _) regs = do@@ -1891,8 +2296,9 @@ possibleWidth = minimum [left, sizeBytes] dst_addr = AddrBaseIndex (EABaseReg dst) EAIndexNone (ImmInteger (n - left)) +genCCall _ _ (PrimTarget MO_ReadBarrier) _ _ _ = return nilOL genCCall _ _ (PrimTarget MO_WriteBarrier) _ _ _ = return nilOL- -- write barrier compiles to no code on x86/x86-64;+ -- barriers compile to no code on x86/x86-64; -- we keep it this long in order to prevent earlier optimisations. genCCall _ _ (PrimTarget MO_Touch) _ _ _ = return nilOL@@ -2875,7 +3281,9 @@ MO_F32_Cos -> fsLit "cosf" MO_F32_Tan -> fsLit "tanf" MO_F32_Exp -> fsLit "expf"+ MO_F32_ExpM1 -> fsLit "expm1f" MO_F32_Log -> fsLit "logf"+ MO_F32_Log1P -> fsLit "log1pf" MO_F32_Asin -> fsLit "asinf" MO_F32_Acos -> fsLit "acosf"@@ -2896,7 +3304,9 @@ MO_F64_Cos -> fsLit "cos" MO_F64_Tan -> fsLit "tan" MO_F64_Exp -> fsLit "exp"+ MO_F64_ExpM1 -> fsLit "expm1" MO_F64_Log -> fsLit "log"+ MO_F64_Log1P -> fsLit "log1p" MO_F64_Asin -> fsLit "asin" MO_F64_Acos -> fsLit "acos"@@ -2944,6 +3354,7 @@ MO_AddWordC {} -> unsupported MO_SubWordC {} -> unsupported MO_U_Mul2 {} -> unsupported+ MO_ReadBarrier -> unsupported MO_WriteBarrier -> unsupported MO_Touch -> unsupported (MO_Prefetch_Data _ ) -> unsupported@@ -3356,6 +3767,7 @@ x@II16 -> wrongFmt x x@II32 -> wrongFmt x x@II64 -> wrongFmt x+ x@VecFormat {} -> wrongFmt x where wrongFmt x = panic $ "sse2NegCode: " ++ show x@@ -3370,28 +3782,32 @@ return (Any fmt code) isVecExpr :: CmmExpr -> Bool-isVecExpr (CmmMachOp (MO_V_Insert {}) _) = True-isVecExpr (CmmMachOp (MO_V_Extract {}) _) = True-isVecExpr (CmmMachOp (MO_V_Add {}) _) = True-isVecExpr (CmmMachOp (MO_V_Sub {}) _) = True-isVecExpr (CmmMachOp (MO_V_Mul {}) _) = True-isVecExpr (CmmMachOp (MO_VS_Quot {}) _) = True-isVecExpr (CmmMachOp (MO_VS_Rem {}) _) = True-isVecExpr (CmmMachOp (MO_VS_Neg {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Insert {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Extract {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Add {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Sub {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Mul {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Quot {}) _) = True-isVecExpr (CmmMachOp (MO_VF_Neg {}) _) = True-isVecExpr (CmmMachOp _ [e]) = isVecExpr e-isVecExpr _ = False+isVecExpr (CmmMachOp (MO_V_Insert {}) _) = True+isVecExpr (CmmMachOp (MO_V_Extract {}) _) = True+isVecExpr (CmmMachOp (MO_V_Add {}) _) = True+isVecExpr (CmmMachOp (MO_V_Sub {}) _) = True+isVecExpr (CmmMachOp (MO_V_Mul {}) _) = True+isVecExpr (CmmMachOp (MO_VS_Quot {}) _) = True+isVecExpr (CmmMachOp (MO_VS_Rem {}) _) = True+isVecExpr (CmmMachOp (MO_VS_Neg {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Broadcast {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Insert {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Extract {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Add {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Sub {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Mul {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Quot {}) _) = True+isVecExpr (CmmMachOp (MO_VF_Neg {}) _) = True+isVecExpr (CmmMachOp _ [e]) = isVecExpr e+isVecExpr _ = False needLlvm :: NatM a needLlvm = sorry $ unlines ["The native code generator does not support vector" ,"instructions. Please use -fllvm."]++incorrectOperands :: NatM a+incorrectOperands = sorry "Incorrect number of operands" -- | This works on the invariant that all jumps in the given blocks are required. -- Starting from there we try to make a few more jumps redundant by reordering
compiler/nativeGen/X86/Instr.hs view
@@ -34,7 +34,7 @@ import Cmm import FastString import Outputable-import Platform+import GHC.Platform import BasicTypes (Alignment) import CLabel@@ -328,6 +328,36 @@ | CMPXCHG Format Operand Operand -- src (r), dst (r/m), eax implicit | MFENCE + -- Vector Instructions --+ -- NOTE: Instructions follow the AT&T syntax+ -- Constructors and deconstructors+ | VBROADCAST Format AddrMode Reg+ | VEXTRACT Format Operand Reg Operand+ | INSERTPS Format Operand Operand Reg++ -- move operations+ | VMOVU Format Operand Operand+ | MOVU Format Operand Operand+ | MOVL Format Operand Operand+ | MOVH Format Operand Operand++ -- logic operations+ | VPXOR Format Reg Reg Reg++ -- Arithmetic+ | VADD Format Operand Reg Reg+ | VSUB Format Operand Reg Reg+ | VMUL Format Operand Reg Reg+ | VDIV Format Operand Reg Reg++ -- Shuffle+ | VPSHUFD Format Operand Operand Reg+ | PSHUFD Format Operand Operand Reg++ -- Shift+ | PSLLDQ Format Operand Reg+ | PSRLDQ Format Operand Reg+ data PrefetchVariant = NTA | Lvl0 | Lvl1 | Lvl2 @@ -430,6 +460,31 @@ CMPXCHG _ src dst -> usageRMM src dst (OpReg eax) MFENCE -> noUsage + -- vector instructions+ VBROADCAST _ src dst -> mkRU (use_EA src []) [dst]+ VEXTRACT _ off src dst -> mkRU ((use_R off []) ++ [src]) (use_R dst [])+ INSERTPS _ off src dst+ -> mkRU ((use_R off []) ++ (use_R src []) ++ [dst]) [dst]++ VMOVU _ src dst -> mkRU (use_R src []) (use_R dst [])+ MOVU _ src dst -> mkRU (use_R src []) (use_R dst [])+ MOVL _ src dst -> mkRU (use_R src []) (use_R dst [])+ MOVH _ src dst -> mkRU (use_R src []) (use_R dst [])+ VPXOR _ s1 s2 dst -> mkRU [s1,s2] [dst]++ VADD _ s1 s2 dst -> mkRU ((use_R s1 []) ++ [s2]) [dst]+ VSUB _ s1 s2 dst -> mkRU ((use_R s1 []) ++ [s2]) [dst]+ VMUL _ s1 s2 dst -> mkRU ((use_R s1 []) ++ [s2]) [dst]+ VDIV _ s1 s2 dst -> mkRU ((use_R s1 []) ++ [s2]) [dst]++ VPSHUFD _ off src dst+ -> mkRU (concatMap (\op -> use_R op []) [off, src]) [dst]+ PSHUFD _ off src dst+ -> mkRU (concatMap (\op -> use_R op []) [off, src]) [dst]++ PSLLDQ _ off dst -> mkRU (use_R off []) [dst]+ PSRLDQ _ off dst -> mkRU (use_R off []) [dst]+ _other -> panic "regUsage: unrecognised instr" where -- # Definitions@@ -588,6 +643,32 @@ CMPXCHG fmt src dst -> patch2 (CMPXCHG fmt) src dst MFENCE -> instr + -- vector instructions+ VBROADCAST fmt src dst -> VBROADCAST fmt (lookupAddr src) (env dst)+ VEXTRACT fmt off src dst+ -> VEXTRACT fmt (patchOp off) (env src) (patchOp dst)+ INSERTPS fmt off src dst+ -> INSERTPS fmt (patchOp off) (patchOp src) (env dst)++ VMOVU fmt src dst -> VMOVU fmt (patchOp src) (patchOp dst)+ MOVU fmt src dst -> MOVU fmt (patchOp src) (patchOp dst)+ MOVL fmt src dst -> MOVL fmt (patchOp src) (patchOp dst)+ MOVH fmt src dst -> MOVH fmt (patchOp src) (patchOp dst)+ VPXOR fmt s1 s2 dst -> VPXOR fmt (env s1) (env s2) (env dst)++ VADD fmt s1 s2 dst -> VADD fmt (patchOp s1) (env s2) (env dst)+ VSUB fmt s1 s2 dst -> VSUB fmt (patchOp s1) (env s2) (env dst)+ VMUL fmt s1 s2 dst -> VMUL fmt (patchOp s1) (env s2) (env dst)+ VDIV fmt s1 s2 dst -> VDIV fmt (patchOp s1) (env s2) (env dst)++ VPSHUFD fmt off src dst+ -> VPSHUFD fmt (patchOp off) (patchOp src) (env dst)+ PSHUFD fmt off src dst+ -> PSHUFD fmt (patchOp off) (patchOp src) (env dst)+ PSLLDQ fmt off dst+ -> PSLLDQ fmt (patchOp off) (env dst)+ PSRLDQ fmt off dst+ -> PSRLDQ fmt (patchOp off) (env dst) _other -> panic "patchRegs: unrecognised instr" where
compiler/nativeGen/X86/Ppr.hs view
@@ -41,8 +41,7 @@ import Cmm hiding (topInfoTable) import BlockId import CLabel-import Unique ( pprUniqueAlways )-import Platform+import GHC.Platform import FastString import Outputable @@ -280,10 +279,7 @@ if target32Bit platform then ppr32_reg_no f i else ppr64_reg_no f i RegReal (RealRegPair _ _) -> panic "X86.Ppr: no reg pairs on this arch"- RegVirtual (VirtualRegI u) -> text "%vI_" <> pprUniqueAlways u- RegVirtual (VirtualRegHi u) -> text "%vHi_" <> pprUniqueAlways u- RegVirtual (VirtualRegF u) -> text "%vF_" <> pprUniqueAlways u- RegVirtual (VirtualRegD u) -> text "%vD_" <> pprUniqueAlways u+ RegVirtual v -> ppr v where ppr32_reg_no :: Format -> Int -> SDoc@@ -395,6 +391,11 @@ II64 -> sLit "q" FF32 -> sLit "ss" -- "scalar single-precision float" (SSE2) FF64 -> sLit "sd" -- "scalar double-precision float" (SSE2)++ VecFormat _ FmtFloat W32 -> sLit "ps"+ VecFormat _ FmtDouble W64 -> sLit "pd"+ -- TODO: Add Ints and remove panic+ VecFormat {} -> panic "Incorrect width" ) pprFormat_x87 :: Format -> SDoc@@ -783,6 +784,41 @@ pprInstr (DIV fmt op) = pprFormatOp (sLit "div") fmt op pprInstr (IMUL2 fmt op) = pprFormatOp (sLit "imul") fmt op +-- Vector Instructions++pprInstr (VADD format s1 s2 dst)+ = pprFormatOpRegReg (sLit "vadd") format s1 s2 dst+pprInstr (VSUB format s1 s2 dst)+ = pprFormatOpRegReg (sLit "vsub") format s1 s2 dst+pprInstr (VMUL format s1 s2 dst)+ = pprFormatOpRegReg (sLit "vmul") format s1 s2 dst+pprInstr (VDIV format s1 s2 dst)+ = pprFormatOpRegReg (sLit "vdiv") format s1 s2 dst+pprInstr (VBROADCAST format from to)+ = pprBroadcast (sLit "vbroadcast") format from to+pprInstr (VMOVU format from to)+ = pprFormatOpOp (sLit "vmovu") format from to+pprInstr (MOVU format from to)+ = pprFormatOpOp (sLit "movu") format from to+pprInstr (MOVL format from to)+ = pprFormatOpOp (sLit "movl") format from to+pprInstr (MOVH format from to)+ = pprFormatOpOp (sLit "movh") format from to+pprInstr (VPXOR format s1 s2 dst)+ = pprXor (sLit "vpxor") format s1 s2 dst+pprInstr (VEXTRACT format offset from to)+ = pprFormatOpRegOp (sLit "vextract") format offset from to+pprInstr (INSERTPS format offset addr dst)+ = pprInsert (sLit "insertps") format offset addr dst+pprInstr (VPSHUFD format offset src dst)+ = pprShuf (sLit "vpshufd") format offset src dst+pprInstr (PSHUFD format offset src dst)+ = pprShuf (sLit "pshufd") format offset src dst+pprInstr (PSLLDQ format offset dst)+ = pprShiftLeft (sLit "pslldq") format offset dst+pprInstr (PSRLDQ format offset dst)+ = pprShiftRight (sLit "psrldq") format offset dst+ -- x86_64 only pprInstr (MUL format op1 op2) = pprFormatOpOp (sLit "mul") format op1 op2 pprInstr (MUL2 format op) = pprFormatOp (sLit "mul") format op@@ -875,7 +911,24 @@ pprMnemonic name format = char '\t' <> ptext name <> pprFormat format <> space +pprGenMnemonic :: PtrString -> Format -> SDoc+pprGenMnemonic name _ =+ char '\t' <> ptext name <> ptext (sLit "") <> space +pprBroadcastMnemonic :: PtrString -> Format -> SDoc+pprBroadcastMnemonic name format =+ char '\t' <> ptext name <> pprBroadcastFormat format <> space++pprBroadcastFormat :: Format -> SDoc+pprBroadcastFormat x+ = ptext (case x of+ VecFormat _ FmtFloat W32 -> sLit "ss"+ VecFormat _ FmtDouble W64 -> sLit "sd"+ -- TODO: Add Ints and remove panic+ VecFormat {} -> panic "Incorrect width"+ _ -> panic "Scalar Format invading vector operation"+ )+ pprFormatImmOp :: PtrString -> Format -> Imm -> Operand -> SDoc pprFormatImmOp name format imm op1 = hcat [@@ -921,7 +974,16 @@ pprOperand format op2 ] -+pprFormatOpRegOp :: PtrString -> Format -> Operand -> Reg -> Operand -> SDoc+pprFormatOpRegOp name format off reg1 op2+ = hcat [+ pprMnemonic name format,+ pprOperand format off,+ comma,+ pprReg format reg1,+ comma,+ pprOperand format op2+ ] pprRegReg :: PtrString -> Reg -> Reg -> SDoc pprRegReg name reg1 reg2@@ -944,6 +1006,17 @@ pprReg (archWordFormat (target32Bit platform)) reg2 ] +pprFormatOpRegReg :: PtrString -> Format -> Operand -> Reg -> Reg -> SDoc+pprFormatOpRegReg name format op1 reg2 reg3+ = hcat [+ pprMnemonic name format,+ pprOperand format op1,+ comma,+ pprReg format reg2,+ comma,+ pprReg format reg3+ ]+ pprCondOpReg :: PtrString -> Format -> Cond -> Operand -> Reg -> SDoc pprCondOpReg name format cond op1 reg2 = hcat [@@ -1008,3 +1081,68 @@ pprCondInstr :: PtrString -> Cond -> SDoc -> SDoc pprCondInstr name cond arg = hcat [ char '\t', ptext name, pprCond cond, space, arg]+++-- Custom pretty printers+-- These instructions currently don't follow a uniform suffix pattern+-- in their names, so we have custom pretty printers for them.++pprBroadcast :: PtrString -> Format -> AddrMode -> Reg -> SDoc+pprBroadcast name format op dst+ = hcat [+ pprBroadcastMnemonic name format,+ pprAddr op,+ comma,+ pprReg format dst+ ]++pprXor :: PtrString -> Format -> Reg -> Reg -> Reg -> SDoc+pprXor name format reg1 reg2 reg3+ = hcat [+ pprGenMnemonic name format,+ pprReg format reg1,+ comma,+ pprReg format reg2,+ comma,+ pprReg format reg3+ ]++pprInsert :: PtrString -> Format -> Operand -> Operand -> Reg -> SDoc+pprInsert name format off src dst+ = hcat [+ pprGenMnemonic name format,+ pprOperand format off,+ comma,+ pprOperand format src,+ comma,+ pprReg format dst+ ]++pprShuf :: PtrString -> Format -> Operand -> Operand -> Reg -> SDoc+pprShuf name format op1 op2 reg3+ = hcat [+ pprGenMnemonic name format,+ pprOperand format op1,+ comma,+ pprOperand format op2,+ comma,+ pprReg format reg3+ ]++pprShiftLeft :: PtrString -> Format -> Operand -> Reg -> SDoc+pprShiftLeft name format off reg+ = hcat [+ pprGenMnemonic name format,+ pprOperand format off,+ comma,+ pprReg format reg+ ]++pprShiftRight :: PtrString -> Format -> Operand -> Reg -> SDoc+pprShiftRight name format off reg+ = hcat [+ pprGenMnemonic name format,+ pprOperand format off,+ comma,+ pprReg format reg+ ]
compiler/nativeGen/X86/RegInfo.hs view
@@ -15,13 +15,15 @@ import Reg import Outputable-import Platform+import GHC.Platform import Unique import UniqFM import X86.Regs +--TODO:+-- Add VirtualRegAVX and inspect VecFormat and allocate mkVirtualReg :: Unique -> Format -> VirtualReg mkVirtualReg u format = case format of@@ -31,6 +33,7 @@ -- For now we map both to being allocated as "Double" Registers -- on X86/X86_64 FF64 -> VirtualRegD u+ VecFormat {} -> VirtualRegVec u _other -> VirtualRegI u regDotColor :: Platform -> RealReg -> SDoc
compiler/nativeGen/X86/Regs.hs view
@@ -60,7 +60,7 @@ import CLabel ( CLabel ) import DynFlags import Outputable-import Platform+import GHC.Platform import qualified Data.Array as A @@ -84,6 +84,7 @@ -> case vr of VirtualRegD{} -> 1 VirtualRegF{} -> 0+ VirtualRegVec{} -> 1 _other -> 0
compiler/prelude/PrelInfo.hs view
@@ -131,6 +131,7 @@ , map idName wiredInIds , map (idName . primOpId) allThePrimOps+ , map (idName . primOpWrapperId) allThePrimOps , basicKnownKeyNames , templateHaskellNames ]@@ -214,7 +215,8 @@ knownNamesInfo = unitNameEnv coercibleTyConName $ vcat [ text "Coercible is a special constraint with custom solving rules." , text "It is not a class."- , text "Please see section 9.14.4 of the user's guide for details." ]+ , text "Please see section `The Coercible constraint`"+ , text "of the user's guide for details." ] {- We let a lot of "non-standard" values be visible, so that we can make
compiler/rename/RnEnv.hs view
@@ -68,6 +68,7 @@ import BasicTypes ( pprWarningTxtForMsg, TopLevelFlag(..)) import SrcLoc import Outputable+import UniqSet ( uniqSetAny ) import Util import Maybes import DynFlags@@ -1462,7 +1463,9 @@ RoleAnnotCtxt ns -> lookup_top (`elemNameSet` ns) LocalBindCtxt ns -> lookup_group ns ClsDeclCtxt cls -> lookup_cls_op cls- InstDeclCtxt ns -> lookup_top (`elemNameSet` ns)+ InstDeclCtxt ns -> if uniqSetAny isUnboundName ns -- #16610+ then return (Right $ mkUnboundNameRdr rdr_name)+ else lookup_top (`elemNameSet` ns) where lookup_cls_op cls = lookupSubBndrOcc True cls doc rdr_name
compiler/rename/RnExpr.hs view
@@ -208,7 +208,7 @@ ------------------------------------------ -- Template Haskell extensions--- Don't ifdef-GHCI them because we want to fail gracefully+-- Don't ifdef-HAVE_INTERPRETER them because we want to fail gracefully -- (not with an rnExpr crash) in a stage-1 compiler. rnExpr e@(HsBracket _ br_body) = rnBracket e br_body
compiler/rename/RnPat.hs view
@@ -16,6 +16,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE DeriveFunctor #-} module RnPat (-- main entry points rnPat, rnPats, rnBindPat, rnPatAndThen,@@ -72,7 +73,7 @@ import DataCon import qualified GHC.LanguageExtensions as LangExt -import Control.Monad ( when, liftM, ap, guard )+import Control.Monad ( when, ap, guard ) import qualified Data.List.NonEmpty as NE import Data.Ratio @@ -107,10 +108,8 @@ newtype CpsRn b = CpsRn { unCpsRn :: forall r. (b -> RnM (r, FreeVars)) -> RnM (r, FreeVars) }+ deriving (Functor) -- See Note [CpsRn monad]--instance Functor CpsRn where- fmap = liftM instance Applicative CpsRn where pure x = CpsRn (\k -> k x)
compiler/rename/RnSource.hs view
@@ -69,7 +69,7 @@ import Data.List ( mapAccumL ) import qualified Data.List.NonEmpty as NE import Data.List.NonEmpty ( NonEmpty(..) )-import Data.Maybe ( isNothing, fromMaybe )+import Data.Maybe ( isNothing, isJust, fromMaybe ) import qualified Data.Set as Set ( difference, fromList, toList, null ) {- | @rnSourceDecl@ "renames" declarations.@@ -1539,18 +1539,22 @@ -- "data", "newtype" declarations -- both top level and (for an associated type) in an instance decl-rnTyClDecl (DataDecl { tcdLName = tycon, tcdTyVars = tyvars,- tcdFixity = fixity, tcdDataDefn = defn })+rnTyClDecl (DataDecl _ _ _ _ (XHsDataDefn _)) =+ panic "rnTyClDecl: DataDecl with XHsDataDefn"+rnTyClDecl (DataDecl+ { tcdLName = tycon, tcdTyVars = tyvars,+ tcdFixity = fixity,+ tcdDataDefn = defn@HsDataDefn{ dd_ND = new_or_data+ , dd_kindSig = kind_sig} }) = do { tycon' <- lookupLocatedTopBndrRn tycon ; let kvs = extractDataDefnKindVars defn doc = TyDataCtx tycon ; traceRn "rntycl-data" (ppr tycon <+> ppr kvs) ; bindHsQTyVars doc Nothing Nothing kvs tyvars $ \ tyvars' no_rhs_kvs -> do { (defn', fvs) <- rnDataDefn doc defn- -- See Note [Complete user-supplied kind signatures] in HsDecls- ; cusks_enabled <- xoptM LangExt.CUSKs- ; let cusk = cusks_enabled && hsTvbAllKinded tyvars' && no_rhs_kvs- rn_info = DataDeclRn { tcdDataCusk = cusk+ ; cusk <- dataDeclHasCUSK+ tyvars' new_or_data no_rhs_kvs (isJust kind_sig)+ ; let rn_info = DataDeclRn { tcdDataCusk = cusk , tcdFVs = fvs } ; traceRn "rndata" (ppr tycon <+> ppr cusk <+> ppr no_rhs_kvs) ; return (DataDecl { tcdLName = tycon'@@ -1625,6 +1629,42 @@ cls_doc = ClassDeclCtx lcls rnTyClDecl (XTyClDecl _) = panic "rnTyClDecl"++-- Does the data type declaration include a CUSK?+dataDeclHasCUSK :: LHsQTyVars pass -> NewOrData -> Bool -> Bool -> RnM Bool+dataDeclHasCUSK tyvars new_or_data no_rhs_kvs has_kind_sig = do+ { -- See Note [Unlifted Newtypes and CUSKs], and for a broader+ -- picture, see Note [Implementation of UnliftedNewtypes].+ ; unlifted_newtypes <- xoptM LangExt.UnliftedNewtypes+ ; let non_cusk_newtype+ | NewType <- new_or_data =+ unlifted_newtypes && not has_kind_sig+ | otherwise = False+ -- See Note [CUSKs: complete user-supplied kind signatures] in HsDecls+ ; cusks_enabled <- xoptM LangExt.CUSKs+ ; return $ cusks_enabled && hsTvbAllKinded tyvars &&+ no_rhs_kvs && not non_cusk_newtype+ }++{- Note [Unlifted Newtypes and CUSKs]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+When unlifted newtypes are enabled, a newtype must have a kind signature+in order to be considered have a CUSK. This is because the flow of+kind inference works differently. Consider:++ newtype Foo = FooC Int++When UnliftedNewtypes is disabled, we decide that Foo has kind+`TYPE 'LiftedRep` without looking inside the data constructor. So, we+can say that Foo has a CUSK. However, when UnliftedNewtypes is enabled,+we fill in the kind of Foo as a metavar that gets solved by unification+with the kind of the field inside FooC (that is, Int, whose kind is+`TYPE 'LiftedRep`). But since we have to look inside the data constructors+to figure out the kind signature of Foo, it does not have a CUSK.++See Note [Implementation of UnliftedNewtypes] for where this fits in to+the broader picture of UnliftedNewtypes.+-} -- "type" and "type instance" declarations rnTySyn :: HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
compiler/rename/RnSplice.hs view
@@ -378,22 +378,19 @@ rnSplice :: HsSplice GhcPs -> RnM (HsSplice GhcRn, FreeVars) -- Not exported...used for all rnSplice (HsTypedSplice x hasParen splice_name expr)- = do { checkTH expr "Template Haskell typed splice"- ; loc <- getSrcSpanM+ = do { loc <- getSrcSpanM ; n' <- newLocalBndrRn (cL loc splice_name) ; (expr', fvs) <- rnLExpr expr ; return (HsTypedSplice x hasParen n' expr', fvs) } rnSplice (HsUntypedSplice x hasParen splice_name expr)- = do { checkTH expr "Template Haskell untyped splice"- ; loc <- getSrcSpanM+ = do { loc <- getSrcSpanM ; n' <- newLocalBndrRn (cL loc splice_name) ; (expr', fvs) <- rnLExpr expr ; return (HsUntypedSplice x hasParen n' expr', fvs) } rnSplice (HsQuasiQuote x splice_name quoter q_loc quote)- = do { checkTH quoter "Template Haskell quasi-quote"- ; loc <- getSrcSpanM+ = do { loc <- getSrcSpanM ; splice_name' <- newLocalBndrRn (cL loc splice_name) -- Rename the quoter; akin to the HsVar case of rnExpr
compiler/rename/RnTypes.hs view
@@ -693,8 +693,8 @@ | otherwise = case rtke_what env of RnTypeBody -> Nothing- RnConstraint -> Just constraint_msg RnTopConstraint -> Just constraint_msg+ RnConstraint -> Just constraint_msg constraint_msg = hang (notAllowed pprAnonWildCard <+> text "in a constraint")@@ -714,7 +714,10 @@ | otherwise = case rtke_what env of RnTypeBody -> Nothing -- Allowed- RnTopConstraint -> Nothing -- Allowed+ RnTopConstraint -> Nothing -- Allowed; e.g.+ -- f :: (Eq _a) => _a -> Int+ -- g :: (_a, _b) => T _a _b -> Int+ -- The named tyvars get filled in from elsewhere RnConstraint -> Just constraint_msg constraint_msg = notAllowed (ppr name) <+> text "in a constraint"
compiler/simplCore/SimplCore.hs view
@@ -462,7 +462,7 @@ doCorePass CoreDoNothing = return doCorePass (CoreDoPasses passes) = runCorePasses passes -#if defined(GHCI)+#if defined(HAVE_INTERPRETER) doCorePass (CoreDoPluginPass _ pass) = {-# SCC "Plugin" #-} pass #else doCorePass pass@CoreDoPluginPass {} = pprPanic "doCorePass" (ppr pass)
compiler/simplCore/SimplMonad.hs view
@@ -4,6 +4,7 @@ \section[SimplMonad]{The simplifier Monad} -} +{-# LANGUAGE DeriveFunctor #-} module SimplMonad ( -- The monad SimplM,@@ -37,7 +38,7 @@ import ErrUtils as Err import Panic (throwGhcExceptionIO, GhcException (..)) import BasicTypes ( IntWithInf, treatZeroAsInf, mkIntWithInf )-import Control.Monad ( liftM, ap )+import Control.Monad ( ap ) {- ************************************************************************@@ -57,6 +58,7 @@ -> SimplCount -> IO (result, UniqSupply, SimplCount)} -- we only need IO here for dump output+ deriving (Functor) data SimplTopEnv = STE { st_flags :: DynFlags@@ -103,9 +105,6 @@ {-# INLINE thenSmpl_ #-} {-# INLINE returnSmpl #-} --instance Functor SimplM where- fmap = liftM instance Applicative SimplM where pure = returnSmpl
compiler/specialise/Specialise.hs view
@@ -5,6 +5,7 @@ -} {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE ViewPatterns #-} module Specialise ( specProgram, specUnfolding ) where @@ -938,7 +939,7 @@ | otherwise = return () where allCallersInlined = all (isAnyInlinePragma . idInlinePragma) callers- doWarn reason = + doWarn reason = warnMsg reason (vcat [ hang (text ("Could not specialise imported function") <+> quotes (ppr fn)) 2 (vcat [ text "when specialising" <+> quotes (ppr caller)@@ -2530,16 +2531,13 @@ ************************************************************************ -} -newtype SpecM a = SpecM (State SpecState a)+newtype SpecM a = SpecM (State SpecState a) deriving (Functor) data SpecState = SpecState { spec_uniq_supply :: UniqSupply, spec_module :: Module, spec_dflags :: DynFlags }--instance Functor SpecM where- fmap = liftM instance Applicative SpecM where pure x = SpecM $ return x
compiler/stgSyn/CoreToStg.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP, DeriveFunctor #-} -- -- (c) The GRASP/AQUA Project, Glasgow University, 1993-1998@@ -45,12 +45,12 @@ import DynFlags import ForeignCall import Demand ( isUsedOnce )-import PrimOp ( PrimCall(..) )+import PrimOp ( PrimCall(..), primOpWrapperId ) import SrcLoc ( mkGeneralSrcSpan ) import Data.List.NonEmpty (nonEmpty, toList) import Data.Maybe (fromMaybe)-import Control.Monad (liftM, ap)+import Control.Monad (ap) -- Note [Live vs free] -- ~~~~~~~~~~~~~~~~~~~@@ -268,7 +268,7 @@ bind = StgTopLifted $ StgNonRec id stg_rhs in- ASSERT2(consistentCafInfo id bind, ppr id )+ assertConsistentCaInfo dflags id bind (ppr bind) -- NB: previously the assertion printed 'rhs' and 'bind' -- as well as 'id', but that led to a black hole -- where printing the assertion error tripped the@@ -296,9 +296,18 @@ bind = StgTopLifted $ StgRec (zip binders stg_rhss) in- ASSERT2(consistentCafInfo (head binders) bind, ppr binders)+ assertConsistentCaInfo dflags (head binders) bind (ppr binders) (env', ccs', bind) +-- | CAF consistency issues will generally result in segfaults and are quite+-- difficult to debug (see #16846). We enable checking of the+-- 'consistentCafInfo' invariant with @-dstg-lint@ to increase the chance that+-- we catch these issues.+assertConsistentCaInfo :: DynFlags -> Id -> StgTopBinding -> SDoc -> a -> a+assertConsistentCaInfo dflags id bind err_doc result+ | gopt Opt_DoStgLinting dflags || debugIsOn+ , not $ consistentCafInfo id bind = pprPanic "assertConsistentCaInfo" err_doc+ | otherwise = result -- Assertion helper: this checks that the CafInfo on the Id matches -- what CoreToStg has figured out about the binding's SRT. The@@ -528,8 +537,12 @@ (dropRuntimeRepArgs (fromMaybe [] (tyConAppArgs_maybe res_ty))) -- Some primitive operator that might be implemented as a library call.- PrimOpId op -> ASSERT( saturated )- StgOpApp (StgPrimOp op) args' res_ty+ -- As described in Note [Primop wrappers] in PrimOp.hs, here we+ -- turn unsaturated primop applications into applications of+ -- the primop's wrapper.+ PrimOpId op+ | saturated -> StgOpApp (StgPrimOp op) args' res_ty+ | otherwise -> StgApp (primOpWrapperId op) args' -- A call to some primitive Cmm function. FCallId (CCall (CCallSpec (StaticTarget _ lbl (Just pkgId) True)@@ -539,7 +552,7 @@ -- A regular foreign call. FCallId call -> ASSERT( saturated )- StgOpApp (StgFCallOp call (idUnique f)) args' res_ty+ StgOpApp (StgFCallOp call (idType f)) args' res_ty TickBoxOpId {} -> pprPanic "coreToStg TickBox" $ ppr (f,args') _other -> StgApp f args'@@ -813,6 +826,7 @@ { unCtsM :: IdEnv HowBound -> a }+ deriving (Functor) data HowBound = ImportBound -- Used only as a response to lookupBinding; never@@ -860,9 +874,6 @@ thenCts :: CtsM a -> (a -> CtsM b) -> CtsM b thenCts m k = CtsM $ \env -> unCtsM (k (unCtsM m env)) env--instance Functor CtsM where- fmap = liftM instance Applicative CtsM where pure = returnCts
compiler/stgSyn/StgLint.hs view
@@ -32,7 +32,8 @@ basic properties listed above. -} -{-# LANGUAGE ScopedTypeVariables, FlexibleContexts, TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables, FlexibleContexts, TypeFamilies,+ DeriveFunctor #-} module StgLint ( lintStgTopBindings ) where @@ -258,6 +259,7 @@ -> Bag MsgDoc -- Error messages so far -> (a, Bag MsgDoc) -- Result and error messages (if any) }+ deriving (Functor) data LintFlags = LintFlags { lf_unarised :: !Bool -- ^ have we run the unariser yet?@@ -292,9 +294,6 @@ Nothing else Just (vcat (punctuate blankLine (bagToList errs)))--instance Functor LintM where- fmap = liftM instance Applicative LintM where pure a = LintM $ \_mod _lf _loc _scope errs -> (a, errs)
compiler/stgSyn/StgSyn.hs view
@@ -76,13 +76,12 @@ import Module ( Module ) import Outputable import Packages ( isDllName )-import Platform+import GHC.Platform import PprCore ( {- instances -} ) import PrimOp ( PrimOp, PrimCall ) import TyCon ( PrimRep(..), TyCon ) import Type ( Type ) import RepType ( typePrimRep1 )-import Unique ( Unique ) import Util import Data.List.NonEmpty ( NonEmpty, toList )@@ -686,10 +685,11 @@ | StgPrimCallOp PrimCall - | StgFCallOp ForeignCall Unique- -- The Unique is occasionally needed by the C pretty-printer- -- (which lacks a unique supply), notably when generating a- -- typedef for foreign-export-dynamic+ | StgFCallOp ForeignCall Type+ -- The Type, which is obtained from the foreign import declaration+ -- itself, is needed by the stg-to-cmm pass to determine the offset to+ -- apply to unlifted boxed arguments in StgCmmForeign. See Note+ -- [Unlifted boxed arguments to foreign calls] {- ************************************************************************
compiler/typecheck/ClsInst.hs view
@@ -16,6 +16,7 @@ import TcType import TcMType import TcEvidence+import TcTypeableValidity import RnEnv( addUsedGRE ) import RdrName( lookupGRE_FieldLabel ) import InstEnv@@ -432,7 +433,7 @@ -- of monomorphic kind (e.g. all kind variables have been instantiated). doTyConApp :: Class -> Type -> TyCon -> [Kind] -> TcM ClsInstResult doTyConApp clas ty tc kind_args- | Just _ <- tyConRepName_maybe tc+ | tyConIsTypeable tc = return $ OneInst { cir_new_theta = (map (mk_typeable_pred clas) kind_args) , cir_mk_ev = mk_ev , cir_what = BuiltinInstance }
compiler/typecheck/Inst.hs view
@@ -297,23 +297,22 @@ -- If they don't match, emit a kind-equality to promise that they will -- eventually do so, and thus make a kind-homongeneous substitution. instTyVarsWith orig tvs tys- = go empty_subst tvs tys+ = go emptyTCvSubst tvs tys where- empty_subst = mkEmptyTCvSubst (mkInScopeSet (tyCoVarsOfTypes tys))- go subst [] [] = return subst go subst (tv:tvs) (ty:tys) | tv_kind `tcEqType` ty_kind- = go (extendTCvSubst subst tv ty) tvs tys+ = go (extendTvSubstAndInScope subst tv ty) tvs tys | otherwise = do { co <- emitWantedEq orig KindLevel Nominal ty_kind tv_kind- ; go (extendTCvSubst subst tv (ty `mkCastTy` co)) tvs tys }+ ; go (extendTvSubstAndInScope subst tv (ty `mkCastTy` co)) tvs tys } where tv_kind = substTy subst (tyVarKind tv) ty_kind = tcTypeKind ty go _ _ _ = pprPanic "instTysWith" (ppr tvs $$ ppr tys)+ {- ************************************************************************
compiler/typecheck/TcAnnotations.hs view
@@ -28,7 +28,7 @@ -- Some platforms don't support the external interpreter, and -- compilation on those platforms shouldn't fail just due to -- annotations-#ifndef GHCI+#if !defined(HAVE_INTERNAL_INTERPRETER) tcAnnotations :: [LAnnDecl GhcRn] -> TcM [Annotation] tcAnnotations anns = do dflags <- getDynFlags
compiler/typecheck/TcBinds.hs view
@@ -1020,7 +1020,7 @@ ; case tcGetCastedTyVar_maybe wc_var_ty of -- We know that wc_co must have type kind(wc_var) ~ Constraint, as it- -- comes from the checkExpectedKind in TcHsType.tcWildCardOcc. So, to+ -- comes from the checkExpectedKind in TcHsType.tcAnonWildCardOcc. So, to -- make the kinds work out, we reverse the cast here. Just (wc_var, wc_co) -> writeMetaTyVar wc_var (ctuple `mkCastTy` mkTcSymCo wc_co) Nothing -> pprPanic "chooseInferredQuantifiers 1" (ppr wc_var_ty)
compiler/typecheck/TcCanonical.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} module TcCanonical( canonicalize,@@ -1006,8 +1007,10 @@ = do { let tv2 = binderVar bndr2 ; (kind_co, wanteds1) <- unify loc Nominal (tyVarKind skol_tv) (substTy subst (tyVarKind tv2))- ; let subst' = extendTvSubst subst tv2+ ; let subst' = extendTvSubstAndInScope subst tv2 (mkCastTy (mkTyVarTy skol_tv) kind_co)+ -- skol_tv is already in the in-scope set, but the+ -- free vars of kind_co are not; hence "...AndInScope" ; (co, wanteds2) <- go skol_tvs subst' bndrs2 ; return ( mkTcForAllCo skol_tv kind_co co , wanteds1 `unionBags` wanteds2 ) }@@ -2079,13 +2082,6 @@ where k1 and k2 differ? This Note explores this treacherous area. -First off, the question above is slightly the wrong question. Flattening-a tyvar will flatten its kind (Note [Flattening] in TcFlatten); flattening-the kind might introduce a cast. So we might have a casted tyvar on the-left. We thus revise our test case to-- (tv |> co :: k1) ~ (rhs :: k2)- We must proceed differently here depending on whether we have a Wanted or a Given. Consider this: @@ -2109,36 +2105,33 @@ Note [Wanteds do not rewrite Wanteds] in TcRnTypes: note that the new `co` is a Wanted. - The solution is then not to use `co` to "rewrite" -- that is, cast- -- `w`, but instead to keep `w` heterogeneous and- irreducible. Given that we're not using `co`, there is no reason to- collect evidence for it, so `co` is born a Derived, with a CtOrigin- of KindEqOrigin.+The solution is then not to use `co` to "rewrite" -- that is, cast -- `w`, but+instead to keep `w` heterogeneous and irreducible. Given that we're not using+`co`, there is no reason to collect evidence for it, so `co` is born a+Derived, with a CtOrigin of KindEqOrigin. When the Derived is solved (by+unification), the original wanted (`w`) will get kicked out. We thus get -When the Derived is solved (by unification), the original wanted (`w`)-will get kicked out.+[D] _ :: k ~ Type+[W] w :: (alpha :: k) ~ (Int :: Type) -Note that, if we had [G] co1 :: k ~ Type available, then none of this code would-trigger, because flattening would have rewritten k to Type. That is,-`w` would look like [W] (alpha |> co1 :: Type) ~ (Int :: Type), and the tyvar-case will trigger, correctly rewriting alpha to (Int |> sym co1).+Note that the Wanted is unchanged and will be irreducible. This all happens+in canEqTyVarHetero. +Note that, if we had [G] co1 :: k ~ Type available, then we never get+to canEqTyVarHetero: canEqTyVar tries flattening the kinds first. If+we have [G] co1 :: k ~ Type, then flattening the kind of alpha would+rewrite k to Type, and we would end up in canEqTyVarHomo.+ Successive canonicalizations of the same Wanted may produce duplicate Deriveds. Similar duplications can happen with fundeps, and there seems to be no easy way to avoid. I expect this case to be rare. -For Givens, this problem doesn't bite, so a heterogeneous Given gives+For Givens, this problem (the Wanteds-rewriting-Wanteds action of+a kind coercion) doesn't bite, so a heterogeneous Given gives rise to a Given kind equality. No Deriveds here. We thus homogenise-the Given (see the "homo_co" in the Given case in canEqTyVar) and+the Given (see the "homo_co" in the Given case in canEqTyVarHetero) and carry on with a homogeneous equality constraint. -Separately, I (Richard E) spent some time pondering what to do in the case-that we have [W] (tv |> co1 :: k1) ~ (tv |> co2 :: k2) where k1 and k2-differ. Note that the tv is the same. (This case is handled as the first-case in canEqTyVarHomo.) At one point, I thought we could solve this limited-form of heterogeneous Wanted, but I then reconsidered and now treat this case-just like any other heterogeneous Wanted.- Note [Type synonyms and canonicalization] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We treat type synonym applications as xi types, that is, they do not@@ -2198,10 +2191,7 @@ | Stop CtEvidence -- The (rewritten) constraint was solved SDoc -- Tells how it was solved -- Any new sub-goals have been put on the work list--instance Functor StopOrContinue where- fmap f (ContinueWith x) = ContinueWith (f x)- fmap _ (Stop ev s) = Stop ev s+ deriving (Functor) instance Outputable a => Outputable (StopOrContinue a) where ppr (Stop ev s) = text "Stop" <> parens s <+> ppr ev@@ -2285,8 +2275,12 @@ (mkTcSymCo co)) rewriteEvidence ev@(CtWanted { ctev_dest = dest+ , ctev_nosh = si , ctev_loc = loc }) new_pred co- = do { mb_new_ev <- newWanted loc new_pred+ = do { mb_new_ev <- newWanted_SI si loc new_pred+ -- The "_SI" varant ensures that we make a new Wanted+ -- with the same shadow-info as the existing one+ -- with the same shadow-info as the existing one (#16735) ; MASSERT( tcCoercionRole co == ctEvRole ev ) ; setWantedEvTerm dest (mkEvCast (getEvExpr mb_new_ev)@@ -2334,8 +2328,10 @@ `mkTcTransCo` mkTcSymCo rhs_co) ; newGivenEvVar loc' (new_pred, new_tm) } - | CtWanted { ctev_dest = dest } <- old_ev- = do { (new_ev, hole_co) <- newWantedEq loc' (ctEvRole old_ev) nlhs nrhs+ | CtWanted { ctev_dest = dest, ctev_nosh = si } <- old_ev+ = do { (new_ev, hole_co) <- newWantedEq_SI si loc' (ctEvRole old_ev) nlhs nrhs+ -- The "_SI" varant ensures that we make a new Wanted+ -- with the same shadow-info as the existing one (#16735) ; let co = maybeSym swapped $ mkSymCo lhs_co `mkTransCo` hole_co
compiler/typecheck/TcErrors.hs view
@@ -158,14 +158,22 @@ -- | Report *all* unsolved goals as errors, even if -fdefer-type-errors is on -- However, do not make any evidence bindings, because we don't -- have any convenient place to put them.+-- NB: Type-level holes are OK, because there are no bindings. -- See Note [Deferring coercion errors to runtime] -- Used by solveEqualities for kind equalities--- (see Note [Fail fast on kind errors] in TcSimplify]+-- (see Note [Fail fast on kind errors] in TcSimplify) -- and for simplifyDefault. reportAllUnsolved :: WantedConstraints -> TcM () reportAllUnsolved wanted = do { ev_binds <- newNoTcEvBinds- ; report_unsolved TypeError HoleError HoleError HoleError++ ; partial_sigs <- xoptM LangExt.PartialTypeSignatures+ ; warn_partial_sigs <- woptM Opt_WarnPartialTypeSignatures+ ; let type_holes | not partial_sigs = HoleError+ | warn_partial_sigs = HoleWarn+ | otherwise = HoleDefer++ ; report_unsolved TypeError HoleError type_holes HoleError ev_binds wanted } -- | Report all unsolved goals as warnings (but without deferring any errors to@@ -2007,11 +2015,11 @@ level = m_level `orElse` TypeLevel occurs_check_error- | Just act_tv <- tcGetTyVar_maybe act- , act_tv `elemVarSet` tyCoVarsOfType exp+ | Just tv <- tcGetTyVar_maybe ty1+ , tv `elemVarSet` tyCoVarsOfType ty2 = True- | Just exp_tv <- tcGetTyVar_maybe exp- , exp_tv `elemVarSet` tyCoVarsOfType act+ | Just tv <- tcGetTyVar_maybe ty2+ , tv `elemVarSet` tyCoVarsOfType ty1 = True | otherwise = False@@ -2035,13 +2043,17 @@ -> empty thing_msg = case maybe_thing of- Just thing -> \_ -> quotes thing <+> text "is"- Nothing -> \vowel -> text "got a" <>- if vowel then char 'n' else empty+ Just thing -> \_ levity ->+ quotes thing <+> text "is" <+> levity+ Nothing -> \vowel levity ->+ text "got a" <>+ (if vowel then char 'n' else empty) <+>+ levity <+>+ text "type" msg2 = sep [ text "Expecting a lifted type, but"- , thing_msg True, text "unlifted" ]+ , thing_msg True (text "unlifted") ] msg3 = sep [ text "Expecting an unlifted type, but"- , thing_msg False, text "lifted" ]+ , thing_msg False (text "lifted") ] msg4 = maybe_num_args_msg $$ sep [ text "Expected a type, but" , maybe (text "found something with kind")
compiler/typecheck/TcExpr.hs view
@@ -378,42 +378,35 @@ -- So: arg1_ty = arg2_ty -> op_res_ty -- where arg2_sigma maybe polymorphic; that's the point - ; arg2' <- tcArg op arg2 arg2_sigma 2+ ; arg2' <- tcArg op arg2 arg2_sigma 2 -- Make sure that the argument type has kind '*' -- ($) :: forall (r:RuntimeRep) (a:*) (b:TYPE r). (a->b) -> a -> b -- Eg we do not want to allow (D# $ 4.0#) #5570 -- (which gives a seg fault)- --- -- The *result* type can have any kind (#8739),- -- so we don't need to check anything for that ; _ <- unifyKind (Just (XHsType $ NHsCoreTy arg2_sigma)) (tcTypeKind arg2_sigma) liftedTypeKind- -- ignore the evidence. arg2_sigma must have type * or #,- -- because we know arg2_sigma -> or_res_ty is well-kinded+ -- Ignore the evidence. arg2_sigma must have type * or #,+ -- because we know (arg2_sigma -> op_res_ty) is well-kinded -- (because otherwise matchActualFunTys would fail)- -- There's no possibility here of, say, a kind family reducing to *.+ -- So this 'unifyKind' will either succeed with Refl, or will+ -- produce an insoluble constraint * ~ #, which we'll report later. - ; wrap_res <- tcSubTypeHR orig1 (Just expr) op_res_ty res_ty- -- op_res -> res+ -- NB: unlike the argument type, the *result* type, op_res_ty can+ -- have any kind (#8739), so we don't need to check anything for that ; op_id <- tcLookupId op_name- ; res_ty <- readExpType res_ty- ; let op' = L loc (mkHsWrap (mkWpTyApps [ getRuntimeRep res_ty+ ; let op' = L loc (mkHsWrap (mkWpTyApps [ getRuntimeRep op_res_ty , arg2_sigma- , res_ty])+ , op_res_ty]) (HsVar noExt (L lv op_id))) -- arg1' :: arg1_ty -- wrap_arg1 :: arg1_ty "->" (arg2_sigma -> op_res_ty)- -- wrap_res :: op_res_ty "->" res_ty- -- op' :: (a2_ty -> res_ty) -> a2_ty -> res_ty+ -- op' :: (a2_ty -> op_res_ty) -> a2_ty -> op_res_ty - -- wrap1 :: arg1_ty "->" (arg2_sigma -> res_ty)- wrap1 = mkWpFun idHsWrapper wrap_res arg2_sigma res_ty doc- <.> wrap_arg1- doc = text "When looking at the argument to ($)"+ expr' = OpApp fix (mkLHsWrap wrap_arg1 arg1') op' arg2' - ; return (OpApp fix (mkLHsWrap wrap1 arg1') op' arg2') }+ ; tcWrapResult expr expr' op_res_ty res_ty } | (L loc (HsRecFld _ (Ambiguous _ lbl))) <- op , Just sig_ty <- obviousSig (unLoc arg1)
compiler/typecheck/TcFlatten.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, ViewPatterns, BangPatterns #-}+{-# LANGUAGE CPP, DeriveFunctor, ViewPatterns, BangPatterns #-} module TcFlatten( FlattenMode(..),@@ -485,14 +485,12 @@ -- See Note [The flattening work list]. newtype FlatM a = FlatM { runFlatM :: FlattenEnv -> TcS a }+ deriving (Functor) instance Monad FlatM where m >>= k = FlatM $ \env -> do { a <- runFlatM m env ; runFlatM (k a) env }--instance Functor FlatM where- fmap = liftM instance Applicative FlatM where pure x = FlatM $ const (pure x)
compiler/typecheck/TcForeign.hs view
@@ -57,7 +57,7 @@ import PrelNames import DynFlags import Outputable-import Platform+import GHC.Platform import SrcLoc import Bag import Hooks
compiler/typecheck/TcHoleErrors.hs view
@@ -1,7 +1,19 @@-module TcHoleErrors ( findValidHoleFits, tcFilterHoleFits, HoleFit (..)- , HoleFitCandidate (..), tcCheckHoleFit, tcSubsumes- , withoutUnification ) where+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ExistentialQuantification #-}+module TcHoleErrors ( findValidHoleFits, tcFilterHoleFits+ , tcCheckHoleFit, tcSubsumes+ , withoutUnification+ , fromPureHFPlugin+ -- Re-exports for convenience+ , hfIsLcl+ , pprHoleFit, debugHoleFitDispConfig + -- Re-exported from TcHoleFitTypes+ , TypedHole (..), HoleFit (..), HoleFitCandidate (..)+ , CandPlugin, FitPlugin+ , HoleFitPlugin (..), HoleFitPluginR (..)+ ) where+ import GhcPrelude import TcRnTypes@@ -28,10 +40,9 @@ import Control.Arrow ( (&&&) ) -import Control.Monad ( filterM, replicateM )+import Control.Monad ( filterM, replicateM, foldM ) import Data.List ( partition, sort, sortOn, nubBy ) import Data.Graph ( graphFromEdges, topSort )-import Data.Function ( on ) import TcSimplify ( simpl_top, runTcSDeriveds )@@ -39,13 +50,15 @@ import ExtractDocs ( extractDocs ) import qualified Data.Map as Map-import HsDoc ( HsDocString, unpackHDS, DeclDocMap(..) )+import HsDoc ( unpackHDS, DeclDocMap(..) ) import HscTypes ( ModIface(..) ) import LoadIface ( loadInterfaceForNameMaybe ) import PrelInfo (knownKeyNames) +import TcHoleFitTypes + {- Note [Valid hole fits include ...] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@@ -420,72 +433,6 @@ then BySize else NoSorting } ---- | HoleFitCandidates are passed to the filter and checked whether they can be--- made to fit.-data HoleFitCandidate = IdHFCand Id -- An id, like locals.- | NameHFCand Name -- A name, like built-in syntax.- | GreHFCand GlobalRdrElt -- A global, like imported ids.- deriving (Eq)-instance Outputable HoleFitCandidate where- ppr = pprHoleFitCand--pprHoleFitCand :: HoleFitCandidate -> SDoc-pprHoleFitCand (IdHFCand id) = text "Id HFC: " <> ppr id-pprHoleFitCand (NameHFCand name) = text "Name HFC: " <> ppr name-pprHoleFitCand (GreHFCand gre) = text "Gre HFC: " <> ppr gre--instance HasOccName HoleFitCandidate where- occName hfc = case hfc of- IdHFCand id -> occName id- NameHFCand name -> occName name- GreHFCand gre -> occName (gre_name gre)---- | HoleFit is the type we use for valid hole fits. It contains the--- element that was checked, the Id of that element as found by `tcLookup`,--- and the refinement level of the fit, which is the number of extra argument--- holes that this fit uses (e.g. if hfRefLvl is 2, the fit is for `Id _ _`).-data HoleFit =- HoleFit { hfId :: Id -- The elements id in the TcM- , hfCand :: HoleFitCandidate -- The candidate that was checked.- , hfType :: TcType -- The type of the id, possibly zonked.- , hfRefLvl :: Int -- The number of holes in this fit.- , hfWrap :: [TcType] -- The wrapper for the match.- , hfMatches :: [TcType] -- What the refinement variables got matched- -- with, if anything- , hfDoc :: Maybe HsDocString } -- Documentation of this HoleFit, if- -- available.---hfName :: HoleFit -> Name-hfName hf = case hfCand hf of- IdHFCand id -> idName id- NameHFCand name -> name- GreHFCand gre -> gre_name gre--hfIsLcl :: HoleFit -> Bool-hfIsLcl hf = case hfCand hf of- IdHFCand _ -> True- NameHFCand _ -> False- GreHFCand gre -> gre_lcl gre---- We define an Eq and Ord instance to be able to build a graph.-instance Eq HoleFit where- (==) = (==) `on` hfId---- We compare HoleFits by their name instead of their Id, since we don't--- want our tests to be affected by the non-determinism of `nonDetCmpVar`,--- which is used to compare Ids. When comparing, we want HoleFits with a lower--- refinement level to come first.-instance Ord HoleFit where- compare a b = cmp a b- where cmp = if hfRefLvl a == hfRefLvl b- then compare `on` hfName- else compare `on` hfRefLvl--instance Outputable HoleFit where- ppr = pprHoleFit debugHoleFitDispConfig- -- If enabled, we go through the fits and add any associated documentation, -- by looking it up in the module or the environment (for local fits) addDocs :: [HoleFit] -> TcM [HoleFit]@@ -499,70 +446,70 @@ msg = text "TcHoleErrors addDocs" lookupInIface name (ModIface { mi_decl_docs = DeclDocMap dmap }) = Map.lookup name dmap- upd lclDocs fit =- let name = hfName fit in- do { doc <- if hfIsLcl fit- then pure (Map.lookup name lclDocs)- else do { mbIface <- loadInterfaceForNameMaybe msg name- ; return $ mbIface >>= lookupInIface name }- ; return $ fit {hfDoc = doc} }+ upd lclDocs fit@(HoleFit {hfCand = cand}) =+ do { let name = getName cand+ ; doc <- if hfIsLcl fit+ then pure (Map.lookup name lclDocs)+ else do { mbIface <- loadInterfaceForNameMaybe msg name+ ; return $ mbIface >>= lookupInIface name }+ ; return $ fit {hfDoc = doc} }+ upd _ fit = return fit -- For pretty printing hole fits, we display the name and type of the fit, -- with added '_' to represent any extra arguments in case of a non-zero -- refinement level. pprHoleFit :: HoleFitDispConfig -> HoleFit -> SDoc-pprHoleFit (HFDC sWrp sWrpVars sTy sProv sMs) hf = hang display 2 provenance- where name = hfName hf- ty = hfType hf- matches = hfMatches hf- wrap = hfWrap hf- tyApp = sep $ zipWithEqual "pprHoleFit" pprArg vars wrap- where pprArg b arg = case binderArgFlag b of- Specified -> text "@" <> pprParendType arg- -- Do not print type application for inferred- -- variables (#16456)- Inferred -> empty- Required -> pprPanic "pprHoleFit: bad Required"+pprHoleFit _ (RawHoleFit sd) = sd+pprHoleFit (HFDC sWrp sWrpVars sTy sProv sMs) (HoleFit {..}) =+ hang display 2 provenance+ where name = getName hfCand+ tyApp = sep $ zipWithEqual "pprHoleFit" pprArg vars hfWrap+ where pprArg b arg = case binderArgFlag b of+ Specified -> text "@" <> pprParendType arg+ -- Do not print type application for inferred+ -- variables (#16456)+ Inferred -> empty+ Required -> pprPanic "pprHoleFit: bad Required" (ppr b <+> ppr arg)- tyAppVars = sep $ punctuate comma $- zipWithEqual "pprHoleFit" (\v t -> ppr (binderVar v) <+>- text "~" <+> pprParendType t)- vars wrap+ tyAppVars = sep $ punctuate comma $+ zipWithEqual "pprHoleFit" (\v t -> ppr (binderVar v) <+>+ text "~" <+> pprParendType t)+ vars hfWrap - vars = unwrapTypeVars ty- where- -- Attempts to get all the quantified type variables in a type,- -- e.g.- -- return :: forall (m :: * -> *) Monad m => (forall a . a -> m a)- -- into [m, a]- unwrapTypeVars :: Type -> [TyCoVarBinder]- unwrapTypeVars t = vars ++ case splitFunTy_maybe unforalled of- Just (_, unfunned) -> unwrapTypeVars unfunned- _ -> []- where (vars, unforalled) = splitForAllVarBndrs t- holeVs = sep $ map (parens . (text "_" <+> dcolon <+>) . ppr) matches- holeDisp = if sMs then holeVs- else sep $ replicate (length matches) $ text "_"- occDisp = pprPrefixOcc name- tyDisp = ppWhen sTy $ dcolon <+> ppr ty- has = not . null- wrapDisp = ppWhen (has wrap && (sWrp || sWrpVars))- $ text "with" <+> if sWrp || not sTy- then occDisp <+> tyApp- else tyAppVars- docs = case hfDoc hf of- Just d -> text "{-^" <>- (vcat . map text . lines . unpackHDS) d- <> text "-}"- _ -> empty- funcInfo = ppWhen (has matches && sTy) $- text "where" <+> occDisp <+> tyDisp- subDisp = occDisp <+> if has matches then holeDisp else tyDisp- display = subDisp $$ nest 2 (funcInfo $+$ docs $+$ wrapDisp)- provenance = ppWhen sProv $ parens $- case hfCand hf of- GreHFCand gre -> pprNameProvenance gre- _ -> text "bound at" <+> ppr (getSrcLoc name)+ vars = unwrapTypeVars hfType+ where+ -- Attempts to get all the quantified type variables in a type,+ -- e.g.+ -- return :: forall (m :: * -> *) Monad m => (forall a . a -> m a)+ -- into [m, a]+ unwrapTypeVars :: Type -> [TyCoVarBinder]+ unwrapTypeVars t = vars ++ case splitFunTy_maybe unforalled of+ Just (_, unfunned) -> unwrapTypeVars unfunned+ _ -> []+ where (vars, unforalled) = splitForAllVarBndrs t+ holeVs = sep $ map (parens . (text "_" <+> dcolon <+>) . ppr) hfMatches+ holeDisp = if sMs then holeVs+ else sep $ replicate (length hfMatches) $ text "_"+ occDisp = pprPrefixOcc name+ tyDisp = ppWhen sTy $ dcolon <+> ppr hfType+ has = not . null+ wrapDisp = ppWhen (has hfWrap && (sWrp || sWrpVars))+ $ text "with" <+> if sWrp || not sTy+ then occDisp <+> tyApp+ else tyAppVars+ docs = case hfDoc of+ Just d -> text "{-^" <>+ (vcat . map text . lines . unpackHDS) d+ <> text "-}"+ _ -> empty+ funcInfo = ppWhen (has hfMatches && sTy) $+ text "where" <+> occDisp <+> tyDisp+ subDisp = occDisp <+> if has hfMatches then holeDisp else tyDisp+ display = subDisp $$ nest 2 (funcInfo $+$ docs $+$ wrapDisp)+ provenance = ppWhen sProv $ parens $+ case hfCand of+ GreHFCand gre -> pprNameProvenance gre+ _ -> text "bound at" <+> ppr (getSrcLoc name) getLocalBindings :: TidyEnv -> Ct -> TcM [Id] getLocalBindings tidy_orig ct@@ -598,11 +545,15 @@ ; maxVSubs <- maxValidHoleFits <$> getDynFlags ; hfdc <- getHoleFitDispConfig ; sortingAlg <- getSortingAlg+ ; dflags <- getDynFlags+ ; hfPlugs <- tcg_hf_plugins <$> getGblEnv ; let findVLimit = if sortingAlg > NoSorting then Nothing else maxVSubs- ; refLevel <- refLevelHoleFits <$> getDynFlags- ; traceTc "findingValidHoleFitsFor { " $ ppr ct+ refLevel = refLevelHoleFits dflags+ hole = TyH (listToBag relevantCts) implics (Just ct)+ (candidatePlugins, fitPlugins) =+ unzip $ map (\p-> ((candPlugin p) hole, (fitPlugin p) hole)) hfPlugs+ ; traceTc "findingValidHoleFitsFor { " $ ppr hole ; traceTc "hole_lvl is:" $ ppr hole_lvl- ; traceTc "implics are: " $ ppr implics ; traceTc "simples are: " $ ppr simples ; traceTc "locals are: " $ ppr lclBinds ; let (lcl, gbl) = partition gre_lcl (globalRdrEnvElts rdr_env)@@ -615,11 +566,14 @@ globals = map GreHFCand gbl syntax = map NameHFCand builtIns to_check = locals ++ syntax ++ globals+ ; cands <- foldM (flip ($)) to_check candidatePlugins+ ; traceTc "numPlugins are:" $ ppr (length candidatePlugins) ; (searchDiscards, subs) <-- tcFilterHoleFits findVLimit implics relevantCts (hole_ty, []) to_check+ tcFilterHoleFits findVLimit hole (hole_ty, []) cands ; (tidy_env, tidy_subs) <- zonkSubs tidy_env subs ; tidy_sorted_subs <- sortFits sortingAlg tidy_subs- ; let (pVDisc, limited_subs) = possiblyDiscard maxVSubs tidy_sorted_subs+ ; plugin_handled_subs <- foldM (flip ($)) tidy_sorted_subs fitPlugins+ ; let (pVDisc, limited_subs) = possiblyDiscard maxVSubs plugin_handled_subs vDiscards = pVDisc || searchDiscards ; subs_with_docs <- addDocs limited_subs ; let vMsg = ppUnless (null subs_with_docs) $@@ -638,8 +592,8 @@ ; traceTc "ref_tys are" $ ppr ref_tys ; let findRLimit = if sortingAlg > NoSorting then Nothing else maxRSubs- ; refDs <- mapM (flip (tcFilterHoleFits findRLimit implics- relevantCts) to_check) ref_tys+ ; refDs <- mapM (flip (tcFilterHoleFits findRLimit hole)+ cands) ref_tys ; (tidy_env, tidy_rsubs) <- zonkSubs tidy_env $ concatMap snd refDs ; tidy_sorted_rsubs <- sortFits sortingAlg tidy_rsubs -- For refinement substitutions we want matches@@ -649,8 +603,10 @@ ; (tidy_env, tidy_hole_ty) <- zonkTidyTcType tidy_env hole_ty ; let hasExactApp = any (tcEqType tidy_hole_ty) . hfWrap (exact, not_exact) = partition hasExactApp tidy_sorted_rsubs- (pRDisc, exact_last_rfits) =- possiblyDiscard maxRSubs $ not_exact ++ exact+ ; plugin_handled_rsubs <- foldM (flip ($))+ (not_exact ++ exact) fitPlugins+ ; let (pRDisc, exact_last_rfits) =+ possiblyDiscard maxRSubs $ plugin_handled_rsubs rDiscards = pRDisc || any fst refDs ; rsubs_with_docs <- addDocs exact_last_rfits ; return (tidy_env,@@ -732,6 +688,9 @@ where zonkSubs' zs env [] = return (env, reverse zs) zonkSubs' zs env (hf:hfs) = do { (env', z) <- zonkSub env hf ; zonkSubs' (z:zs) env' hfs }++ zonkSub :: TidyEnv -> HoleFit -> TcM (TidyEnv, HoleFit)+ zonkSub env hf@RawHoleFit{} = return (env, hf) zonkSub env hf@HoleFit{hfType = ty, hfMatches = m, hfWrap = wrp} = do { (env, ty') <- zonkTidyTcType env ty ; (env, m') <- zonkTidyTcTypes env m@@ -786,10 +745,7 @@ -- running the type checker. Stops after finding limit matches. tcFilterHoleFits :: Maybe Int -- ^ How many we should output, if limited- -> [Implication]- -- ^ Enclosing implications for givens- -> [Ct]- -- ^ Any relevant unsolved simple constraints+ -> TypedHole -- ^ The hole to filter against -> (TcType, [TcTyVar]) -- ^ The type to check for fits and a list of refinement -- variables (free type variables in the type) for emulating@@ -799,8 +755,8 @@ -> TcM (Bool, [HoleFit]) -- ^ We return whether or not we stopped due to hitting the limit -- and the fits we found.-tcFilterHoleFits (Just 0) _ _ _ _ = return (False, []) -- Stop right away on 0-tcFilterHoleFits limit implics relevantCts ht@(hole_ty, _) candidates =+tcFilterHoleFits (Just 0) _ _ _ = return (False, []) -- Stop right away on 0+tcFilterHoleFits limit (TyH {..}) ht@(hole_ty, _) candidates = do { traceTc "checkingFitsFor {" $ ppr hole_ty ; (discards, subs) <- go [] emptyVarSet limit ht candidates ; traceTc "checkingFitsFor }" empty@@ -901,7 +857,7 @@ -- refinement hole fits, so we can't wrap the side-effects deeper than this. withoutUnification fvs $ do { traceTc "checkingFitOf {" $ ppr ty- ; (fits, wrp) <- tcCheckHoleFit (listToBag relevantCts) implics h_ty ty+ ; (fits, wrp) <- tcCheckHoleFit hole h_ty ty ; traceTc "Did it fit?" $ ppr fits ; traceTc "wrap is: " $ ppr wrp ; traceTc "checkingFitOf }" empty@@ -934,6 +890,7 @@ else return Nothing } else return Nothing } where fvs = mkFVs ref_vars `unionFV` hole_fvs `unionFV` tyCoFVsOfType ty+ hole = TyH tyHRelevantCts tyHImplics Nothing subsDiscardMsg :: SDoc@@ -970,8 +927,8 @@ -- discarding any errors. Subsumption here means that the ty_b can fit into the -- ty_a, i.e. `tcSubsumes a b == True` if b is a subtype of a. tcSubsumes :: TcSigmaType -> TcSigmaType -> TcM Bool-tcSubsumes ty_a ty_b = fst <$> tcCheckHoleFit emptyBag [] ty_a ty_b-+tcSubsumes ty_a ty_b = fst <$> tcCheckHoleFit dummyHole ty_a ty_b+ where dummyHole = TyH emptyBag [] Nothing -- | A tcSubsumes which takes into account relevant constraints, to fix trac -- #14273. This makes sure that when checking whether a type fits the hole,@@ -979,24 +936,22 @@ -- constraints on the type of the hole. -- Note: The simplifier may perform unification, so make sure to restore any -- free type variables to avoid side-effects.-tcCheckHoleFit :: Cts -- ^ Any relevant Cts to the hole.- -> [Implication]- -- ^ The nested implications of the hole with the innermost- -- implication first.- -> TcSigmaType -- ^ The type of the hole.- -> TcSigmaType -- ^ The type to check whether fits.+tcCheckHoleFit :: TypedHole -- ^ The hole to check against+ -> TcSigmaType+ -- ^ The type to check against (possibly modified, e.g. refined)+ -> TcSigmaType -- ^ The type to check whether fits. -> TcM (Bool, HsWrapper) -- ^ Whether it was a match, and the wrapper from hole_ty to ty.-tcCheckHoleFit _ _ hole_ty ty | hole_ty `eqType` ty+tcCheckHoleFit _ hole_ty ty | hole_ty `eqType` ty = return (True, idHsWrapper)-tcCheckHoleFit relevantCts implics hole_ty ty = discardErrs $+tcCheckHoleFit (TyH {..}) hole_ty ty = discardErrs $ do { -- We wrap the subtype constraint in the implications to pass along the -- givens, and so we must ensure that any nested implications and skolems -- end up with the correct level. The implications are ordered so that -- the innermost (the one with the highest level) is first, so it -- suffices to get the level of the first one (or the current level, if -- there are no implications involved).- innermost_lvl <- case implics of+ innermost_lvl <- case tyHImplics of [] -> getTcLevel -- imp is the innermost implication (imp:_) -> return (ic_tclvl imp)@@ -1004,15 +959,15 @@ tcSubType_NC ExprSigCtxt ty hole_ty ; traceTc "Checking hole fit {" empty ; traceTc "wanteds are: " $ ppr wanted- ; if isEmptyWC wanted && isEmptyBag relevantCts+ ; if isEmptyWC wanted && isEmptyBag tyHRelevantCts then traceTc "}" empty >> return (True, wrp) else do { fresh_binds <- newTcEvBinds -- The relevant constraints may contain HoleDests, so we must -- take care to clone them as well (to avoid #15370).- ; cloned_relevants <- mapBagM cloneWanted relevantCts+ ; cloned_relevants <- mapBagM cloneWanted tyHRelevantCts -- We wrap the WC in the nested implications, see -- Note [Nested Implications]- ; let outermost_first = reverse implics+ ; let outermost_first = reverse tyHImplics setWC = setWCAndBinds fresh_binds -- We add the cloned relevants to the wanteds generated by -- the call to tcSubType_NC, see Note [Relevant Constraints]@@ -1035,3 +990,10 @@ setWCAndBinds binds imp wc = WC { wc_simple = emptyBag , wc_impl = unitBag $ imp { ic_wanted = wc , ic_binds = binds } }++-- | Maps a plugin that needs no state to one with an empty one.+fromPureHFPlugin :: HoleFitPlugin -> HoleFitPluginR+fromPureHFPlugin plug =+ HoleFitPluginR { hfPluginInit = newTcRef ()+ , hfPluginRun = const plug+ , hfPluginStop = const $ return () }
compiler/typecheck/TcHsType.hs view
@@ -11,7 +11,7 @@ module TcHsType ( -- Type signatures- kcHsSigType, tcClassSigType,+ kcClassSigType, tcClassSigType, tcHsSigType, tcHsSigWcType, tcHsPartialSigType, funsSigCtxt, addSigCtxt, pprSigCtxt,@@ -36,7 +36,7 @@ -- Kind-checking types -- No kind generalisation, no checkValidType kcLHsQTyVars,- tcWildCardBinders,+ tcNamedWildCardBinders, tcHsLiftedType, tcHsOpenType, tcHsLiftedTypeNC, tcHsOpenTypeNC, tcLHsType, tcLHsTypeUnsaturated, tcCheckLHsType,@@ -49,7 +49,7 @@ kindGeneralize, checkExpectedKind_pp, -- Sort-checking kinds- tcLHsKindSig, badKindSig,+ tcLHsKindSig, checkDataKindSig, DataSort(..), -- Zonking and promoting zonkPromoteType,@@ -105,7 +105,7 @@ import Outputable import FastString import PrelNames hiding ( wildCardName )-import DynFlags ( WarningFlag (Opt_WarnPartialTypeSignatures) )+import DynFlags import qualified GHC.LanguageExtensions as LangExt import Maybes@@ -187,24 +187,40 @@ -- already checked this, so we can simply ignore it. tcHsSigWcType ctxt sig_ty = tcHsSigType ctxt (dropWildCards sig_ty) -kcHsSigType :: [Located Name] -> LHsSigType GhcRn -> TcM ()-kcHsSigType names (HsIB { hsib_body = hs_ty- , hsib_ext = sig_vars })- = discardResult $- addSigCtxt (funsSigCtxt names) hs_ty $- bindImplicitTKBndrs_Skol sig_vars $- tc_lhs_type typeLevelMode hs_ty liftedTypeKind--kcHsSigType _ (XHsImplicitBndrs _) = panic "kcHsSigType"+kcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM ()+kcClassSigType skol_info names sig_ty+ = discardResult $+ tcClassSigType skol_info names sig_ty+ -- tcClassSigType does a fair amount of extra work that we don't need,+ -- such as ordering quantified variables. But we absolutely do need+ -- to push the level when checking method types and solve local equalities,+ -- and so it seems easier just to call tcClassSigType than selectively+ -- extract the lines of code from tc_hs_sig_type that we really need.+ -- If we don't push the level, we get #16517, where GHC accepts+ -- class C a where+ -- meth :: forall k. Proxy (a :: k) -> ()+ -- Note that k is local to meth -- this is hogwash. tcClassSigType :: SkolemInfo -> [Located Name] -> LHsSigType GhcRn -> TcM Type -- Does not do validity checking tcClassSigType skol_info names sig_ty = addSigCtxt (funsSigCtxt names) (hsSigType sig_ty) $- tc_hs_sig_type skol_info sig_ty (TheKind liftedTypeKind)+ snd <$> tc_hs_sig_type skol_info sig_ty (TheKind liftedTypeKind) -- Do not zonk-to-Type, nor perform a validity check -- We are in a knot with the class and associated types -- Zonking and validity checking is done by tcClassDecl+ -- No need to fail here if the type has an error:+ -- If we're in the kind-checking phase, the solveEqualities+ -- in kcTyClGroup catches the error+ -- If we're in the type-checking phase, the solveEqualities+ -- in tcClassDecl1 gets it+ -- Failing fast here degrades the error message in, e.g., tcfail135:+ -- class Foo f where+ -- baa :: f a -> f+ -- If we fail fast, we're told that f has kind `k1` when we wanted `*`.+ -- It should be that f has kind `k2 -> *`, but we never get a chance+ -- to run the solver where the kind of f is touchable. This is+ -- painfully delicate. tcHsSigType :: UserTypeCtxt -> LHsSigType GhcRn -> TcM Type -- Does validity checking@@ -214,10 +230,13 @@ do { traceTc "tcHsSigType {" (ppr sig_ty) -- Generalise here: see Note [Kind generalisation]- ; ty <- tc_hs_sig_type skol_info sig_ty- (expectedKindInCtxt ctxt)+ ; (insol, ty) <- tc_hs_sig_type skol_info sig_ty+ (expectedKindInCtxt ctxt) ; ty <- zonkTcType ty + ; when insol failM+ -- See Note [Fail fast if there are insoluble kind equalities] in TcSimplify+ ; checkValidType ctxt ty ; traceTc "end tcHsSigType }" (ppr ty) ; return ty }@@ -225,12 +244,14 @@ skol_info = SigTypeSkol ctxt tc_hs_sig_type :: SkolemInfo -> LHsSigType GhcRn- -> ContextKind -> TcM Type+ -> ContextKind -> TcM (Bool, TcType) -- Kind-checks/desugars an 'LHsSigType', -- solve equalities, -- and then kind-generalizes. -- This will never emit constraints, as it uses solveEqualities interally. -- No validity checking or zonking+-- Returns also a Bool indicating whether the type induced an insoluble constraint;+-- True <=> constraint is insoluble tc_hs_sig_type skol_info hs_sig_type ctxt_kind | HsIB { hsib_ext = sig_vars, hsib_body = hs_ty } <- hs_sig_type = do { (tc_lvl, (wanted, (spec_tkvs, ty)))@@ -248,11 +269,7 @@ ; emitResidualTvConstraint skol_info Nothing (kvs ++ spec_tkvs) tc_lvl wanted - -- See Note [Fail fast if there are insoluble kind equalities]- -- in TcSimplify- ; when (insolubleWC wanted) failM-- ; return (mkInvForAllTys kvs ty1) }+ ; return (insolubleWC wanted, mkInvForAllTys kvs ty1) } tc_hs_sig_type _ (XHsImplicitBndrs _) _ = panic "tc_hs_sig_type" @@ -370,7 +387,7 @@ unsetWOptM Opt_WarnPartialTypeSignatures $ setXOptM LangExt.PartialTypeSignatures $ -- See Note [Wildcards in visible type application]- tcWildCardBinders sig_wcs $ \ _ ->+ tcNamedWildCardBinders sig_wcs $ \ _ -> tcCheckLHsType hs_ty kind -- We must promote here. Ex: -- f :: forall a. a@@ -385,18 +402,19 @@ {- Note [Wildcards in visible type application] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--A HsWildCardBndrs's hswc_ext now only includes named wildcards, so any unnamed-wildcards stay unchanged in hswc_body and when called in tcHsTypeApp, tcCheckLHsType-will call emitWildCardHoleConstraints on them. However, this would trigger-error/warning when an unnamed wildcard is passed in as a visible type argument,-which we do not want because users should be able to write @_ to skip a instantiating-a type variable variable without fuss. The solution is to switch the-PartialTypeSignatures flags here to let the typechecker know that it's checking-a '@_' and do not emit hole constraints on it.-See related Note [Wildcards in visible kind application]-and Note [The wildcard story for types] in HsTypes.hs+A HsWildCardBndrs's hswc_ext now only includes /named/ wildcards, so+any unnamed wildcards stay unchanged in hswc_body. When called in+tcHsTypeApp, tcCheckLHsType will call emitAnonWildCardHoleConstraint+on these anonymous wildcards. However, this would trigger+error/warning when an anonymous wildcard is passed in as a visible type+argument, which we do not want because users should be able to write+@_ to skip a instantiating a type variable variable without fuss. The+solution is to switch the PartialTypeSignatures flags here to let the+typechecker know that it's checking a '@_' and do not emit hole+constraints on it. See related Note [Wildcards in visible kind+application] and Note [The wildcard story for types] in HsTypes.hs +Ugh! -} {-@@ -812,7 +830,7 @@ tc_hs_type mode ty@(HsOpTy {}) ek = tc_infer_hs_type_ek mode ty ek tc_hs_type mode ty@(HsKindSig {}) ek = tc_infer_hs_type_ek mode ty ek tc_hs_type mode ty@(XHsType (NHsCoreTy{})) ek = tc_infer_hs_type_ek mode ty ek-tc_hs_type _ wc@(HsWildCardTy _) ek = tcWildCardOcc wc ek+tc_hs_type _ wc@(HsWildCardTy _) ek = tcAnonWildCardOcc wc ek ------------------------------------------ tc_fun_type :: TcTyMode -> LHsType GhcRn -> LHsType GhcRn -> TcKind@@ -832,18 +850,18 @@ liftedTypeKind exp_kind } ----------------------------tcWildCardOcc :: HsType GhcRn -> Kind -> TcM TcType-tcWildCardOcc wc exp_kind- = do { wc_tv <- newWildTyVar- -- The wildcard's kind should be an un-filled-in meta tyvar- ; loc <- getSrcSpanM- ; uniq <- newUnique- ; let name = mkInternalName uniq (mkTyVarOcc "_") loc+tcAnonWildCardOcc :: HsType GhcRn -> Kind -> TcM TcType+tcAnonWildCardOcc wc exp_kind+ = do { wc_tv <- newWildTyVar -- The wildcard's kind will be an un-filled-in meta tyvar+ ; part_tysig <- xoptM LangExt.PartialTypeSignatures ; warning <- woptM Opt_WarnPartialTypeSignatures- -- See Note [Wildcards in visible kind application]- ; unless (part_tysig && not warning)- (emitWildCardHoleConstraints [(name,wc_tv)])++ ; unless (part_tysig && not warning) $+ emitAnonWildCardHoleConstraint wc_tv+ -- Why the 'unless' guard?+ -- See Note [Wildcards in visible kind application]+ ; checkExpectedKind wc (mkTyVarTy wc_tv) (tyVarKind wc_tv) exp_kind } @@ -860,11 +878,11 @@ So we should allow '@_' without emitting any hole constraints, and regardless of whether PartialTypeSignatures is enabled or not. But how would the typechecker know which '_' is being used in VKA and which is not when it-calls emitWildCardHoleConstraints in tcHsPartialSigType on all HsWildCardBndrs?+calls emitNamedWildCardHoleConstraints in tcHsPartialSigType on all HsWildCardBndrs? The solution then is to neither rename nor include unnamed wildcards in HsWildCardBndrs,-but instead give every unnamed wildcard a fresh wild tyvar in tcWildCardOcc.+but instead give every anonymous wildcard a fresh wild tyvar in tcAnonWildCardOcc. And whenever we see a '@', we automatically turn on PartialTypeSignatures and-turn off hole constraint warnings, and never call emitWildCardHoleConstraints+turn off hole constraint warnings, and do not call emitAnonWildCardHoleConstraint under these conditions. See related Note [Wildcards in visible type application] here and Note [The wildcard story for types] in HsTypes.hs@@ -1705,23 +1723,26 @@ gathers free variables. So this way effectively sidesteps step 3. -} -tcWildCardBinders :: [Name]- -> ([(Name, TcTyVar)] -> TcM a)- -> TcM a-tcWildCardBinders wc_names thing_inside+tcNamedWildCardBinders :: [Name]+ -> ([(Name, TcTyVar)] -> TcM a)+ -> TcM a+-- Bring into scope the /named/ wildcard binders. Remember that+-- plain wildcards _ are anonymous and dealt with by HsWildCardTy+-- Soe Note [The wildcard story for types] in HsTypes+tcNamedWildCardBinders wc_names thing_inside = do { wcs <- mapM (const newWildTyVar) wc_names ; let wc_prs = wc_names `zip` wcs ; tcExtendNameTyVarEnv wc_prs $ thing_inside wc_prs } newWildTyVar :: TcM TcTyVar--- ^ New unification variable for a wildcard+-- ^ New unification variable '_' for a wildcard newWildTyVar = do { kind <- newMetaKindVar ; uniq <- newUnique ; details <- newMetaDetails TauTv- ; let name = mkSysTvName uniq (fsLit "_")- tyvar = (mkTcTyVar name kind details)+ ; let name = mkSysTvName uniq (fsLit "_")+ tyvar = mkTcTyVar name kind details ; traceTc "newWildTyVar" (ppr tyvar) ; return tyvar } @@ -2105,8 +2126,6 @@ bindExplicitTKBndrs_Q_Skol ctxt_kind = bindExplicitTKBndrsX (tcHsQTyVarBndr ctxt_kind newSkolemTyVar) bindExplicitTKBndrs_Q_Tv ctxt_kind = bindExplicitTKBndrsX (tcHsQTyVarBndr ctxt_kind newTyVarTyVar) --- | Used during the "kind-checking" pass in TcTyClsDecls only,--- and even then only for data-con declarations. bindExplicitTKBndrsX :: (HsTyVarBndr GhcRn -> TcM TcTyVar) -> [LHsTyVarBndr GhcRn]@@ -2225,7 +2244,8 @@ -- Quantify the free kind variables of a kind or type -- In the latter case the type is closed, so it has no free -- type variables. So in both cases, all the free vars are kind vars--- Input needn't be zonked.+-- Input needn't be zonked. All variables to be quantified must+-- have a TcLevel higher than the ambient TcLevel. -- NB: You must call solveEqualities or solveLocalEqualities before -- kind generalization --@@ -2243,7 +2263,8 @@ -- | This variant of 'kindGeneralize' refuses to generalize over any -- variables free in the given WantedConstraints. Instead, it promotes--- these variables into an outer TcLevel. See also+-- these variables into an outer TcLevel. All variables to be quantified must+-- have a TcLevel higher than the ambient TcLevel. See also -- Note [Promoting unification variables] in TcSimplify kindGeneralizeLocal :: WantedConstraints -> TcType -> TcM [KindVar] kindGeneralizeLocal wanted kind_or_type@@ -2384,13 +2405,102 @@ (subst', tv') = substTyVarBndr subst tv tcb = Bndr tv' (NamedTCB vis) -badKindSig :: Bool -> Kind -> SDoc-badKindSig check_for_type kind- = hang (sep [ text "Kind signature on data type declaration has non-*"- , (if check_for_type then empty else text "and non-variable") <+>- text "return kind" ])- 2 (ppr kind)+-- | A description of whether something is a+--+-- * @data@ or @newtype@ ('DataDeclSort')+--+-- * @data instance@ or @newtype instance@ ('DataInstanceSort')+--+-- * @data family@ ('DataFamilySort')+--+-- At present, this data type is only consumed by 'checkDataKindSig'.+data DataSort+ = DataDeclSort NewOrData+ | DataInstanceSort NewOrData+ | DataFamilySort +-- | Checks that the return kind in a data declaration's kind signature is+-- permissible. There are three cases:+--+-- If dealing with a @data@, @newtype@, @data instance@, or @newtype instance@+-- declaration, check that the return kind is @Type@.+--+-- If the declaration is a @newtype@ or @newtype instance@ and the+-- @UnliftedNewtypes@ extension is enabled, this check is slightly relaxed so+-- that a return kind of the form @TYPE r@ (for some @r@) is permitted.+-- See @Note [Implementation of UnliftedNewtypes]@ in "TcTyClsDecls".+--+-- If dealing with a @data family@ declaration, check that the return kind is+-- either of the form:+--+-- 1. @TYPE r@ (for some @r@), or+--+-- 2. @k@ (where @k@ is a bare kind variable; see #12369)+checkDataKindSig :: DataSort -> Kind -> TcM ()+checkDataKindSig data_sort kind = do+ dflags <- getDynFlags+ checkTc (is_TYPE_or_Type dflags || is_kind_var) (err_msg dflags)+ where+ pp_dec :: SDoc+ pp_dec = text $+ case data_sort of+ DataDeclSort DataType -> "data type"+ DataDeclSort NewType -> "newtype"+ DataInstanceSort DataType -> "data instance"+ DataInstanceSort NewType -> "newtype instance"+ DataFamilySort -> "data family"++ is_newtype :: Bool+ is_newtype =+ case data_sort of+ DataDeclSort new_or_data -> new_or_data == NewType+ DataInstanceSort new_or_data -> new_or_data == NewType+ DataFamilySort -> False++ is_data_family :: Bool+ is_data_family =+ case data_sort of+ DataDeclSort{} -> False+ DataInstanceSort{} -> False+ DataFamilySort -> True++ tYPE_ok :: DynFlags -> Bool+ tYPE_ok dflags =+ (is_newtype && xopt LangExt.UnliftedNewtypes dflags)+ -- With UnliftedNewtypes, we allow kinds other than Type, but they+ -- must still be of the form `TYPE r` since we don't want to accept+ -- Constraint or Nat.+ -- See Note [Implementation of UnliftedNewtypes] in TcTyClsDecls.+ || is_data_family+ -- If this is a `data family` declaration, we don't need to check if+ -- UnliftedNewtypes is enabled, since data family declarations can+ -- have return kind `TYPE r` unconditionally (#16827).++ is_TYPE :: Bool+ is_TYPE = tcIsRuntimeTypeKind kind++ is_TYPE_or_Type :: DynFlags -> Bool+ is_TYPE_or_Type dflags | tYPE_ok dflags = is_TYPE+ | otherwise = tcIsLiftedTypeKind kind++ -- In the particular case of a data family, permit a return kind of the+ -- form `:: k` (where `k` is a bare kind variable).+ is_kind_var :: Bool+ is_kind_var | is_data_family = isJust (tcGetCastedTyVar_maybe kind)+ | otherwise = False++ err_msg :: DynFlags -> SDoc+ err_msg dflags =+ sep [ (sep [ text "Kind signature on" <+> pp_dec <+>+ text "declaration has non-" <>+ (if tYPE_ok dflags then text "TYPE" else ppr liftedTypeKind)+ , (if is_data_family then text "and non-variable" else empty) <+>+ text "return kind" <+> quotes (ppr kind) ])+ , if not (tYPE_ok dflags) && is_TYPE && is_newtype &&+ not (xopt LangExt.UnliftedNewtypes dflags)+ then text "Perhaps you intended to use UnliftedNewtypes"+ else empty ]+ tcbVisibilities :: TyCon -> [Type] -> [TyConBndrVis] -- Result is in 1-1 correpondence with orig_args tcbVisibilities tc orig_args@@ -2473,11 +2583,11 @@ -> LHsSigWcType GhcRn -- The type signature -> TcM ( [(Name, TcTyVar)] -- Wildcards , Maybe TcType -- Extra-constraints wildcard- , [Name] -- Original tyvar names, in correspondence with ...- , [TcTyVar] -- ... Implicitly and explicitly bound type variables+ , [(Name,TcTyVar)] -- Original tyvar names, in correspondence with+ -- the implicitly and explicitly bound type variables , TcThetaType -- Theta part , TcType ) -- Tau part--- See Note [Recipe for checking a signature]+-- See Note [Checking partial type signatures] tcHsPartialSigType ctxt sig_ty | HsWC { hswc_ext = sig_wcs, hswc_body = ib_ty } <- sig_ty , HsIB { hsib_ext = implicit_hs_tvs@@ -2485,8 +2595,11 @@ , (explicit_hs_tvs, L _ hs_ctxt, hs_tau) <- splitLHsSigmaTy hs_ty = addSigCtxt ctxt hs_ty $ do { (implicit_tvs, (explicit_tvs, (wcs, wcx, theta, tau)))- <- solveLocalEqualities "tcHsPatSigTypes" $- tcWildCardBinders sig_wcs $ \ wcs ->+ <- solveLocalEqualities "tcHsPartialSigType" $+ -- This solveLocalEqualiltes fails fast if there are+ -- insoluble equalities. See TcSimplify+ -- Note [Fail fast if there are insoluble kind equalities]+ tcNamedWildCardBinders sig_wcs $ \ wcs -> bindImplicitTKBndrs_Tv implicit_hs_tvs $ bindExplicitTKBndrs_Tv explicit_hs_tvs $ do { -- Instantiate the type-class context; but if there@@ -2497,38 +2610,23 @@ ; return (wcs, wcx, theta, tau) } - -- We must return these separately, because all the zonking below- -- might change the name of a TyVarTv. This, in turn, causes trouble- -- in partial type signatures that bind scoped type variables, as- -- we bring the wrong name into scope in the function body.- -- Test case: partial-sigs/should_compile/LocalDefinitionBug- ; let tv_names = implicit_hs_tvs ++ hsLTyVarNames explicit_hs_tvs- -- Spit out the wildcards (including the extra-constraints one) -- as "hole" constraints, so that they'll be reported if necessary -- See Note [Extra-constraint holes in partial type signatures]- ; emitWildCardHoleConstraints wcs-- -- The TyVarTvs created above will sometimes have too high a TcLevel- -- (note that they are generated *after* bumping the level in- -- the tc{Im,Ex}plicitTKBndrsSig functions. Bumping the level- -- is still important here, because the kinds of these variables- -- do indeed need to have the higher level, so they can unify- -- with other local type variables. But, now that we've type-checked- -- everything (and solved equalities in the tcImplicit call)- -- we need to promote the TyVarTvs so we don't violate the TcLevel- -- invariant- ; implicit_tvs <- zonkAndScopedSort implicit_tvs- ; explicit_tvs <- mapM zonkAndSkolemise explicit_tvs- ; theta <- mapM zonkTcType theta- ; tau <- zonkTcType tau+ ; emitNamedWildCardHoleConstraints wcs - ; let all_tvs = implicit_tvs ++ explicit_tvs+ -- We return a proper (Name,TyVar) environment, to be sure that+ -- we bring the right name into scope in the function body.+ -- Test case: partial-sigs/should_compile/LocalDefinitionBug+ ; let tv_prs = (implicit_hs_tvs `zip` implicit_tvs)+ ++ (hsLTyVarNames explicit_hs_tvs `zip` explicit_tvs) - ; checkValidType ctxt (mkSpecForAllTys all_tvs $ mkPhiTy theta tau)+ -- NB: checkValidType on the final inferred type will be+ -- done later by checkInferredPolyId. We can't do it+ -- here because we don't have a complete tuype to check - ; traceTc "tcHsPartialSigType" (ppr all_tvs)- ; return (wcs, wcx, tv_names, all_tvs, theta, tau) }+ ; traceTc "tcHsPartialSigType" (ppr tv_prs)+ ; return (wcs, wcx, tv_prs, theta, tau) } tcHsPartialSigType _ (HsWC _ (XHsImplicitBndrs _)) = panic "tcHsPartialSigType" tcHsPartialSigType _ (XHsWildCardBndrs _) = panic "tcHsPartialSigType"@@ -2538,14 +2636,43 @@ | Just (hs_theta1, hs_ctxt_last) <- snocView hs_theta , L wc_loc wc@(HsWildCardTy _) <- ignoreParens hs_ctxt_last = do { wc_tv_ty <- setSrcSpan wc_loc $- tcWildCardOcc wc constraintKind+ tcAnonWildCardOcc wc constraintKind ; theta <- mapM tcLHsPredType hs_theta1 ; return (theta, Just wc_tv_ty) } | otherwise = do { theta <- mapM tcLHsPredType hs_theta ; return (theta, Nothing) } -{- Note [Extra-constraint holes in partial type signatures]+{- Note [Checking partial type signatures]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+See also Note [Recipe for checking a signature]++When we have a parital signature like+ f,g :: forall a. a -> _+we do the following++* In TcSigs.tcUserSigType we return a PartialSig, which (unlike+ the companion CompleteSig) contains the original, as-yet-unchecked+ source-code LHsSigWcType++* Then, for f and g /separately/, we call tcInstSig, which in turn+ call tchsPartialSig (defined near this Note). It kind-checks the+ LHsSigWcType, creating fresh unification variables for each "_"+ wildcard. It's important that the wildcards for f and g are distinct+ becase they migh get instantiated completely differently. E.g.+ f,g :: forall a. a -> _+ f x = a+ g x = True+ It's really as if we'd written two distinct signatures.++* Note that we don't make quantified type (forall a. blah) and then+ instantiate it -- it makes no sense to instantiate a type with+ wildcards in it. Rather, tcHsPartialSigType just returns the+ 'a' and the 'blah' separately.++ Nor, for the same reason, do we push a level in tcHsPartialSigType.++Note [Extra-constraint holes in partial type signatures] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Consider f :: (_) => a -> a@@ -2614,12 +2741,12 @@ -- Always solve local equalities if possible, -- else casts get in the way of deep skolemisation -- (#16033)- tcWildCardBinders sig_wcs $ \ wcs ->+ tcNamedWildCardBinders sig_wcs $ \ wcs -> tcExtendNameTyVarEnv sig_tkv_prs $ do { sig_ty <- tcHsOpenType hs_ty ; return (wcs, sig_ty) } - ; emitWildCardHoleConstraints wcs+ ; emitNamedWildCardHoleConstraints wcs -- sig_ty might have tyvars that are at a higher TcLevel (if hs_ty -- contains a forall). Promote these.
compiler/typecheck/TcInstDcls.hs view
@@ -472,8 +472,7 @@ , cid_datafam_insts = adts })) = setSrcSpan loc $ addErrCtxt (instDeclCtxt1 hs_ty) $- do { traceTc "tcLocalInstDecl" (ppr hs_ty)- ; dfun_ty <- tcHsClsInstType (InstDeclCtxt False) hs_ty+ do { dfun_ty <- tcHsClsInstType (InstDeclCtxt False) hs_ty ; let (tyvars, theta, clas, inst_tys) = tcSplitDFunTy dfun_ty -- NB: tcHsClsInstType does checkValidInstance @@ -660,10 +659,10 @@ ; gadt_syntax <- dataDeclChecks fam_name new_or_data hs_ctxt hs_cons -- Do /not/ check that the number of patterns = tyConArity fam_tc -- See [Arity of data families] in FamInstEnv- ; (qtvs, pats, res_kind, stupid_theta) <- tcDataFamHeader mb_clsinfo fam_tc imp_vars mb_bndrs fixity hs_ctxt hs_pats m_ksig hs_cons+ new_or_data -- Eta-reduce the axiom if possible -- Quite tricky: see Note [Eta-reduction for data families]@@ -679,13 +678,16 @@ -- first, so there is no reason to suppose that the eta_tvs -- (obtained from the pats) are at the end (#11148) - -- Eta-expand the representation tycon until it has reult kind *+ -- Eta-expand the representation tycon until it has result+ -- kind `TYPE r`, for some `r`. If UnliftedNewtypes is not enabled, we+ -- go one step further and ensure that it has kind `TYPE 'LiftedRep`.+ -- -- See also Note [Arity of data families] in FamInstEnv -- NB: we can do this after eta-reducing the axiom, because if -- we did it before the "extra" tvs from etaExpandAlgTyCon -- would always be eta-reduced ; (extra_tcbs, final_res_kind) <- etaExpandAlgTyCon full_tcbs res_kind- ; checkTc (tcIsLiftedTypeKind final_res_kind) (badKindSig True res_kind)+ ; checkDataKindSig (DataInstanceSort new_or_data) final_res_kind ; let extra_pats = map (mkTyVarTy . binderVar) extra_tcbs all_pats = pats `chkAppend` extra_pats orig_res_ty = mkTyConApp fam_tc all_pats@@ -703,9 +705,10 @@ ; (rep_tc, axiom) <- fixM $ \ ~(rec_rep_tc, _) -> do { data_cons <- tcExtendTyVarEnv qtvs $- -- For H98 decls, the tyvars scope- -- over the data constructors- tcConDecls rec_rep_tc ty_binders orig_res_ty hs_cons+ -- For H98 decls, the tyvars scope+ -- over the data constructors+ tcConDecls rec_rep_tc new_or_data ty_binders final_res_kind+ orig_res_ty hs_cons ; rep_tc_name <- newFamInstTyConName lfam_name pats ; axiom_name <- newFamInstAxiomName lfam_name [pats]@@ -722,7 +725,7 @@ -- NB: Use the full ty_binders from the pats. See bullet toward -- the end of Note [Data type families] in TyCon rep_tc = mkAlgTyCon rep_tc_name- ty_binders liftedTypeKind+ ty_binders final_res_kind (map (const Nominal) ty_binders) (fmap unLoc cType) stupid_theta tc_rhs parent@@ -782,12 +785,14 @@ tcDataFamHeader :: AssocInstInfo -> TyCon -> [Name] -> Maybe [LHsTyVarBndr GhcRn] -> LexicalFixity -> LHsContext GhcRn -> HsTyPats GhcRn -> Maybe (LHsKind GhcRn) -> [LConDecl GhcRn]+ -> NewOrData -> TcM ([TyVar], [Type], Kind, ThetaType) -- The "header" is the part other than the data constructors themselves -- e.g. data instance D [a] :: * -> * where ... -- Here the "header" is the bit before the "where"-tcDataFamHeader mb_clsinfo fam_tc imp_vars mb_bndrs fixity hs_ctxt hs_pats m_ksig hs_cons- = do { (imp_tvs, (exp_tvs, (stupid_theta, lhs_ty, res_kind)))+tcDataFamHeader mb_clsinfo fam_tc imp_vars mb_bndrs fixity hs_ctxt+ hs_pats m_ksig hs_cons new_or_data+ = do { (imp_tvs, (exp_tvs, (stupid_theta, lhs_ty))) <- pushTcLevelM_ $ solveEqualities $ bindImplicitTKBndrs_Q_Skol imp_vars $@@ -799,17 +804,16 @@ -- with its parent class ; addConsistencyConstraints mb_clsinfo lhs_ty - -- Add constraints from the data constructors- ; mapM_ (wrapLocM_ kcConDecl) hs_cons- -- Add constraints from the result signature ; res_kind <- tc_kind_sig m_ksig+ -- Add constraints from the data constructors+ ; mapM_ (wrapLocM_ (kcConDecl new_or_data res_kind)) hs_cons ; lhs_ty <- checkExpectedKind_pp pp_lhs lhs_ty lhs_kind res_kind- ; return (stupid_theta, lhs_ty, res_kind) }+ ; return (stupid_theta, lhs_ty) } -- See TcTyClsDecls Note [Generalising in tcFamTyPatsGuts] -- This code (and the stuff immediately above) is very similar- -- to that in tcFamTyInstEqnGuts. Maybe we should abstract the+ -- to that in tcTyFamInstEqnGuts. Maybe we should abstract the -- common code; but for the moment I concluded that it's -- clearer to duplicate it. Still, if you fix a bug here, -- check there too!@@ -819,22 +823,33 @@ -- Zonk the patterns etc into the Type world ; (ze, qtvs) <- zonkTyBndrs qtvs- ; lhs_ty <- zonkTcTypeToTypeX ze lhs_ty- ; res_kind <- zonkTcTypeToTypeX ze res_kind+ -- See Note [Unifying data family kinds] about the discardCast+ ; lhs_ty <- zonkTcTypeToTypeX ze (discardCast lhs_ty) ; stupid_theta <- zonkTcTypesToTypesX ze stupid_theta -- Check that type patterns match the class instance head- ; let pats = unravelFamInstPats lhs_ty- ; return (qtvs, pats, res_kind, stupid_theta) }+ -- The call to splitTyConApp_maybe here is just an inlining of+ -- the body of unravelFamInstPats.+ ; pats <- case splitTyConApp_maybe lhs_ty of+ Just (_, pats) -> pure pats+ Nothing -> pprPanic "tcDataFamHeader" (ppr lhs_ty)+ ; return (qtvs, pats, typeKind lhs_ty, stupid_theta) }+ -- See Note [Unifying data family kinds] about why we need typeKind here where fam_name = tyConName fam_tc data_ctxt = DataKindCtxt fam_name pp_lhs = pprHsFamInstLHS fam_name mb_bndrs hs_pats fixity hs_ctxt exp_bndrs = mb_bndrs `orElse` [] - -- See Note [Result kind signature for a data family instance]+ -- See Note [Implementation of UnliftedNewtypes] in TcTyClsDecls, wrinkle (2). tc_kind_sig Nothing- = return liftedTypeKind+ = do { unlifted_newtypes <- xoptM LangExt.UnliftedNewtypes+ ; if unlifted_newtypes && new_or_data == NewType+ then newOpenTypeKind+ else pure liftedTypeKind+ }++ -- See Note [Result kind signature for a data family instance] tc_kind_sig (Just hs_kind) = do { sig_kind <- tcLHsKindSig data_ctxt hs_kind ; let (tvs, inner_kind) = tcSplitForAllTys sig_kind@@ -851,6 +866,36 @@ we actually have a place to put the regeneralised variables. Thus: skolemise away. cf. Inst.deeplySkolemise and TcUnify.tcSkolemise Examples in indexed-types/should_compile/T12369++Note [Unifying data family kinds]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+When we kind-check a newtype instance with -XUnliftedNewtypes, we must+unify the kind of the data family with any declared kind in the instance+declaration. For example:++ data Color = Red | Blue+ type family Interpret (x :: Color) :: RuntimeRep where+ Interpret 'Red = 'IntRep+ Interpret 'Blue = 'WordRep+ data family Foo (x :: Color) :: TYPE (Interpret x)+ newtype instance Foo 'Red :: TYPE IntRep where+ FooRedC :: Int# -> Foo 'Red++We end up unifying `TYPE (Interpret 'Red)` (the kind of Foo, instantiated+with 'Red) and `TYPE IntRep` (the declared kind of the instance). This+unification succeeds, resulting in a coercion. The big question: what to+do with this coercion? Answer: nothing! A kind annotation on a newtype instance+is always redundant (except, perhaps, in that it helps guide unification). We+have a definitive kind for the data family from the data family declaration,+and so we learn nothing really new from the kind signature on an instance.+We still must perform this unification (done in the call to checkExpectedKind+toward the beginning of tcDataFamHeader), but the result is unhelpful. If there+is a cast, it will wrap the lhs_ty, and so we just drop it before splitting the+lhs_ty to reveal the underlying patterns. Because of the potential of dropping+a cast like this, we just use typeKind in the result instead of propagating res_kind+from above.++This Note is wrinkle (3) in Note [Implementation of UnliftedNewtypes] in TcTyClsDecls. Note [Eta-reduction for data families] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compiler/typecheck/TcMType.hs view
@@ -80,6 +80,7 @@ zonkCt, zonkSkolemInfo, tcGetGlobalTyCoVars,+ skolemiseUnboundMetaTyVar, ------------------------------ -- Levity polymorphism@@ -834,14 +835,14 @@ -- Everything from here on only happens if DEBUG is on | not (isTcTyVar tyvar)- = WARN( True, text "Writing to non-tc tyvar" <+> ppr tyvar )+ = ASSERT2( False, text "Writing to non-tc tyvar" <+> ppr tyvar ) return () | MetaTv { mtv_ref = ref } <- tcTyVarDetails tyvar = writeMetaTyVarRef tyvar ref ty | otherwise- = WARN( True, text "Writing to non-meta tyvar" <+> ppr tyvar )+ = ASSERT2( False, text "Writing to non-meta tyvar" <+> ppr tyvar ) return () --------------------@@ -1094,18 +1095,18 @@ forall arg. ... (alpha[tau]:arg) ... We have a metavariable alpha whose kind mentions a skolem variable-boudn inside the very type we are generalising.+bound inside the very type we are generalising. This can arise while type-checking a user-written type signature (see the test case for the full code). We cannot generalise over alpha! That would produce a type like forall {a :: arg}. forall arg. ...blah... The fact that alpha's kind mentions arg renders it completely-ineligible for generaliation.+ineligible for generalisation. However, we are not going to learn any new constraints on alpha,-because its kind isn't even in scope in the outer context. So alpha-is entirely unconstrained.+because its kind isn't even in scope in the outer context (but see Wrinkle).+So alpha is entirely unconstrained. What then should we do with alpha? During generalization, every metavariable is either (A) promoted, (B) generalized, or (C) zapped@@ -1126,6 +1127,17 @@ generalisation, because at that moment we have a clear picture of what skolems are in scope. +Wrinkle:++We must make absolutely sure that alpha indeed is not+from an outer context. (Otherwise, we might indeed learn more information+about it.) This can be done easily: we just check alpha's TcLevel.+That level must be strictly greater than the ambient TcLevel in order+to treat it as naughty. We say "strictly greater than" because the call to+candidateQTyVars is made outside the bumped TcLevel, as stated in the+comment to candidateQTyVarsOfType. The level check is done in go_tv+in collect_cant_qtvs. Skipping this check caused #16517.+ -} data CandidatesQTvs@@ -1173,13 +1185,17 @@ -- | Gathers free variables to use as quantification candidates (in -- 'quantifyTyVars'). This might output the same var -- in both sets, if it's used in both a type and a kind.+-- The variables to quantify must have a TcLevel strictly greater than+-- the ambient level. (See Wrinkle in Note [Naughty quantification candidates]) -- See Note [CandidatesQTvs determinism and order] -- See Note [Dependent type variables] candidateQTyVarsOfType :: TcType -- not necessarily zonked -> TcM CandidatesQTvs candidateQTyVarsOfType ty = collect_cand_qtvs False emptyVarSet mempty ty --- | Like 'splitDepVarsOfType', but over a list of types+-- | Like 'candidateQTyVarsOfType', but over a list of types+-- The variables to quantify must have a TcLevel strictly greater than+-- the ambient level. (See Wrinkle in Note [Naughty quantification candidates]) candidateQTyVarsOfTypes :: [Type] -> TcM CandidatesQTvs candidateQTyVarsOfTypes tys = foldlM (collect_cand_qtvs False emptyVarSet) mempty tys @@ -1203,7 +1219,7 @@ collect_cand_qtvs :: Bool -- True <=> consider every fv in Type to be dependent- -> VarSet -- Bound variables (both locally bound and globally bound)+ -> VarSet -- Bound variables (locals only) -> CandidatesQTvs -- Accumulating parameter -> Type -- Not necessarily zonked -> TcM CandidatesQTvs@@ -1248,17 +1264,27 @@ ----------------- go_tv dv@(DV { dv_kvs = kvs, dv_tvs = tvs }) tv- | tv `elemDVarSet` kvs = return dv -- We have met this tyvar aleady+ | tv `elemDVarSet` kvs+ = return dv -- We have met this tyvar aleady+ | not is_dep- , tv `elemDVarSet` tvs = return dv -- We have met this tyvar aleady+ , tv `elemDVarSet` tvs+ = return dv -- We have met this tyvar aleady+ | otherwise = do { tv_kind <- zonkTcType (tyVarKind tv) -- This zonk is annoying, but it is necessary, both to -- ensure that the collected candidates have zonked kinds -- (#15795) and to make the naughty check -- (which comes next) works correctly- ; if intersectsVarSet bound (tyCoVarsOfType tv_kind) + ; cur_lvl <- getTcLevel+ ; if tcTyVarLevel tv `strictlyDeeperThan` cur_lvl &&+ -- this tyvar is from an outer context: see Wrinkle+ -- in Note [Naughty quantification candidates]++ intersectsVarSet bound (tyCoVarsOfType tv_kind)+ then -- See Note [Naughty quantification candidates] do { traceTc "Zapping naughty quantifier" (pprTyVar tv) ; writeMetaTyVar tv (anyTypeOfKind tv_kind)@@ -1407,9 +1433,9 @@ -- NB: All variables in the kind of a covar must not be -- quantified over, as we don't quantify over the covar. - dep_kvs = dVarSetElemsWellScoped $+ dep_kvs = scopedSort $ dVarSetElems $ dep_tkvs `dVarSetMinusVarSet` mono_tvs- -- dVarSetElemsWellScoped: put the kind variables into+ -- scopedSort: put the kind variables into -- well-scoped order. -- E.g. [k, (a::k)] not the other way roud @@ -1427,7 +1453,7 @@ -- This block uses level numbers to decide what to quantify -- and emits a warning if the two methods do not give the same answer- ; let dep_kvs2 = dVarSetElemsWellScoped $+ ; let dep_kvs2 = scopedSort $ dVarSetElems $ filterDVarSet (quantifiableTv outer_tclvl) dep_tkvs nondep_tvs2 = filter (quantifiableTv outer_tclvl) $ dVarSetElems (nondep_tkvs `minusDVarSet` dep_tkvs)
compiler/typecheck/TcPluginM.hs view
@@ -3,7 +3,7 @@ -- access select functions of the 'TcM', principally those to do with -- reading parts of the state. module TcPluginM (-#if defined(GHCI)+#if defined(HAVE_INTERPRETER) -- * Basic TcPluginM functionality TcPluginM, tcPluginIO,@@ -52,7 +52,7 @@ #endif ) where -#if defined(GHCI)+#if defined(HAVE_INTERPRETER) import GhcPrelude import qualified TcRnMonad as TcM
compiler/typecheck/TcRnDriver.hs view
@@ -61,7 +61,6 @@ import RnUtils ( HsDocContext(..) ) import RnFixity ( lookupFixityRn ) import MkId-import TidyPgm ( globaliseAndTidyId ) import TysWiredIn ( unitTy, mkListTy ) import Plugins import DynFlags@@ -141,6 +140,9 @@ import Control.DeepSeq import Control.Monad +import TcHoleFitTypes ( HoleFitPluginR (..) )++ #include "HsVersions.h" {-@@ -165,7 +167,7 @@ (text "Renamer/typechecker"<+>brackets (ppr this_mod)) (const ()) $ initTc hsc_env hsc_src save_rn_syntax this_mod real_loc $- withTcPlugins hsc_env $+ withTcPlugins hsc_env $ withHoleFitPlugins hsc_env $ tcRnModuleTcRnM hsc_env mod_sum parsedModule pair @@ -1841,7 +1843,7 @@ -- Initialise the tcg_inst_env with instances from all home modules. -- This mimics the more selective call to hptInstances in tcRnImports runTcInteractive hsc_env thing_inside- = initTcInteractive hsc_env $ withTcPlugins hsc_env $+ = initTcInteractive hsc_env $ withTcPlugins hsc_env $ withHoleFitPlugins hsc_env $ do { traceTc "setInteractiveContext" $ vcat [ text "ic_tythings:" <+> vcat (map ppr (ic_tythings icxt)) , text "ic_insts:" <+> vcat (map (pprBndr LetBind . instanceDFunId) ic_insts)@@ -2418,10 +2420,11 @@ -- tcRnType just finds the kind of a type tcRnType :: HscEnv+ -> ZonkFlexi -> Bool -- Normalise the returned type -> LHsType GhcPs -> IO (Messages, Maybe (Type, Kind))-tcRnType hsc_env normalise rdr_type+tcRnType hsc_env flexi normalise rdr_type = runTcInteractive hsc_env $ setXOptM LangExt.PolyKinds $ -- See Note [Kind-generalise in tcRnType] do { (HsWC { hswc_ext = wcs, hswc_body = rn_type }, _fvs)@@ -2434,18 +2437,21 @@ -- It can have any rank or kind -- First bring into scope any wildcards ; traceTc "tcRnType" (vcat [ppr wcs, ppr rn_type])- ; ((ty, kind), lie) <-- captureTopConstraints $- tcWildCardBinders wcs $ \ wcs' ->- do { emitWildCardHoleConstraints wcs'+ ; (ty, kind) <- pushTcLevelM_ $+ -- must push level to satisfy level precondition of+ -- kindGeneralize, below+ solveEqualities $+ tcNamedWildCardBinders wcs $ \ wcs' ->+ do { emitNamedWildCardHoleConstraints wcs' ; tcLHsTypeUnsaturated rn_type }- ; _ <- checkNoErrs (simplifyInteractive lie) -- Do kind generalisation; see Note [Kind-generalise in tcRnType] ; kind <- zonkTcType kind ; kvs <- kindGeneralize kind- ; ty <- zonkTcTypeToType ty+ ; e <- mkEmptyZonkEnv flexi + ; ty <- zonkTcTypeToTypeX e ty+ -- Do validity checking on type ; checkValidType (GhciCtxt True) ty @@ -2556,7 +2562,9 @@ externaliseAndTidyId :: Module -> Id -> TcM Id externaliseAndTidyId this_mod id = do { name' <- externaliseName this_mod (idName id)- ; return (globaliseAndTidyId (setIdName id name')) }+ ; return $ globaliseId id+ `setIdName` name'+ `setIdType` tidyTopType (idType id) } {-@@ -2874,6 +2882,30 @@ getTcPlugins :: DynFlags -> [TcRnMonad.TcPlugin] getTcPlugins dflags = catMaybes $ mapPlugins dflags (\p args -> tcPlugin p args)+++withHoleFitPlugins :: HscEnv -> TcM a -> TcM a+withHoleFitPlugins hsc_env m =+ case (getHfPlugins (hsc_dflags hsc_env)) of+ [] -> m -- Common fast case+ plugins -> do (plugins,stops) <- unzip `fmap` mapM startPlugin plugins+ -- This ensures that hfPluginStop is called even if a type+ -- error occurs during compilation.+ eitherRes <- tryM $ do+ updGblEnv (\e -> e { tcg_hf_plugins = plugins }) m+ sequence_ stops+ case eitherRes of+ Left _ -> failM+ Right res -> return res+ where+ startPlugin (HoleFitPluginR init plugin stop) =+ do ref <- init+ return (plugin ref, stop ref)++getHfPlugins :: DynFlags -> [HoleFitPluginR]+getHfPlugins dflags =+ catMaybes $ mapPlugins dflags (\p args -> holeFitPlugin p args)+ runRenamerPlugin :: TcGblEnv -> HsGroup GhcRn
compiler/typecheck/TcRnMonad.hs view
@@ -75,7 +75,6 @@ askNoErrs, discardErrs, tryTcDiscardingErrs, checkNoErrs, whenNoErrs, ifErrsM, failIfErrsM,- checkTH, failTH, -- * Context management for the type checker getErrCtxt, setErrCtxt, addErrCtxt, addErrCtxtM, addLandmarkErrCtxt,@@ -104,7 +103,8 @@ pushTcLevelM_, pushTcLevelM, pushTcLevelsM, getTcLevel, setTcLevel, isTouchableTcM, getLclTypeEnv, setLclTypeEnv,- traceTcConstraints, emitWildCardHoleConstraints,+ traceTcConstraints,+ emitNamedWildCardHoleConstraints, emitAnonWildCardHoleConstraint, -- * Template Haskell context recordThUse, recordThSpliceUse, recordTopLevelSpliceLoc,@@ -312,6 +312,7 @@ tcg_safeInfer = infer_var, tcg_dependent_files = dependent_files_var, tcg_tc_plugins = [],+ tcg_hf_plugins = [], tcg_top_loc = loc, tcg_static_wc = static_wc_var, tcg_complete_matches = [],@@ -1021,17 +1022,6 @@ -- Useful to avoid error cascades failIfErrsM = ifErrsM failM (return ()) -checkTH :: a -> String -> TcRn ()-checkTH _ _ = return () -- OK--failTH :: Outputable a => a -> String -> TcRn x-failTH e what -- Raise an error in a stage-1 compiler- = failWithTc (vcat [ hang (char 'A' <+> text what- <+> text "requires GHC with interpreter support:")- 2 (ppr e)- , text "Perhaps you are using a stage-1 compiler?" ])-- {- ********************************************************************* * * Context management for the type checker@@ -1688,9 +1678,17 @@ hang (text (msg ++ ": LIE:")) 2 (ppr lie) } -emitWildCardHoleConstraints :: [(Name, TcTyVar)] -> TcM ()-emitWildCardHoleConstraints wcs+emitAnonWildCardHoleConstraint :: TcTyVar -> TcM ()+emitAnonWildCardHoleConstraint tv = do { ct_loc <- getCtLocM HoleOrigin Nothing+ ; emitInsolubles $ unitBag $+ CHoleCan { cc_ev = CtDerived { ctev_pred = mkTyVarTy tv+ , ctev_loc = ct_loc }+ , cc_hole = TypeHole (mkTyVarOcc "_") } }++emitNamedWildCardHoleConstraints :: [(Name, TcTyVar)] -> TcM ()+emitNamedWildCardHoleConstraints wcs+ = do { ct_loc <- getCtLocM HoleOrigin Nothing ; emitInsolubles $ listToBag $ map (do_one ct_loc) wcs } where@@ -1702,7 +1700,7 @@ where real_span = case nameSrcSpan name of RealSrcSpan span -> span- UnhelpfulSpan str -> pprPanic "emitWildCardHoleConstraints"+ UnhelpfulSpan str -> pprPanic "emitNamedWildCardHoleConstraints" (ppr name <+> quotes (ftext str)) -- Wildcards are defined locally, and so have RealSrcSpans ct_loc' = setCtLocSpan ct_loc real_span@@ -1837,13 +1835,13 @@ finalSafeMode dflags tcg_env = do safeInf <- fst <$> readIORef (tcg_safeInfer tcg_env) return $ case safeHaskell dflags of- Sf_None | safeInferOn dflags && safeInf -> Sf_Safe+ Sf_None | safeInferOn dflags && safeInf -> Sf_SafeInferred | otherwise -> Sf_None s -> s -- | Switch instances to safe instances if we're in Safe mode. fixSafeInstances :: SafeHaskellMode -> [ClsInst] -> [ClsInst]-fixSafeInstances sfMode | sfMode /= Sf_Safe = id+fixSafeInstances sfMode | sfMode /= Sf_Safe && sfMode /= Sf_SafeInferred = id fixSafeInstances _ = map fixSafe where fixSafe inst = let new_flag = (is_flag inst) { isSafeOverlap = True } in inst { is_flag = new_flag }
compiler/typecheck/TcSMonad.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, TypeFamilies #-}+{-# LANGUAGE CPP, DeriveFunctor, TypeFamilies #-} -- Type definitions for the constraint solver module TcSMonad (@@ -33,8 +33,10 @@ MaybeNew(..), freshGoals, isFresh, getEvExpr, newTcEvBinds, newNoTcEvBinds,- newWantedEq, emitNewWantedEq,- newWanted, newWantedEvVar, newWantedNC, newWantedEvVarNC, newDerivedNC,+ newWantedEq, newWantedEq_SI, emitNewWantedEq,+ newWanted, newWanted_SI, newWantedEvVar,+ newWantedNC, newWantedEvVarNC,+ newDerivedNC, newBoundEvVarId, unifyTyVar, unflattenFmv, reportUnifications, setEvBind, setWantedEq,@@ -2599,10 +2601,7 @@ } ----------------newtype TcS a = TcS { unTcS :: TcSEnv -> TcM a }--instance Functor TcS where- fmap f m = TcS $ fmap f . unTcS m+newtype TcS a = TcS { unTcS :: TcSEnv -> TcM a } deriving (Functor) instance Applicative TcS where pure x = TcS (\_ -> return x)@@ -3404,12 +3403,18 @@ ; return co } -- | Make a new equality CtEvidence-newWantedEq :: CtLoc -> Role -> TcType -> TcType -> TcS (CtEvidence, Coercion)-newWantedEq loc role ty1 ty2+newWantedEq :: CtLoc -> Role -> TcType -> TcType+ -> TcS (CtEvidence, Coercion)+newWantedEq = newWantedEq_SI WDeriv++newWantedEq_SI :: ShadowInfo -> CtLoc -> Role+ -> TcType -> TcType+ -> TcS (CtEvidence, Coercion)+newWantedEq_SI si loc role ty1 ty2 = do { hole <- wrapTcS $ TcM.newCoercionHole pty ; traceTcS "Emitting new coercion hole" (ppr hole <+> dcolon <+> ppr pty) ; return ( CtWanted { ctev_pred = pty, ctev_dest = HoleDest hole- , ctev_nosh = WDeriv+ , ctev_nosh = si , ctev_loc = loc} , mkHoleCo hole ) } where@@ -3417,35 +3422,44 @@ -- no equalities here. Use newWantedEq instead newWantedEvVarNC :: CtLoc -> TcPredType -> TcS CtEvidence+newWantedEvVarNC = newWantedEvVarNC_SI WDeriv++newWantedEvVarNC_SI :: ShadowInfo -> CtLoc -> TcPredType -> TcS CtEvidence -- Don't look up in the solved/inerts; we know it's not there-newWantedEvVarNC loc pty+newWantedEvVarNC_SI si loc pty = do { new_ev <- newEvVar pty ; traceTcS "Emitting new wanted" (ppr new_ev <+> dcolon <+> ppr pty $$ pprCtLoc loc) ; return (CtWanted { ctev_pred = pty, ctev_dest = EvVarDest new_ev- , ctev_nosh = WDeriv+ , ctev_nosh = si , ctev_loc = loc })} newWantedEvVar :: CtLoc -> TcPredType -> TcS MaybeNew+newWantedEvVar = newWantedEvVar_SI WDeriv++newWantedEvVar_SI :: ShadowInfo -> CtLoc -> TcPredType -> TcS MaybeNew -- For anything except ClassPred, this is the same as newWantedEvVarNC-newWantedEvVar loc pty+newWantedEvVar_SI si loc pty = do { mb_ct <- lookupInInerts loc pty ; case mb_ct of Just ctev | not (isDerived ctev) -> do { traceTcS "newWantedEvVar/cache hit" $ ppr ctev ; return $ Cached (ctEvExpr ctev) }- _ -> do { ctev <- newWantedEvVarNC loc pty+ _ -> do { ctev <- newWantedEvVarNC_SI si loc pty ; return (Fresh ctev) } } --- deals with both equalities and non equalities. Tries to look--- up non-equalities in the cache newWanted :: CtLoc -> PredType -> TcS MaybeNew-newWanted loc pty+-- Deals with both equalities and non equalities. Tries to look+-- up non-equalities in the cache+newWanted = newWanted_SI WDeriv++newWanted_SI :: ShadowInfo -> CtLoc -> PredType -> TcS MaybeNew+newWanted_SI si loc pty | Just (role, ty1, ty2) <- getEqPredTys_maybe pty- = Fresh . fst <$> newWantedEq loc role ty1 ty2+ = Fresh . fst <$> newWantedEq_SI si loc role ty1 ty2 | otherwise- = newWantedEvVar loc pty+ = newWantedEvVar_SI si loc pty -- deals with both equalities and non equalities. Doesn't do any cache lookups. newWantedNC :: CtLoc -> PredType -> TcS CtEvidence
compiler/typecheck/TcSigs.hs view
@@ -498,25 +498,14 @@ , sig_loc = loc }) = setSrcSpan loc $ -- Set the binding site of the tyvars do { traceTc "Staring partial sig {" (ppr hs_sig)- ; (wcs, wcx, tv_names, tvs, theta, tau) <- tcHsPartialSigType ctxt hs_ty-- -- Clone the quantified tyvars- -- Reason: we might have f, g :: forall a. a -> _ -> a- -- and we want it to behave exactly as if there were- -- two separate signatures. Cloning here seems like- -- the easiest way to do so, and is very similar to- -- the tcInstType in the CompleteSig case- -- See #14643- ; (subst, tvs') <- newMetaTyVarTyVars tvs- -- Why newMetaTyVarTyVars? See TcBinds- -- Note [Quantified variables in partial type signatures]- ; let tv_prs = tv_names `zip` tvs'- inst_sig = TISI { sig_inst_sig = hs_sig+ ; (wcs, wcx, tv_prs, theta, tau) <- tcHsPartialSigType ctxt hs_ty+ -- See Note [Checking partial type signatures] in TcHsType+ ; let inst_sig = TISI { sig_inst_sig = hs_sig , sig_inst_skols = tv_prs , sig_inst_wcs = wcs , sig_inst_wcx = wcx- , sig_inst_theta = substTysUnchecked subst theta- , sig_inst_tau = substTyUnchecked subst tau }+ , sig_inst_theta = theta+ , sig_inst_tau = tau } ; traceTc "End partial sig }" (ppr inst_sig) ; return inst_sig }
compiler/typecheck/TcSimplify.hs view
@@ -30,9 +30,7 @@ import Bag import Class ( Class, classKey, classTyCon )-import DynFlags ( WarningFlag ( Opt_WarnMonomorphism )- , WarnReason ( Reason )- , DynFlags( solverIterations ) )+import DynFlags import HsExpr ( UnboundVar(..) ) import Id ( idType, mkLocalId ) import Inst@@ -169,10 +167,11 @@ ; emitConstraints wanted -- See Note [Fail fast if there are insoluble kind equalities]- ; if insolubleWC wanted- then failM- else return res }+ ; when (insolubleWC wanted) $+ failM + ; return res }+ {- Note [Fail fast if there are insoluble kind equalities] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Rather like in simplifyInfer, fail fast if there is an insoluble@@ -228,12 +227,16 @@ simpl_top wanteds = do { wc_first_go <- nestTcS (solveWantedsAndDrop wanteds) -- This is where the main work happens- ; try_tyvar_defaulting wc_first_go }+ ; dflags <- getDynFlags+ ; try_tyvar_defaulting dflags wc_first_go } where- try_tyvar_defaulting :: WantedConstraints -> TcS WantedConstraints- try_tyvar_defaulting wc+ try_tyvar_defaulting :: DynFlags -> WantedConstraints -> TcS WantedConstraints+ try_tyvar_defaulting dflags wc | isEmptyWC wc = return wc+ | insolubleWC wc+ , gopt Opt_PrintExplicitRuntimeReps dflags -- See Note [Defaulting insolubles]+ = try_class_defaulting wc | otherwise = do { free_tvs <- TcS.zonkTyCoVarsAndFVList (tyCoVarsOfWCList wc) ; let meta_tvs = filter (isTyVar <&&> isMetaTyVar) free_tvs@@ -251,7 +254,7 @@ try_class_defaulting :: WantedConstraints -> TcS WantedConstraints try_class_defaulting wc- | isEmptyWC wc+ | isEmptyWC wc || insolubleWC wc -- See Note [Defaulting insolubles] = return wc | otherwise -- See Note [When to do type-class defaulting] = do { something_happened <- applyDefaultingRules wc@@ -517,6 +520,50 @@ This is ambiguous of course, but we don't want to default the (Num alpha) constraint to (Num Int)! Doing so gives a defaulting warning, but no error.++Note [Defaulting insolubles]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~+If a set of wanteds is insoluble, we have no hope of accepting the+program. Yet we do not stop constraint solving, etc., because we may+simplify the wanteds to produce better error messages. So, once+we have an insoluble constraint, everything we do is just about producing+helpful error messages.++Should we default in this case or not? Let's look at an example (tcfail004):++ (f,g) = (1,2,3)++With defaulting, we get a conflict between (a0,b0) and (Integer,Integer,Integer).+Without defaulting, we get a conflict between (a0,b0) and (a1,b1,c1). I (Richard)+find the latter more helpful. Several other test cases (e.g. tcfail005) suggest+similarly. So: we should not do class defaulting with insolubles.++On the other hand, RuntimeRep-defaulting is different. Witness tcfail078:++ f :: Integer i => i+ f = 0++Without RuntimeRep-defaulting, we GHC suggests that Integer should have kind+TYPE r0 -> Constraint and then complains that r0 is actually untouchable+(presumably, because it can't be sure if `Integer i` entails an equality).+If we default, we are told of a clash between (* -> Constraint) and Constraint.+The latter seems far better, suggesting we *should* do RuntimeRep-defaulting+even on insolubles.++But, evidently, not always. Witness UnliftedNewtypesInfinite:++ newtype Foo = FooC (# Int#, Foo #)++This should fail with an occurs-check error on the kind of Foo (with -XUnliftedNewtypes).+If we default RuntimeRep-vars, we get++ Expecting a lifted type, but ‘(# Int#, Foo #)’ is unlifted++which is just plain wrong.++Conclusion: we should do RuntimeRep-defaulting on insolubles only when the user does not+want to hear about RuntimeRep stuff -- that is, when -fprint-explicit-runtime-reps+is not set. -} ------------------
compiler/typecheck/TcTyClsDecls.hs view
@@ -37,6 +37,7 @@ import TcClassDcl import {-# SOURCE #-} TcInstDcls( tcInstDecls1 ) import TcDeriv (DerivInfo)+import TcUnify ( unifyKind ) import TcHsType import ClsInst( AssocInstInfo(..) ) import TcMType@@ -568,7 +569,7 @@ -- Running example in Note [Inferring kinds for type declarations] -- spec_req_prs = [ ("k1",kk1), ("a", (aa::kk1)) -- , ("k2",kk2), ("x", (xx::kk2))]- -- where "k1" dnotes the Name k1, and kk1, aa, etc are MetaTyVarss,+ -- where "k1" dnotes the Name k1, and kk1, aa, etc are MetaTyVars, -- specifically TyVarTvs -- Step 0: zonk and skolemise the Specified and Required binders@@ -1030,9 +1031,15 @@ , dd_ND = new_or_data } }) = do { let flav = newOrDataToFlavour new_or_data ; tc <- kcLHsQTyVars name flav cusk ktvs $- case m_sig of- Just ksig -> tcLHsKindSig (DataKindCtxt name) ksig- Nothing -> return liftedTypeKind+ -- See Note [Implementation of UnliftedNewtypes]+ do { unlifted_newtypes <- xoptM LangExt.UnliftedNewtypes+ ; case m_sig of+ Just ksig -> tcLHsKindSig (DataKindCtxt name) ksig+ Nothing+ | NewType <- new_or_data+ , unlifted_newtypes -> newOpenTypeKind+ | otherwise -> pure liftedTypeKind+ } ; return [tc] } getInitialKind cusk (FamDecl { tcdFam = decl })@@ -1127,8 +1134,13 @@ kcTyClDecl (DataDecl { tcdLName = (dL->L _ name) , tcdDataDefn = defn }) | HsDataDefn { dd_cons = cons@((dL->L _ (ConDeclGADT {})) : _)- , dd_ctxt = (dL->L _ []) } <- defn- = mapM_ (wrapLocM_ kcConDecl) cons+ , dd_ctxt = (dL->L _ [])+ , dd_ND = new_or_data } <- defn+ = do { tyCon <- kcLookupTcTyCon name+ -- See Note [Implementation of UnliftedNewtypes] STEP 2+ ; (_, final_res_kind) <- etaExpandAlgTyCon (tyConBinders tyCon) (tyConResKind tyCon)+ ; mapM_ (wrapLocM_ (kcConDecl new_or_data final_res_kind)) cons+ } -- hs_tvs and dd_kindSig already dealt with in getInitialKind -- This must be a GADT-style decl, -- (see invariants of DataDefn declaration)@@ -1136,10 +1148,14 @@ -- ConDecls bind all their own variables -- (b) dd_ctxt is not allowed for GADT-style decls, so we can ignore it - | HsDataDefn { dd_ctxt = ctxt, dd_cons = cons } <- defn+ | HsDataDefn { dd_ctxt = ctxt+ , dd_cons = cons+ , dd_ND = new_or_data } <- defn = bindTyClTyVars name $ \ _ _ ->- do { _ <- tcHsContext ctxt- ; mapM_ (wrapLocM_ kcConDecl) cons }+ do { _ <- tcHsContext ctxt+ ; tyCon <- kcLookupTcTyCon name+ ; mapM_ (wrapLocM_ (kcConDecl new_or_data (tyConResKind tyCon))) cons+ } kcTyClDecl (SynDecl { tcdLName = dL->L _ name, tcdRhs = rhs }) = bindTyClTyVars name $ \ _ res_kind ->@@ -1153,9 +1169,11 @@ do { _ <- tcHsContext ctxt ; mapM_ (wrapLocM_ kc_sig) sigs } where- kc_sig (ClassOpSig _ _ nms op_ty) = kcHsSigType nms op_ty+ kc_sig (ClassOpSig _ _ nms op_ty) = kcClassSigType skol_info nms op_ty kc_sig _ = return () + skol_info = TyConSkol ClassFlavour name+ kcTyClDecl (FamDecl _ (FamilyDecl { fdLName = (dL->L _ fam_tc_name) , fdInfo = fd_info })) -- closed type families look at their equations, but other families don't@@ -1170,23 +1188,66 @@ kcTyClDecl (XTyClDecl _) = panic "kcTyClDecl" --------------------kcConDecl :: ConDecl GhcRn -> TcM ()-kcConDecl (ConDeclH98 { con_name = name, con_ex_tvs = ex_tvs- , con_mb_cxt = ex_ctxt, con_args = args })++-- | Unify the kind of the first type provided with the newtype's kind, if+-- -XUnliftedNewtypes is enabled and the NewOrData indicates Newtype. If there+-- is more than one type provided, do nothing: the newtype is in error, and this+-- will be caught in validity checking (which will give a better error than we can+-- here.)+unifyNewtypeKind :: DynFlags+ -> NewOrData+ -> [LHsType GhcRn] -- user-written argument types, should be just 1+ -> [TcType] -- type-checked argument types, should be just 1+ -> TcKind -- expected kind of newtype+ -> TcM [TcType] -- casted argument types (should be just 1)+ -- result = orig_arg |> kind_co+ -- where kind_co :: orig_arg_ki ~N expected_ki+unifyNewtypeKind dflags NewType [hs_ty] [tc_ty] ki+ | xopt LangExt.UnliftedNewtypes dflags+ = do { traceTc "unifyNewtypeKind" (ppr hs_ty $$ ppr tc_ty $$ ppr ki)+ ; co <- unifyKind (Just (unLoc hs_ty)) (typeKind tc_ty) ki+ ; return [tc_ty `mkCastTy` co] }+ -- See comments above: just do nothing here+unifyNewtypeKind _ _ _ arg_tys _ = return arg_tys++-- Type check the types of the arguments to a data constructor.+-- This includes doing kind unification if the type is a newtype.+-- See Note [Implementation of UnliftedNewtypes] for why we need+-- the first two arguments.+kcConArgTys :: NewOrData -> Kind -> [LHsType GhcRn] -> TcM ()+kcConArgTys new_or_data res_kind arg_tys = do+ { arg_tc_tys <- mapM (tcHsOpenType . getBangType) arg_tys+ -- See Note [Implementation of UnliftedNewtypes], STEP 2+ ; dflags <- getDynFlags+ ; discardResult $+ unifyNewtypeKind dflags new_or_data arg_tys arg_tc_tys res_kind+ }++-- Kind check a data constructor. In additional to the data constructor,+-- we also need to know about whether or not its corresponding type was+-- declared with data or newtype, and we need to know the result kind of+-- this type. See Note [Implementation of UnliftedNewtypes] for why+-- we need the first two arguments.+kcConDecl ::+ NewOrData -- Was the corresponding type declared with data or newtype?+ -> Kind -- The result kind of the corresponding type constructor+ -> ConDecl GhcRn -- The data constructor+ -> TcM ()+kcConDecl new_or_data res_kind (ConDeclH98+ { con_name = name, con_ex_tvs = ex_tvs+ , con_mb_cxt = ex_ctxt, con_args = args }) = addErrCtxt (dataConCtxtName [name]) $ discardResult $ bindExplicitTKBndrs_Tv ex_tvs $ do { _ <- tcHsMbContext ex_ctxt- ; traceTc "kcConDecl {" (ppr name $$ ppr args)- ; mapM_ (tcHsOpenType . getBangType) (hsConDeclArgTys args)- ; traceTc "kcConDecl }" (ppr name)+ ; kcConArgTys new_or_data res_kind (hsConDeclArgTys args)+ -- We don't need to check the telescope here, because that's+ -- done in tcConDecl }- -- We don't need to check the telescope here, because that's- -- done in tcConDecl -kcConDecl (ConDeclGADT { con_names = names- , con_qvars = qtvs, con_mb_cxt = cxt- , con_args = args, con_res_ty = res_ty })+kcConDecl new_or_data res_kind (ConDeclGADT+ { con_names = names, con_qvars = qtvs, con_mb_cxt = cxt+ , con_args = args, con_res_ty = res_ty }) | HsQTvs { hsq_ext = implicit_tkv_nms , hsq_explicit = explicit_tkv_nms } <- qtvs = -- Even though the data constructor's type is closed, we@@ -1202,11 +1263,11 @@ bindExplicitTKBndrs_Tv explicit_tkv_nms $ -- Why "_Tv"? See Note [Kind-checking for GADTs] do { _ <- tcHsMbContext cxt- ; mapM_ (tcHsOpenType . getBangType) (hsConDeclArgTys args)+ ; kcConArgTys new_or_data res_kind (hsConDeclArgTys args) ; _ <- tcHsOpenType res_ty ; return () }-kcConDecl (XConDecl _) = panic "kcConDecl"-kcConDecl (ConDeclGADT _ _ _ (XLHsQTyVars _) _ _ _ _) = panic "kcConDecl"+kcConDecl _ _ (ConDeclGADT _ _ _ (XLHsQTyVars _) _ _ _ _) = panic "kcConDecl"+kcConDecl _ _ (XConDecl _) = panic "kcConDecl" {- Note [Recursion and promoting data constructors]@@ -1352,6 +1413,112 @@ and take the wired-in information. That avoids complications. e.g. the need to make the data constructor worker name for a constraint tuple match the wired-in one++Note [Implementation of UnliftedNewtypes]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+Expected behavior of UnliftedNewtypes:++* Proposal: https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0013-unlifted-newtypes.rst+* Discussion: https://github.com/ghc-proposals/ghc-proposals/pull/98++What follows is a high-level overview of the implementation of the+proposal.++STEP 1: Getting the initial kind, as done by getInitialKind. We have+two sub-cases (assuming we have a newtype and -XUnliftedNewtypes is enabled):++* With a CUSK: no change in kind-checking; the tycon is given the kind+ the user writes, whatever it may be.++* Without a CUSK: If there is no kind signature, the tycon is given+ a kind `TYPE r`, for a fresh unification variable `r`.++STEP 2: Kind-checking, as done by kcTyClDecl. This step is skipped for CUSKs.+The key function here is kcConDecl, which looks at an individual constructor+declaration. In the unlifted-newtypes case (i.e., -XUnliftedNewtypes and,+indeed, we are processing a newtype), we call unifyNewtypeKind, which is a+thin wrapper around unifyKind, unifying the kind of the one argument and the+result kind of the newtype tycon.++Examples of newtypes affected by STEP 2, assuming -XUnliftedNewtypes is+enabled (we use r0 to denote a unification variable):++newtype Foo rep = MkFoo (forall (a :: TYPE rep). a)++ kcConDecl unifies (TYPE r0) with (TYPE rep), where (TYPE r0)+ is the kind that getInitialKind invented for (Foo rep).++data Color = Red | Blue+type family Interpret (x :: Color) :: RuntimeRep where+ Interpret 'Red = 'IntRep+ Interpret 'Blue = 'WordRep+data family Foo (x :: Color) :: TYPE (Interpret x)+newtype instance Foo 'Red = FooRedC Int#++ kcConDecl unifies TYPE (Interpret 'Red) with TYPE 'IntRep++Note that, in the GADT case, we might have a kind signature with arrows+(newtype XYZ a b :: Type -> Type where ...). We want only the final+component of the kind for checking in kcConDecl, so we call etaExpandAlgTyCon+in kcTyClDecl.++STEP 3: Type-checking (desugaring), as done by tcTyClDecl. The key function+here is tcConDecl. Once again, we must call unifyNewtypeKind, for two reasons:++ A. It is possible that a GADT has a CUSK. (Note that this is *not*+ possible for H98 types. Recall that CUSK types don't go through+ kcTyClDecl, so we might not have done this kind check.+ B. We need to produce the coercion to put on the argument type+ if the kinds are different (for both H98 and GADT).++Example of (B):++type family F a where+ F Int = LiftedRep++newtype N :: TYPE (F Int) where+ MkN :: Int -> N++We really need to have the argument to MkN be (Int |> TYPE (sym axF)), where+axF :: F Int ~ LiftedRep. That way, the argument kind is the same as the+newtype kind, which is the principal correctness condition for newtypes.+This call to unifyNewtypeKind is what produces that coercion.++Note that this is possible in the H98 case only for a data family, because+the H98 syntax doesn't permit a kind signature on the newtype itself.+++1. In tcFamDecl1, we suppress a tcIsLiftedTypeKind check if+ UnliftedNewtypes is on. This allows us to write things like:+ data family Foo :: TYPE 'IntRep++2. In a newtype instance (with -XUnliftedNewtypes), if the user does+ not write a kind signature, we want to allow the possibility that+ the kind is not Type, so we use newOpenTypeKind instead of liftedTypeKind.+ This is done in tcDataFamHeader in TcInstDcls. Example:++ data family Bar (a :: RuntimeRep) :: TYPE a+ newtype instance Bar 'IntRep = BarIntC Int#+ newtype instance Bar 'WordRep :: TYPE 'WordRep where+ BarWordC :: Word# -> Bar 'WordRep++ The data instance corresponding to IntRep does not specify a kind signature,+ so tc_kind_sig just returns `TYPE r0` (where `r0` is a fresh metavariable).+ The data instance corresponding to WordRep does have a kind signature, so+ we use that kind signature.++3. A data family and its newtype instance may be declared with slightly+ different kinds. See Note [Unifying data family kinds] in TcInstDcls.++There's also a change in the renamer:++* In RnSource.rnTyClDecl, enabling UnliftedNewtypes changes what is means+ for a newtype to have a CUSK. This is necessary since UnliftedNewtypes+ means that, for newtypes without kind signatures, we must use the field+ inside the data constructor to determine the result kind.+ See Note [Unlifted Newtypes and CUSKs] for more detail.++For completeness, it was also neccessary to make coerce work on+unlifted types, resolving #13595.+ -} tcTyClDecl :: RolesInfo -> LTyClDecl GhcRn -> TcM TyCon@@ -1707,11 +1874,10 @@ -- Type or a kind-variable -- For the latter, consider -- data family D a :: forall k. Type -> k+ -- When UnliftedNewtypes is enabled, we loosen this restriction+ -- on the return kind. See Note [Implementation of UnliftedNewtypes], wrinkle (1). ; let (_, final_res_kind) = splitPiTys res_kind- ; checkTc (tcIsLiftedTypeKind final_res_kind- || isJust (tcGetCastedTyVar_maybe final_res_kind))- (badKindSig False res_kind)-+ ; checkDataKindSig DataFamilySort final_res_kind ; tc_rep_name <- newTyConRepName tc_name ; let tycon = mkFamilyTyCon tc_name binders res_kind@@ -1858,10 +2024,9 @@ ; tcg_env <- getGblEnv ; (extra_bndrs, final_res_kind) <- etaExpandAlgTyCon tycon_binders res_kind- ; let hsc_src = tcg_src tcg_env ; unless (mk_permissive_kind hsc_src cons) $- checkTc (tcIsLiftedTypeKind final_res_kind) (badKindSig True res_kind)+ checkDataKindSig (DataDeclSort new_or_data) final_res_kind ; stupid_tc_theta <- pushTcLevelM_ $ solveEqualities $ tcHsContext ctxt ; stupid_theta <- zonkTcTypesToTypes stupid_tc_theta@@ -1875,8 +2040,13 @@ { let final_bndrs = tycon_binders `chkAppend` extra_bndrs res_ty = mkTyConApp tycon (mkTyVarTys (binderVars final_bndrs)) roles = roles_info tc_name-- ; data_cons <- tcConDecls tycon final_bndrs res_ty cons+ ; data_cons <- tcConDecls+ tycon+ new_or_data+ final_bndrs+ final_res_kind+ res_ty+ cons ; tc_rhs <- mk_tc_rhs hsc_src tycon data_cons ; tc_rep_nm <- newTyConRepName tc_name ; return (mkAlgTyCon tc_name@@ -1892,7 +2062,12 @@ where -- Abstract data types in hsig files can have arbitrary kinds, -- because they may be implemented by type synonyms- -- (which themselves can have arbitrary kinds, not just *)+ -- (which themselves can have arbitrary kinds, not just *). See #13955.+ --+ -- Note that this is only a property that data type declarations possess,+ -- so one could not have, say, a data family instance in an hsig file that+ -- has kind `Bool`. Therfore, this check need only occur in the code that+ -- typechecks data type declarations. mk_permissive_kind HsigFile [] = True mk_permissive_kind _ _ = False @@ -1974,11 +2149,9 @@ vis_pats = numVisibleArgs hs_pats ; checkTc (vis_pats == vis_arity) $ wrongNumberOfParmsErr vis_arity- ; (qtvs, pats, rhs_ty) <- tcTyFamInstEqnGuts fam_tc mb_clsinfo imp_vars (mb_expl_bndrs `orElse` []) hs_pats hs_rhs_ty- -- Don't print results they may be knot-tied -- (tcFamInstEqnGuts zonks to Type) ; return (mkCoAxBranch qtvs [] [] pats rhs_ty@@ -2013,7 +2186,7 @@ So, the kind-checker must return the new skolems and args (that is, Type or (Type -> Type) for the equations above) and the instantiated kind. -Note [Generalising in tcFamTyPatsGuts]+Note [Generalising in tcTyFamInstEqnGuts] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Suppose we have something like type instance forall (a::k) b. F t1 t2 = rhs@@ -2071,7 +2244,7 @@ ; rhs_ty <- tcCheckLHsType hs_rhs_ty rhs_kind ; return (lhs_ty, rhs_ty) } - -- See Note [Generalising in tcFamTyPatsGuts]+ -- See Note [Generalising in tcTyFamInstEqnGuts] -- This code (and the stuff immediately above) is very similar -- to that in tcDataFamHeader. Maybe we should abstract the -- common code; but for the moment I concluded that it's@@ -2128,15 +2301,12 @@ unravelFamInstPats fam_app = case splitTyConApp_maybe fam_app of Just (_, pats) -> pats- Nothing -> WARN( True, bad_lhs fam_app ) []+ Nothing -> panic "unravelFamInstPats: Ill-typed LHS of family instance" -- The Nothing case cannot happen for type families, because -- we don't call unravelFamInstPats until we've solved the- -- equalities. For data families I wasn't quite as convinced- -- so I've let it as a warning rather than a panic.- where- bad_lhs fam_app- = hang (text "Ill-typed LHS of family instance")- 2 (debugPprType fam_app)+ -- equalities. For data families, it shouldn't happen either,+ -- we need to fail hard and early if it does. See trac issue #15905+ -- for an example of this happening. addConsistencyConstraints :: AssocInstInfo -> TcType -> TcM () -- In the corresponding positions of the class and type-family,@@ -2293,25 +2463,26 @@ -- All constructors have same shape ------------------------------------tcConDecls :: KnotTied TyCon -> [KnotTied TyConBinder] -> KnotTied Type- -> [LConDecl GhcRn] -> TcM [DataCon]- -- Why both the tycon tyvars and binders? Because the tyvars- -- have all the names and the binders have the visibilities.-tcConDecls rep_tycon tmpl_bndrs res_tmpl+tcConDecls :: KnotTied TyCon -> NewOrData+ -> [TyConBinder] -> TcKind -- binders and result kind of tycon+ -> KnotTied Type -> [LConDecl GhcRn] -> TcM [DataCon]+tcConDecls rep_tycon new_or_data tmpl_bndrs res_kind res_tmpl = concatMapM $ addLocM $- tcConDecl rep_tycon (mkTyConTagMap rep_tycon) tmpl_bndrs res_tmpl+ tcConDecl rep_tycon (mkTyConTagMap rep_tycon)+ tmpl_bndrs res_kind res_tmpl new_or_data -- It's important that we pay for tag allocation here, once per TyCon, -- See Note [Constructor tag allocation], fixes #14657 tcConDecl :: KnotTied TyCon -- Representation tycon. Knot-tied! -> NameEnv ConTag- -> [KnotTied TyConBinder] -> KnotTied Type- -- Return type template (with its template tyvars)- -- (tvs, T tys), where T is the family TyCon+ -> [TyConBinder] -> TcKind -- tycon binders and result kind+ -> KnotTied Type+ -- Return type template (T tys), where T is the family TyCon+ -> NewOrData -> ConDecl GhcRn -> TcM [DataCon] -tcConDecl rep_tycon tag_map tmpl_bndrs res_tmpl+tcConDecl rep_tycon tag_map tmpl_bndrs res_kind res_tmpl new_or_data (ConDeclH98 { con_name = name , con_ex_tvs = explicit_tkv_nms , con_mb_cxt = hs_ctxt@@ -2335,7 +2506,12 @@ ; btys <- tcConArgs hs_args ; field_lbls <- lookupConstructorFields (unLoc name) ; let (arg_tys, stricts) = unzip btys- ; return (ctxt, arg_tys, field_lbls, stricts)+ ; dflags <- getDynFlags+ ; final_arg_tys <-+ unifyNewtypeKind dflags new_or_data+ (hsConDeclArgTys hs_args)+ arg_tys res_kind+ ; return (ctxt, final_arg_tys, field_lbls, stricts) } -- exp_tvs have explicit, user-written binding sites@@ -2391,7 +2567,9 @@ ; mapM buildOneDataCon [name] } -tcConDecl rep_tycon tag_map tmpl_bndrs res_tmpl+tcConDecl rep_tycon tag_map tmpl_bndrs _res_kind res_tmpl new_or_data+ -- NB: don't use res_kind here, as it's ill-scoped. Instead, we get+ -- the res_kind by typechecking the result type. (ConDeclGADT { con_names = names , con_qvars = qtvs , con_mb_cxt = cxt, con_args = hs_args@@ -2410,13 +2588,19 @@ bindExplicitTKBndrs_Skol explicit_tkv_nms $ do { ctxt <- tcHsMbContext cxt ; btys <- tcConArgs hs_args- ; res_ty <- tcHsLiftedType hs_res_ty- ; field_lbls <- lookupConstructorFields name ; let (arg_tys, stricts) = unzip btys- ; return (ctxt, arg_tys, res_ty, field_lbls, stricts)+ ; res_ty <- tcHsOpenType hs_res_ty+ -- See Note [Implementation of UnliftedNewtypes]+ ; dflags <- getDynFlags+ ; final_arg_tys <-+ unifyNewtypeKind dflags new_or_data+ (hsConDeclArgTys hs_args)+ arg_tys (typeKind res_ty)+ ; field_lbls <- lookupConstructorFields name+ ; return (ctxt, final_arg_tys, res_ty, field_lbls, stricts) } ; imp_tvs <- zonkAndScopedSort imp_tvs- ; let user_tvs = imp_tvs ++ exp_tvs+ ; let user_tvs = imp_tvs ++ exp_tvs ; tkvs <- kindGeneralize (mkSpecForAllTys user_tvs $ mkPhiTy ctxt $@@ -2469,9 +2653,9 @@ ; traceTc "tcConDecl 2" (ppr names) ; mapM buildOneDataCon names }-tcConDecl _ _ _ _ (ConDeclGADT _ _ _ (XLHsQTyVars _) _ _ _ _)+tcConDecl _ _ _ _ _ _ (ConDeclGADT _ _ _ (XLHsQTyVars _) _ _ _ _) = panic "tcConDecl"-tcConDecl _ _ _ _ (XConDecl _) = panic "tcConDecl"+tcConDecl _ _ _ _ _ _ (XConDecl _) = panic "tcConDecl" tcConIsInfixH98 :: Name -> HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])@@ -2578,11 +2762,10 @@ rejigConRes :: [KnotTied TyConBinder] -> KnotTied Type -- Template for result type; e.g. -- data instance T [a] b c ... -- gives template ([a,b,c], T [a] b c)- -- Type must be of kind *! -> [TyVar] -- The constructor's inferred type variables -> [TyVar] -- The constructor's user-written, specified -- type variables- -> KnotTied Type -- res_ty type must be of kind *+ -> KnotTied Type -- res_ty -> ([TyVar], -- Universal [TyVar], -- Existential (distinct OccNames from univs) [TyVar], -- The constructor's rejigged, user-written,@@ -2611,9 +2794,7 @@ -- So we return ( [a,b,z], [x,y] -- , [], [x,y,z] -- , [a~(x,y),b~z], <arg-subst> )- | Just subst <- ASSERT( isLiftedTypeKind (tcTypeKind res_ty) )- ASSERT( isLiftedTypeKind (tcTypeKind res_tmpl) )- tcMatchTy res_tmpl res_ty+ | Just subst <- tcMatchTy res_tmpl res_ty = let (univ_tvs, raw_eqs, kind_subst) = mkGADTVars tmpl_tvs dc_tvs subst raw_ex_tvs = dc_tvs `minusList` univ_tvs (arg_subst, substed_ex_tvs) = substTyVarBndrs kind_subst raw_ex_tvs@@ -3151,9 +3332,14 @@ -- Check all argument types for validity ; checkValidType ctxt (dataConUserType con)- ; mapM_ (checkForLevPoly empty)- (dataConOrigArgTys con) + -- If we are dealing with a newtype, we allow levity polymorphism+ -- regardless of whether or not UnliftedNewtypes is enabled. A+ -- later check in checkNewDataCon handles this, producing a+ -- better error message than checkForLevPoly would.+ ; unless (isNewTyCon tc)+ (mapM_ (checkForLevPoly empty) (dataConOrigArgTys con))+ -- Extra checks for newtype data constructors ; when (isNewTyCon tc) (checkNewDataCon con) @@ -3235,8 +3421,13 @@ = do { checkTc (isSingleton arg_tys) (newtypeFieldErr con (length arg_tys)) -- One argument - ; checkTc (not (isUnliftedType arg_ty1)) $- text "A newtype cannot have an unlifted argument type"+ ; unlifted_newtypes <- xoptM LangExt.UnliftedNewtypes+ ; let allowedArgType =+ unlifted_newtypes || isLiftedType_maybe arg_ty1 == Just True+ ; checkTc allowedArgType $ vcat+ [ text "A newtype cannot have an unlifted argument type"+ , text "Perhaps you intended to use UnliftedNewtypes"+ ] ; check_con (null eq_spec) $ text "A newtype constructor must have a return type of form T a1 ... an"
compiler/typecheck/TcTyDecls.hs view
@@ -10,6 +10,7 @@ -} {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE ViewPatterns #-} @@ -149,12 +150,10 @@ -- a failure message reporting that a cycle was found. newtype SynCycleM a = SynCycleM { runSynCycleM :: SynCycleState -> Either (SrcSpan, SDoc) (a, SynCycleState) }+ deriving (Functor) type SynCycleState = NameSet -instance Functor SynCycleM where- fmap = liftM- instance Applicative SynCycleM where pure x = SynCycleM $ \state -> Right (x, state) (<*>) = ap@@ -677,9 +676,7 @@ -> Int -- size of VarPositions -> RoleInferenceState -> (a, RoleInferenceState) }--instance Functor RoleM where- fmap = liftM+ deriving (Functor) instance Applicative RoleM where pure x = RM $ \_ _ _ state -> (x, state)
compiler/typecheck/TcTypeable.hs view
@@ -21,6 +21,7 @@ import TcEnv import TcEvidence ( mkWpTyApps ) import TcRnMonad+import TcTypeableValidity import HscTypes ( lookupId ) import PrelNames import TysPrim ( primTyCons )@@ -45,7 +46,6 @@ import Control.Monad.Trans.State import Control.Monad.Trans.Class (lift)-import Data.Maybe ( isJust ) import Data.Word( Word64 ) {- Note [Grand plan for Typeable]@@ -411,36 +411,6 @@ let tycon_rep_rhs = mkTyConRepTyConRHS stuff todo tycon kind_rep tycon_rep_bind = mkVarBind tycon_rep_id tycon_rep_rhs return $ unitBag tycon_rep_bind---- | Here is where we define the set of Typeable types. These exclude type--- families and polytypes.-tyConIsTypeable :: TyCon -> Bool-tyConIsTypeable tc =- isJust (tyConRepName_maybe tc)- && typeIsTypeable (dropForAlls $ tyConKind tc)- -- Ensure that the kind of the TyCon, with its initial foralls removed,- -- is representable (e.g. has no higher-rank polymorphism or type- -- synonyms).---- | Is a particular 'Type' representable by @Typeable@? Here we look for--- polytypes and types containing casts (which may be, for instance, a type--- family).-typeIsTypeable :: Type -> Bool--- We handle types of the form (TYPE rep) specifically to avoid--- looping on (tyConIsTypeable RuntimeRep)-typeIsTypeable ty- | Just ty' <- coreView ty = typeIsTypeable ty'-typeIsTypeable ty- | isJust (kindRep_maybe ty) = True-typeIsTypeable (TyVarTy _) = True-typeIsTypeable (AppTy a b) = typeIsTypeable a && typeIsTypeable b-typeIsTypeable (FunTy _ a b) = typeIsTypeable a && typeIsTypeable b-typeIsTypeable (TyConApp tc args) = tyConIsTypeable tc- && all typeIsTypeable args-typeIsTypeable (ForAllTy{}) = False-typeIsTypeable (LitTy _) = True-typeIsTypeable (CastTy{}) = False-typeIsTypeable (CoercionTy{}) = False -- | Maps kinds to 'KindRep' bindings. This binding may either be defined in -- some other module (in which case the @Maybe (LHsExpr Id@ will be 'Nothing')
+ compiler/typecheck/TcTypeableValidity.hs view
@@ -0,0 +1,46 @@+{-+(c) The University of Glasgow 2006+(c) The GRASP/AQUA Project, Glasgow University, 1992-1999+-}++-- | This module is separate from "TcTypeable" because the functions in this+-- module are used in "ClsInst", and importing "TcTypeable" from "ClsInst"+-- would lead to an import cycle.+module TcTypeableValidity (tyConIsTypeable, typeIsTypeable) where++import GhcPrelude++import TyCoRep+import TyCon+import Type++import Data.Maybe (isJust)++-- | Is a particular 'TyCon' representable by @Typeable@?. These exclude type+-- families and polytypes.+tyConIsTypeable :: TyCon -> Bool+tyConIsTypeable tc =+ isJust (tyConRepName_maybe tc)+ && typeIsTypeable (dropForAlls $ tyConKind tc)++-- | Is a particular 'Type' representable by @Typeable@? Here we look for+-- polytypes and types containing casts (which may be, for instance, a type+-- family).+typeIsTypeable :: Type -> Bool+-- We handle types of the form (TYPE LiftedRep) specifically to avoid+-- looping on (tyConIsTypeable RuntimeRep). We used to consider (TYPE rr)+-- to be typeable without inspecting rr, but this exhibits bad behavior+-- when rr is a type family.+typeIsTypeable ty+ | Just ty' <- coreView ty = typeIsTypeable ty'+typeIsTypeable ty+ | isLiftedTypeKind ty = True+typeIsTypeable (TyVarTy _) = True+typeIsTypeable (AppTy a b) = typeIsTypeable a && typeIsTypeable b+typeIsTypeable (FunTy _ a b) = typeIsTypeable a && typeIsTypeable b+typeIsTypeable (TyConApp tc args) = tyConIsTypeable tc+ && all typeIsTypeable args+typeIsTypeable (ForAllTy{}) = False+typeIsTypeable (LitTy _) = True+typeIsTypeable (CastTy{}) = False+typeIsTypeable (CoercionTy{}) = False
compiler/typecheck/TcUnify.hs view
@@ -6,7 +6,8 @@ Type subsumption and unification -} -{-# LANGUAGE CPP, MultiWayIf, TupleSections, ScopedTypeVariables #-}+{-# LANGUAGE CPP, DeriveFunctor, MultiWayIf, TupleSections,+ ScopedTypeVariables #-} module TcUnify ( -- Full-blown subsumption@@ -2119,9 +2120,7 @@ = MTVU_OK a | MTVU_Bad -- Forall, predicate, or type family | MTVU_Occurs--instance Functor MetaTyVarUpdateResult where- fmap = liftM+ deriving (Functor) instance Applicative MetaTyVarUpdateResult where pure = MTVU_OK
compiler/utils/AsmUtils.hs view
@@ -8,7 +8,7 @@ import GhcPrelude -import Platform+import GHC.Platform import Outputable -- | Generate a section type (e.g. @\@progbits@). See #13937.
compiler/utils/ListT.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE FlexibleInstances #-}@@ -42,6 +43,7 @@ -- layered over another monad 'm' newtype ListT m a = ListT { unListT :: forall r. (a -> m r -> m r) -> m r -> m r }+ deriving (Functor) select :: Monad m => [a] -> ListT m a select xs = foldr (<|>) mzero (map pure xs)@@ -54,9 +56,6 @@ -- failure continuations. runListT :: ListT m a -> (a -> m r -> m r) -> m r -> m r runListT = unListT--instance Functor (ListT f) where- fmap f lt = ListT $ \sk fk -> unListT lt (sk . f) fk instance Applicative (ListT f) where pure a = ListT $ \sk fk -> sk a fk
compiler/utils/State.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE UnboxedTuples #-} module State where@@ -5,10 +6,7 @@ import GhcPrelude newtype State s a = State { runState' :: s -> (# a, s #) }--instance Functor (State s) where- fmap f m = State $ \s -> case runState' m s of- (# r, s' #) -> (# f r, s' #)+ deriving (Functor) instance Applicative (State s) where pure x = State $ \s -> (# x, s #)
ghc-lib.cabal view
@@ -1,7 +1,7 @@ cabal-version: >=1.22 build-type: Simple name: ghc-lib-version: 0.20190603+version: 0.20190703 license: BSD3 license-file: LICENSE category: Development@@ -41,6 +41,7 @@ ghc-lib/stage1/compiler/build/primop-vector-tys-exports.hs-incl ghc-lib/stage1/compiler/build/primop-vector-tys.hs-incl ghc-lib/stage1/compiler/build/primop-vector-uniques.hs-incl+ ghc-lib/stage0/compiler/build/Fingerprint.hs includes/*.h includes/CodeGen.Platform.hs includes/rts/*.h@@ -59,12 +60,13 @@ default-extensions: NoImplicitPrelude include-dirs: ghc-lib/generated+ ghc-lib/stage0/compiler/build ghc-lib/stage1/compiler/build compiler compiler/utils ghc-options: -fobject-code -package=ghc-boot-th -optc-DTHREADED_RTS cc-options: -DTHREADED_RTS- cpp-options: -DSTAGE=2 -DTHREADED_RTS -DGHCI -DGHC_IN_GHCI+ cpp-options: -DSTAGE=2 -DTHREADED_RTS -DHAVE_INTERPRETER -DGHC_IN_GHCI if !os(windows) build-depends: unix else@@ -84,7 +86,7 @@ transformers == 0.5.*, process >= 1 && < 1.7, hpc == 0.6.*,- ghc-lib-parser == 0.20190603+ ghc-lib-parser == 0.20190703 build-tools: alex >= 3.1, happy >= 1.19.4 other-extensions: BangPatterns@@ -120,33 +122,35 @@ UnboxedTuples UndecidableInstances hs-source-dirs:- compiler+ ghc-lib/stage0/libraries/ghci/build+ ghc-lib/stage0/compiler/build+ ghc-lib/stage1/compiler/build+ libraries/template-haskell+ compiler/specialise+ libraries/ghc-boot+ compiler/nativeGen+ compiler/profiling+ compiler/simplCore+ compiler/typecheck compiler/backpack- compiler/cmm+ compiler/simplStg compiler/codeGen compiler/coreSyn compiler/deSugar- compiler/ghci compiler/hieFile- compiler/hsSyn- compiler/iface compiler/llvmGen- compiler/main- compiler/nativeGen compiler/prelude- compiler/profiling+ compiler/stranal compiler/rename- compiler/simplCore- compiler/simplStg- compiler/specialise compiler/stgSyn- compiler/stranal- compiler/typecheck- compiler/utils- ghc-lib/stage1/compiler/build- libraries/ghc-boot libraries/ghci- libraries/template-haskell+ compiler/hsSyn+ compiler/iface+ compiler/utils+ compiler/ghci+ compiler/main+ compiler/cmm+ compiler autogen-modules: Paths_ghc_lib reexported-modules:@@ -206,6 +210,7 @@ Fingerprint, FiniteMap, ForeignCall,+ GHC.BaseDir, GHC.Exts.Heap, GHC.Exts.Heap.ClosureTypes, GHC.Exts.Heap.Closures,@@ -220,6 +225,7 @@ GHC.LanguageExtensions.Type, GHC.Lexeme, GHC.PackageDb,+ GHC.Platform, GHC.Serialized, GHCi.BreakArray, GHCi.FFI,@@ -291,7 +297,6 @@ PipelineMonad, PlaceHolder, PlainPanic,- Platform, PlatformConstants, Plugins, PmExpr,@@ -312,6 +317,7 @@ SysTools.BaseDir, SysTools.Terminal, TcEvidence,+ TcHoleFitTypes, TcRnTypes, TcType, ToIface,@@ -426,6 +432,7 @@ FunDeps GHC GHC.HandleEncoding+ GHC.Settings GHCi GHCi.BinaryArray GHCi.CreateBCO@@ -490,6 +497,7 @@ PPC.Ppr PPC.RegInfo PPC.Regs+ PmPpr PprBase PprC PprCmm@@ -642,6 +650,7 @@ TcTyDecls TcTypeNats TcTypeable+ TcTypeableValidity TcUnify TcValidity TidyPgm@@ -671,7 +680,7 @@ hs-source-dirs: ghc ghc-options: -fobject-code -package=ghc-boot-th -optc-DTHREADED_RTS cc-options: -DTHREADED_RTS- cpp-options: -DGHCI -DTHREADED_RTS -DGHC_LOADED_INTO_GHCI+ cpp-options: -DHAVE_INTERPRETER -DTHREADED_RTS -DGHC_LOADED_INTO_GHCI other-modules: GHCi.Leak GHCi.UI
ghc-lib/generated/ghcautoconf.h view
@@ -1,4 +1,4 @@-#ifndef __GHCAUTOCONF_H__+#if !defined(__GHCAUTOCONF_H__) #define __GHCAUTOCONF_H__ /* mk/config.h. Generated from config.h.in by configure. */ /* mk/config.h.in. Generated from configure.ac by autoheader. */@@ -526,7 +526,7 @@ /* #undef pid_t */ /* The supported LLVM version number */-#define sUPPORTED_LLVM_VERSION (7,0)+#define sUPPORTED_LLVM_VERSION (7) /* Define to `unsigned int' if <sys/types.h> does not define. */ /* #undef size_t */
ghc-lib/generated/ghcplatform.h view
@@ -1,4 +1,4 @@-#ifndef __GHCPLATFORM_H__+#if !defined(__GHCPLATFORM_H__) #define __GHCPLATFORM_H__ #define BuildPlatform_TYPE x86_64_apple_darwin
ghc-lib/generated/ghcversion.h view
@@ -1,12 +1,12 @@-#ifndef __GHCVERSION_H__+#if !defined(__GHCVERSION_H__) #define __GHCVERSION_H__ -#ifndef __GLASGOW_HASKELL__+#if !defined(__GLASGOW_HASKELL__) # define __GLASGOW_HASKELL__ 809 #endif #define __GLASGOW_HASKELL_PATCHLEVEL1__ 0-#define __GLASGOW_HASKELL_PATCHLEVEL2__ 20190603+#define __GLASGOW_HASKELL_PATCHLEVEL2__ 20190703 #define MIN_VERSION_GLASGOW_HASKELL(ma,mi,pl1,pl2) (\ ((ma)*100+(mi)) < __GLASGOW_HASKELL__ || \
+ ghc-lib/stage0/compiler/build/Fingerprint.hs view
@@ -0,0 +1,48 @@+{-# LINE 1 "compiler/utils/Fingerprint.hsc" #-}+{-# LANGUAGE CPP #-}++-- ----------------------------------------------------------------------------+--+-- (c) The University of Glasgow 2006+--+-- Fingerprints for recompilation checking and ABI versioning.+--+-- https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/recompilation-avoidance+--+-- ----------------------------------------------------------------------------++module Fingerprint (+ readHexFingerprint,+ fingerprintByteString,+ -- * Re-exported from GHC.Fingerprint+ Fingerprint(..), fingerprint0,+ fingerprintFingerprints,+ fingerprintData,+ fingerprintString,+ getFileHash+ ) where+++#include "HsVersions.h"++import GhcPrelude++import Foreign+import GHC.IO+import Numeric ( readHex )++import qualified Data.ByteString as BS+import qualified Data.ByteString.Unsafe as BS++import GHC.Fingerprint++-- useful for parsing the output of 'md5sum', should we want to do that.+readHexFingerprint :: String -> Fingerprint+readHexFingerprint s = Fingerprint w1 w2+ where (s1,s2) = splitAt 16 s+ [(w1,"")] = readHex s1+ [(w2,"")] = readHex (take 16 s2)++fingerprintByteString :: BS.ByteString -> Fingerprint+fingerprintByteString bs = unsafeDupablePerformIO $+ BS.unsafeUseAsCStringLen bs $ \(ptr, len) -> fingerprintData (castPtr ptr) len
+ ghc-lib/stage0/libraries/ghci/build/GHCi/InfoTable.hs view
@@ -0,0 +1,377 @@+{-# LINE 1 "libraries/ghci/GHCi/InfoTable.hsc" #-}+{-# LANGUAGE CPP, MagicHash, ScopedTypeVariables #-}++-- Get definitions for the structs, constants & config etc.+++-- |+-- Run-time info table support. This module provides support for+-- creating and reading info tables /in the running program/.+-- We use the RTS data structures directly via hsc2hs.+--+module GHCi.InfoTable+ (++{-# LINE 14 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ mkConInfoTable++{-# LINE 16 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ ) where++import Prelude -- See note [Why do we import Prelude here?]++{-# LINE 20 "libraries/ghci/GHCi/InfoTable.hsc" #-}+import Foreign+import Foreign.C+import GHC.Ptr+import GHC.Exts+import GHC.Exts.Heap+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS++{-# LINE 28 "libraries/ghci/GHCi/InfoTable.hsc" #-}++ghciTablesNextToCode :: Bool++{-# LINE 31 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ghciTablesNextToCode = True++{-# LINE 35 "libraries/ghci/GHCi/InfoTable.hsc" #-}+++{-# LINE 37 "libraries/ghci/GHCi/InfoTable.hsc" #-}+-- NOTE: Must return a pointer acceptable for use in the header of a closure.+-- If tables_next_to_code is enabled, then it must point the the 'code' field.+-- Otherwise, it should point to the start of the StgInfoTable.+mkConInfoTable+ :: Int -- ptr words+ -> Int -- non-ptr words+ -> Int -- constr tag+ -> Int -- pointer tag+ -> ByteString -- con desc+ -> IO (Ptr StgInfoTable)+ -- resulting info table is allocated with allocateExec(), and+ -- should be freed with freeExec().++mkConInfoTable ptr_words nonptr_words tag ptrtag con_desc =+ castFunPtrToPtr <$> newExecConItbl itbl con_desc+ where+ entry_addr = interpConstrEntry !! ptrtag+ code' = mkJumpToAddr entry_addr+ itbl = StgInfoTable {+ entry = if ghciTablesNextToCode+ then Nothing+ else Just entry_addr,+ ptrs = fromIntegral ptr_words,+ nptrs = fromIntegral nonptr_words,+ tipe = CONSTR,+ srtlen = fromIntegral tag,+ code = if ghciTablesNextToCode+ then Just code'+ else Nothing+ }+++-- -----------------------------------------------------------------------------+-- Building machine code fragments for a constructor's entry code++funPtrToInt :: FunPtr a -> Int+funPtrToInt (FunPtr a) = I# (addr2Int# a)++data Arch = ArchSPARC+ | ArchPPC+ | ArchX86+ | ArchX86_64+ | ArchAlpha+ | ArchARM+ | ArchARM64+ | ArchPPC64+ | ArchPPC64LE+ | ArchUnknown+ deriving Show++platform :: Arch+platform =++{-# LINE 96 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ ArchX86_64++{-# LINE 114 "libraries/ghci/GHCi/InfoTable.hsc" #-}++mkJumpToAddr :: EntryFunPtr -> ItblCodes+mkJumpToAddr a = case platform of+ ArchSPARC ->+ -- After some consideration, we'll try this, where+ -- 0x55555555 stands in for the address to jump to.+ -- According to includes/rts/MachRegs.h, %g3 is very+ -- likely indeed to be baggable.+ --+ -- 0000 07155555 sethi %hi(0x55555555), %g3+ -- 0004 8610E155 or %g3, %lo(0x55555555), %g3+ -- 0008 81C0C000 jmp %g3+ -- 000c 01000000 nop++ let w32 = fromIntegral (funPtrToInt a)++ hi22, lo10 :: Word32 -> Word32+ lo10 x = x .&. 0x3FF+ hi22 x = (x `shiftR` 10) .&. 0x3FFFF++ in Right [ 0x07000000 .|. (hi22 w32),+ 0x8610E000 .|. (lo10 w32),+ 0x81C0C000,+ 0x01000000 ]++ ArchPPC ->+ -- We'll use r12, for no particular reason.+ -- 0xDEADBEEF stands for the address:+ -- 3D80DEAD lis r12,0xDEAD+ -- 618CBEEF ori r12,r12,0xBEEF+ -- 7D8903A6 mtctr r12+ -- 4E800420 bctr++ let w32 = fromIntegral (funPtrToInt a)+ hi16 x = (x `shiftR` 16) .&. 0xFFFF+ lo16 x = x .&. 0xFFFF+ in Right [ 0x3D800000 .|. hi16 w32,+ 0x618C0000 .|. lo16 w32,+ 0x7D8903A6, 0x4E800420 ]++ ArchX86 ->+ -- Let the address to jump to be 0xWWXXYYZZ.+ -- Generate movl $0xWWXXYYZZ,%eax ; jmp *%eax+ -- which is+ -- B8 ZZ YY XX WW FF E0++ let w32 = fromIntegral (funPtrToInt a) :: Word32+ insnBytes :: [Word8]+ insnBytes+ = [0xB8, byte0 w32, byte1 w32,+ byte2 w32, byte3 w32,+ 0xFF, 0xE0]+ in+ Left insnBytes++ ArchX86_64 ->+ -- Generates:+ -- jmpq *.L1(%rip)+ -- .align 8+ -- .L1:+ -- .quad <addr>+ --+ -- which looks like:+ -- 8: ff 25 02 00 00 00 jmpq *0x2(%rip) # 10 <f+0x10>+ -- with addr at 10.+ --+ -- We need a full 64-bit pointer (we can't assume the info table is+ -- allocated in low memory). Assuming the info pointer is aligned to+ -- an 8-byte boundary, the addr will also be aligned.++ let w64 = fromIntegral (funPtrToInt a) :: Word64+ insnBytes :: [Word8]+ insnBytes+ = [0xff, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,+ byte0 w64, byte1 w64, byte2 w64, byte3 w64,+ byte4 w64, byte5 w64, byte6 w64, byte7 w64]+ in+ Left insnBytes++ ArchAlpha ->+ let w64 = fromIntegral (funPtrToInt a) :: Word64+ in Right [ 0xc3800000 -- br at, .+4+ , 0xa79c000c -- ldq at, 12(at)+ , 0x6bfc0000 -- jmp (at) # with zero hint -- oh well+ , 0x47ff041f -- nop+ , fromIntegral (w64 .&. 0x0000FFFF)+ , fromIntegral ((w64 `shiftR` 32) .&. 0x0000FFFF) ]++ ArchARM { } ->+ -- Generates Arm sequence,+ -- ldr r1, [pc, #0]+ -- bx r1+ --+ -- which looks like:+ -- 00000000 <.addr-0x8>:+ -- 0: 00109fe5 ldr r1, [pc] ; 8 <.addr>+ -- 4: 11ff2fe1 bx r1+ let w32 = fromIntegral (funPtrToInt a) :: Word32+ in Left [ 0x00, 0x10, 0x9f, 0xe5+ , 0x11, 0xff, 0x2f, 0xe1+ , byte0 w32, byte1 w32, byte2 w32, byte3 w32]++ ArchARM64 { } ->+ -- Generates:+ --+ -- ldr x1, label+ -- br x1+ -- label:+ -- .quad <addr>+ --+ -- which looks like:+ -- 0: 58000041 ldr x1, <label>+ -- 4: d61f0020 br x1+ let w64 = fromIntegral (funPtrToInt a) :: Word64+ in Right [ 0x58000041+ , 0xd61f0020+ , fromIntegral w64+ , fromIntegral (w64 `shiftR` 32) ]+ ArchPPC64 ->+ -- We use the compiler's register r12 to read the function+ -- descriptor and the linker's register r11 as a temporary+ -- register to hold the function entry point.+ -- In the medium code model the function descriptor+ -- is located in the first two gigabytes, i.e. the address+ -- of the function pointer is a non-negative 32 bit number.+ -- 0x0EADBEEF stands for the address of the function pointer:+ -- 0: 3d 80 0e ad lis r12,0x0EAD+ -- 4: 61 8c be ef ori r12,r12,0xBEEF+ -- 8: e9 6c 00 00 ld r11,0(r12)+ -- c: e8 4c 00 08 ld r2,8(r12)+ -- 10: 7d 69 03 a6 mtctr r11+ -- 14: e9 6c 00 10 ld r11,16(r12)+ -- 18: 4e 80 04 20 bctr+ let w32 = fromIntegral (funPtrToInt a)+ hi16 x = (x `shiftR` 16) .&. 0xFFFF+ lo16 x = x .&. 0xFFFF+ in Right [ 0x3D800000 .|. hi16 w32,+ 0x618C0000 .|. lo16 w32,+ 0xE96C0000,+ 0xE84C0008,+ 0x7D6903A6,+ 0xE96C0010,+ 0x4E800420]++ ArchPPC64LE ->+ -- The ABI requires r12 to point to the function's entry point.+ -- We use the medium code model where code resides in the first+ -- two gigabytes, so loading a non-negative32 bit address+ -- with lis followed by ori is fine.+ -- 0x0EADBEEF stands for the address:+ -- 3D800EAD lis r12,0x0EAD+ -- 618CBEEF ori r12,r12,0xBEEF+ -- 7D8903A6 mtctr r12+ -- 4E800420 bctr++ let w32 = fromIntegral (funPtrToInt a)+ hi16 x = (x `shiftR` 16) .&. 0xFFFF+ lo16 x = x .&. 0xFFFF+ in Right [ 0x3D800000 .|. hi16 w32,+ 0x618C0000 .|. lo16 w32,+ 0x7D8903A6, 0x4E800420 ]++ -- This code must not be called. You either need to+ -- add your architecture as a distinct case or+ -- use non-TABLES_NEXT_TO_CODE mode+ ArchUnknown -> error "mkJumpToAddr: ArchUnknown is unsupported"++byte0 :: (Integral w) => w -> Word8+byte0 w = fromIntegral w++byte1, byte2, byte3, byte4, byte5, byte6, byte7+ :: (Integral w, Bits w) => w -> Word8+byte1 w = fromIntegral (w `shiftR` 8)+byte2 w = fromIntegral (w `shiftR` 16)+byte3 w = fromIntegral (w `shiftR` 24)+byte4 w = fromIntegral (w `shiftR` 32)+byte5 w = fromIntegral (w `shiftR` 40)+byte6 w = fromIntegral (w `shiftR` 48)+byte7 w = fromIntegral (w `shiftR` 56)+++-- -----------------------------------------------------------------------------+-- read & write intfo tables++-- entry point for direct returns for created constr itbls+foreign import ccall "&stg_interp_constr1_entry" stg_interp_constr1_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr2_entry" stg_interp_constr2_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr3_entry" stg_interp_constr3_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr4_entry" stg_interp_constr4_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr5_entry" stg_interp_constr5_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr6_entry" stg_interp_constr6_entry :: EntryFunPtr+foreign import ccall "&stg_interp_constr7_entry" stg_interp_constr7_entry :: EntryFunPtr++interpConstrEntry :: [EntryFunPtr]+interpConstrEntry = [ error "pointer tag 0"+ , stg_interp_constr1_entry+ , stg_interp_constr2_entry+ , stg_interp_constr3_entry+ , stg_interp_constr4_entry+ , stg_interp_constr5_entry+ , stg_interp_constr6_entry+ , stg_interp_constr7_entry ]++data StgConInfoTable = StgConInfoTable {+ conDesc :: Ptr Word8,+ infoTable :: StgInfoTable+}+++pokeConItbl+ :: Ptr StgConInfoTable -> Ptr StgConInfoTable -> StgConInfoTable+ -> IO ()+pokeConItbl wr_ptr _ex_ptr itbl = do++{-# LINE 328 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ -- Write the offset to the con_desc from the end of the standard InfoTable+ -- at the first byte.+ let con_desc_offset = conDesc itbl `minusPtr` (_ex_ptr `plusPtr` conInfoTableSizeB)+ ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) wr_ptr con_desc_offset+{-# LINE 332 "libraries/ghci/GHCi/InfoTable.hsc" #-}++{-# LINE 338 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ pokeItbl (wr_ptr `plusPtr` ((8))) (infoTable itbl)+{-# LINE 339 "libraries/ghci/GHCi/InfoTable.hsc" #-}++sizeOfEntryCode :: Int+sizeOfEntryCode+ | not ghciTablesNextToCode = 0+ | otherwise =+ case mkJumpToAddr undefined of+ Left xs -> sizeOf (head xs) * length xs+ Right xs -> sizeOf (head xs) * length xs++-- Note: Must return proper pointer for use in a closure+newExecConItbl :: StgInfoTable -> ByteString -> IO (FunPtr ())+newExecConItbl obj con_desc+ = alloca $ \pcode -> do+ let lcon_desc = BS.length con_desc + 1{- null terminator -}+ -- SCARY+ -- This size represents the number of bytes in an StgConInfoTable.+ sz = fromIntegral (conInfoTableSizeB + sizeOfEntryCode)+ -- Note: we need to allocate the conDesc string next to the info+ -- table, because on a 64-bit platform we reference this string+ -- with a 32-bit offset relative to the info table, so if we+ -- allocated the string separately it might be out of range.+ wr_ptr <- _allocateExec (sz + fromIntegral lcon_desc) pcode+ ex_ptr <- peek pcode+ let cinfo = StgConInfoTable { conDesc = ex_ptr `plusPtr` fromIntegral sz+ , infoTable = obj }+ pokeConItbl wr_ptr ex_ptr cinfo+ BS.useAsCStringLen con_desc $ \(src, len) ->+ copyBytes (castPtr wr_ptr `plusPtr` fromIntegral sz) src len+ let null_off = fromIntegral sz + fromIntegral (BS.length con_desc)+ poke (castPtr wr_ptr `plusPtr` null_off) (0 :: Word8)+ _flushExec sz ex_ptr -- Cache flush (if needed)++{-# LINE 371 "libraries/ghci/GHCi/InfoTable.hsc" #-}+ return (castPtrToFunPtr (ex_ptr `plusPtr` conInfoTableSizeB))++{-# LINE 375 "libraries/ghci/GHCi/InfoTable.hsc" #-}++foreign import ccall unsafe "allocateExec"+ _allocateExec :: CUInt -> Ptr (Ptr a) -> IO (Ptr a)++foreign import ccall unsafe "flushExec"+ _flushExec :: CUInt -> Ptr a -> IO ()++-- -----------------------------------------------------------------------------+-- Constants and config++wORD_SIZE :: Int+wORD_SIZE = (8)+{-# LINE 387 "libraries/ghci/GHCi/InfoTable.hsc" #-}++conInfoTableSizeB :: Int+conInfoTableSizeB = wORD_SIZE + itblSize++{-# LINE 391 "libraries/ghci/GHCi/InfoTable.hsc" #-}
ghc-lib/stage1/compiler/build/ghc_boot_platform.h view
@@ -1,4 +1,4 @@-#ifndef __PLATFORM_H__+#if !defined(__PLATFORM_H__) #define __PLATFORM_H__ #define BuildPlatform_NAME "x86_64-apple-darwin"
ghc-lib/stage1/compiler/build/primop-can-fail.hs-incl view
@@ -19,10 +19,12 @@ primOpCanFail WordQuotRem2Op = True primOpCanFail DoubleDivOp = True primOpCanFail DoubleLogOp = True+primOpCanFail DoubleLog1POp = True primOpCanFail DoubleAsinOp = True primOpCanFail DoubleAcosOp = True primOpCanFail FloatDivOp = True primOpCanFail FloatLogOp = True+primOpCanFail FloatLog1POp = True primOpCanFail FloatAsinOp = True primOpCanFail FloatAcosOp = True primOpCanFail ReadArrayOp = True
ghc-lib/stage1/compiler/build/primop-code-size.hs-incl view
@@ -8,7 +8,9 @@ primOpCodeSize WordAdd2Op = 2 primOpCodeSize Word2IntOp = 0 primOpCodeSize DoubleExpOp = primOpCodeSizeForeignCall +primOpCodeSize DoubleExpM1Op = primOpCodeSizeForeignCall primOpCodeSize DoubleLogOp = primOpCodeSizeForeignCall +primOpCodeSize DoubleLog1POp = primOpCodeSizeForeignCall primOpCodeSize DoubleSqrtOp = primOpCodeSizeForeignCall primOpCodeSize DoubleSinOp = primOpCodeSizeForeignCall primOpCodeSize DoubleCosOp = primOpCodeSizeForeignCall @@ -24,7 +26,9 @@ primOpCodeSize DoubleAtanhOp = primOpCodeSizeForeignCall primOpCodeSize DoublePowerOp = primOpCodeSizeForeignCall primOpCodeSize FloatExpOp = primOpCodeSizeForeignCall +primOpCodeSize FloatExpM1Op = primOpCodeSizeForeignCall primOpCodeSize FloatLogOp = primOpCodeSizeForeignCall +primOpCodeSize FloatLog1POp = primOpCodeSizeForeignCall primOpCodeSize FloatSqrtOp = primOpCodeSizeForeignCall primOpCodeSize FloatSinOp = primOpCodeSizeForeignCall primOpCodeSize FloatCosOp = primOpCodeSizeForeignCall
ghc-lib/stage1/compiler/build/primop-data-decl.hs-incl view
@@ -174,7 +174,9 @@ | Double2IntOp | Double2FloatOp | DoubleExpOp+ | DoubleExpM1Op | DoubleLogOp+ | DoubleLog1POp | DoubleSqrtOp | DoubleSinOp | DoubleCosOp@@ -205,7 +207,9 @@ | FloatFabsOp | Float2IntOp | FloatExpOp+ | FloatExpM1Op | FloatLogOp+ | FloatLog1POp | FloatSqrtOp | FloatSinOp | FloatCosOp
ghc-lib/stage1/compiler/build/primop-list.hs-incl view
@@ -173,7 +173,9 @@ , Double2IntOp , Double2FloatOp , DoubleExpOp+ , DoubleExpM1Op , DoubleLogOp+ , DoubleLog1POp , DoubleSqrtOp , DoubleSinOp , DoubleCosOp@@ -204,7 +206,9 @@ , FloatFabsOp , Float2IntOp , FloatExpOp+ , FloatExpM1Op , FloatLogOp+ , FloatLog1POp , FloatSqrtOp , FloatSinOp , FloatCosOp
ghc-lib/stage1/compiler/build/primop-primop-info.hs-incl view
@@ -173,7 +173,9 @@ primOpInfo Double2IntOp = mkGenPrimOp (fsLit "double2Int#") [] [doublePrimTy] (intPrimTy) primOpInfo Double2FloatOp = mkGenPrimOp (fsLit "double2Float#") [] [doublePrimTy] (floatPrimTy) primOpInfo DoubleExpOp = mkMonadic (fsLit "expDouble#") doublePrimTy+primOpInfo DoubleExpM1Op = mkMonadic (fsLit "expm1Double#") doublePrimTy primOpInfo DoubleLogOp = mkMonadic (fsLit "logDouble#") doublePrimTy+primOpInfo DoubleLog1POp = mkMonadic (fsLit "log1pDouble#") doublePrimTy primOpInfo DoubleSqrtOp = mkMonadic (fsLit "sqrtDouble#") doublePrimTy primOpInfo DoubleSinOp = mkMonadic (fsLit "sinDouble#") doublePrimTy primOpInfo DoubleCosOp = mkMonadic (fsLit "cosDouble#") doublePrimTy@@ -204,7 +206,9 @@ primOpInfo FloatFabsOp = mkMonadic (fsLit "fabsFloat#") floatPrimTy primOpInfo Float2IntOp = mkGenPrimOp (fsLit "float2Int#") [] [floatPrimTy] (intPrimTy) primOpInfo FloatExpOp = mkMonadic (fsLit "expFloat#") floatPrimTy+primOpInfo FloatExpM1Op = mkMonadic (fsLit "expm1Float#") floatPrimTy primOpInfo FloatLogOp = mkMonadic (fsLit "logFloat#") floatPrimTy+primOpInfo FloatLog1POp = mkMonadic (fsLit "log1pFloat#") floatPrimTy primOpInfo FloatSqrtOp = mkMonadic (fsLit "sqrtFloat#") floatPrimTy primOpInfo FloatSinOp = mkMonadic (fsLit "sinFloat#") floatPrimTy primOpInfo FloatCosOp = mkMonadic (fsLit "cosFloat#") floatPrimTy
ghc-lib/stage1/compiler/build/primop-tag.hs-incl view
@@ -1,1201 +1,1205 @@ maxPrimOpTag :: Int-maxPrimOpTag = 1198-primOpTag :: PrimOp -> Int-primOpTag CharGtOp = 1-primOpTag CharGeOp = 2-primOpTag CharEqOp = 3-primOpTag CharNeOp = 4-primOpTag CharLtOp = 5-primOpTag CharLeOp = 6-primOpTag OrdOp = 7-primOpTag IntAddOp = 8-primOpTag IntSubOp = 9-primOpTag IntMulOp = 10-primOpTag IntMulMayOfloOp = 11-primOpTag IntQuotOp = 12-primOpTag IntRemOp = 13-primOpTag IntQuotRemOp = 14-primOpTag AndIOp = 15-primOpTag OrIOp = 16-primOpTag XorIOp = 17-primOpTag NotIOp = 18-primOpTag IntNegOp = 19-primOpTag IntAddCOp = 20-primOpTag IntSubCOp = 21-primOpTag IntGtOp = 22-primOpTag IntGeOp = 23-primOpTag IntEqOp = 24-primOpTag IntNeOp = 25-primOpTag IntLtOp = 26-primOpTag IntLeOp = 27-primOpTag ChrOp = 28-primOpTag Int2WordOp = 29-primOpTag Int2FloatOp = 30-primOpTag Int2DoubleOp = 31-primOpTag Word2FloatOp = 32-primOpTag Word2DoubleOp = 33-primOpTag ISllOp = 34-primOpTag ISraOp = 35-primOpTag ISrlOp = 36-primOpTag Int8Extend = 37-primOpTag Int8Narrow = 38-primOpTag Int8NegOp = 39-primOpTag Int8AddOp = 40-primOpTag Int8SubOp = 41-primOpTag Int8MulOp = 42-primOpTag Int8QuotOp = 43-primOpTag Int8RemOp = 44-primOpTag Int8QuotRemOp = 45-primOpTag Int8EqOp = 46-primOpTag Int8GeOp = 47-primOpTag Int8GtOp = 48-primOpTag Int8LeOp = 49-primOpTag Int8LtOp = 50-primOpTag Int8NeOp = 51-primOpTag Word8Extend = 52-primOpTag Word8Narrow = 53-primOpTag Word8NotOp = 54-primOpTag Word8AddOp = 55-primOpTag Word8SubOp = 56-primOpTag Word8MulOp = 57-primOpTag Word8QuotOp = 58-primOpTag Word8RemOp = 59-primOpTag Word8QuotRemOp = 60-primOpTag Word8EqOp = 61-primOpTag Word8GeOp = 62-primOpTag Word8GtOp = 63-primOpTag Word8LeOp = 64-primOpTag Word8LtOp = 65-primOpTag Word8NeOp = 66-primOpTag Int16Extend = 67-primOpTag Int16Narrow = 68-primOpTag Int16NegOp = 69-primOpTag Int16AddOp = 70-primOpTag Int16SubOp = 71-primOpTag Int16MulOp = 72-primOpTag Int16QuotOp = 73-primOpTag Int16RemOp = 74-primOpTag Int16QuotRemOp = 75-primOpTag Int16EqOp = 76-primOpTag Int16GeOp = 77-primOpTag Int16GtOp = 78-primOpTag Int16LeOp = 79-primOpTag Int16LtOp = 80-primOpTag Int16NeOp = 81-primOpTag Word16Extend = 82-primOpTag Word16Narrow = 83-primOpTag Word16NotOp = 84-primOpTag Word16AddOp = 85-primOpTag Word16SubOp = 86-primOpTag Word16MulOp = 87-primOpTag Word16QuotOp = 88-primOpTag Word16RemOp = 89-primOpTag Word16QuotRemOp = 90-primOpTag Word16EqOp = 91-primOpTag Word16GeOp = 92-primOpTag Word16GtOp = 93-primOpTag Word16LeOp = 94-primOpTag Word16LtOp = 95-primOpTag Word16NeOp = 96-primOpTag WordAddOp = 97-primOpTag WordAddCOp = 98-primOpTag WordSubCOp = 99-primOpTag WordAdd2Op = 100-primOpTag WordSubOp = 101-primOpTag WordMulOp = 102-primOpTag WordMul2Op = 103-primOpTag WordQuotOp = 104-primOpTag WordRemOp = 105-primOpTag WordQuotRemOp = 106-primOpTag WordQuotRem2Op = 107-primOpTag AndOp = 108-primOpTag OrOp = 109-primOpTag XorOp = 110-primOpTag NotOp = 111-primOpTag SllOp = 112-primOpTag SrlOp = 113-primOpTag Word2IntOp = 114-primOpTag WordGtOp = 115-primOpTag WordGeOp = 116-primOpTag WordEqOp = 117-primOpTag WordNeOp = 118-primOpTag WordLtOp = 119-primOpTag WordLeOp = 120-primOpTag PopCnt8Op = 121-primOpTag PopCnt16Op = 122-primOpTag PopCnt32Op = 123-primOpTag PopCnt64Op = 124-primOpTag PopCntOp = 125-primOpTag Pdep8Op = 126-primOpTag Pdep16Op = 127-primOpTag Pdep32Op = 128-primOpTag Pdep64Op = 129-primOpTag PdepOp = 130-primOpTag Pext8Op = 131-primOpTag Pext16Op = 132-primOpTag Pext32Op = 133-primOpTag Pext64Op = 134-primOpTag PextOp = 135-primOpTag Clz8Op = 136-primOpTag Clz16Op = 137-primOpTag Clz32Op = 138-primOpTag Clz64Op = 139-primOpTag ClzOp = 140-primOpTag Ctz8Op = 141-primOpTag Ctz16Op = 142-primOpTag Ctz32Op = 143-primOpTag Ctz64Op = 144-primOpTag CtzOp = 145-primOpTag BSwap16Op = 146-primOpTag BSwap32Op = 147-primOpTag BSwap64Op = 148-primOpTag BSwapOp = 149-primOpTag BRev8Op = 150-primOpTag BRev16Op = 151-primOpTag BRev32Op = 152-primOpTag BRev64Op = 153-primOpTag BRevOp = 154-primOpTag Narrow8IntOp = 155-primOpTag Narrow16IntOp = 156-primOpTag Narrow32IntOp = 157-primOpTag Narrow8WordOp = 158-primOpTag Narrow16WordOp = 159-primOpTag Narrow32WordOp = 160-primOpTag DoubleGtOp = 161-primOpTag DoubleGeOp = 162-primOpTag DoubleEqOp = 163-primOpTag DoubleNeOp = 164-primOpTag DoubleLtOp = 165-primOpTag DoubleLeOp = 166-primOpTag DoubleAddOp = 167-primOpTag DoubleSubOp = 168-primOpTag DoubleMulOp = 169-primOpTag DoubleDivOp = 170-primOpTag DoubleNegOp = 171-primOpTag DoubleFabsOp = 172-primOpTag Double2IntOp = 173-primOpTag Double2FloatOp = 174-primOpTag DoubleExpOp = 175-primOpTag DoubleLogOp = 176-primOpTag DoubleSqrtOp = 177-primOpTag DoubleSinOp = 178-primOpTag DoubleCosOp = 179-primOpTag DoubleTanOp = 180-primOpTag DoubleAsinOp = 181-primOpTag DoubleAcosOp = 182-primOpTag DoubleAtanOp = 183-primOpTag DoubleSinhOp = 184-primOpTag DoubleCoshOp = 185-primOpTag DoubleTanhOp = 186-primOpTag DoubleAsinhOp = 187-primOpTag DoubleAcoshOp = 188-primOpTag DoubleAtanhOp = 189-primOpTag DoublePowerOp = 190-primOpTag DoubleDecode_2IntOp = 191-primOpTag DoubleDecode_Int64Op = 192-primOpTag FloatGtOp = 193-primOpTag FloatGeOp = 194-primOpTag FloatEqOp = 195-primOpTag FloatNeOp = 196-primOpTag FloatLtOp = 197-primOpTag FloatLeOp = 198-primOpTag FloatAddOp = 199-primOpTag FloatSubOp = 200-primOpTag FloatMulOp = 201-primOpTag FloatDivOp = 202-primOpTag FloatNegOp = 203-primOpTag FloatFabsOp = 204-primOpTag Float2IntOp = 205-primOpTag FloatExpOp = 206-primOpTag FloatLogOp = 207-primOpTag FloatSqrtOp = 208-primOpTag FloatSinOp = 209-primOpTag FloatCosOp = 210-primOpTag FloatTanOp = 211-primOpTag FloatAsinOp = 212-primOpTag FloatAcosOp = 213-primOpTag FloatAtanOp = 214-primOpTag FloatSinhOp = 215-primOpTag FloatCoshOp = 216-primOpTag FloatTanhOp = 217-primOpTag FloatAsinhOp = 218-primOpTag FloatAcoshOp = 219-primOpTag FloatAtanhOp = 220-primOpTag FloatPowerOp = 221-primOpTag Float2DoubleOp = 222-primOpTag FloatDecode_IntOp = 223-primOpTag NewArrayOp = 224-primOpTag SameMutableArrayOp = 225-primOpTag ReadArrayOp = 226-primOpTag WriteArrayOp = 227-primOpTag SizeofArrayOp = 228-primOpTag SizeofMutableArrayOp = 229-primOpTag IndexArrayOp = 230-primOpTag UnsafeFreezeArrayOp = 231-primOpTag UnsafeThawArrayOp = 232-primOpTag CopyArrayOp = 233-primOpTag CopyMutableArrayOp = 234-primOpTag CloneArrayOp = 235-primOpTag CloneMutableArrayOp = 236-primOpTag FreezeArrayOp = 237-primOpTag ThawArrayOp = 238-primOpTag CasArrayOp = 239-primOpTag NewSmallArrayOp = 240-primOpTag SameSmallMutableArrayOp = 241-primOpTag ReadSmallArrayOp = 242-primOpTag WriteSmallArrayOp = 243-primOpTag SizeofSmallArrayOp = 244-primOpTag SizeofSmallMutableArrayOp = 245-primOpTag IndexSmallArrayOp = 246-primOpTag UnsafeFreezeSmallArrayOp = 247-primOpTag UnsafeThawSmallArrayOp = 248-primOpTag CopySmallArrayOp = 249-primOpTag CopySmallMutableArrayOp = 250-primOpTag CloneSmallArrayOp = 251-primOpTag CloneSmallMutableArrayOp = 252-primOpTag FreezeSmallArrayOp = 253-primOpTag ThawSmallArrayOp = 254-primOpTag CasSmallArrayOp = 255-primOpTag NewByteArrayOp_Char = 256-primOpTag NewPinnedByteArrayOp_Char = 257-primOpTag NewAlignedPinnedByteArrayOp_Char = 258-primOpTag MutableByteArrayIsPinnedOp = 259-primOpTag ByteArrayIsPinnedOp = 260-primOpTag ByteArrayContents_Char = 261-primOpTag SameMutableByteArrayOp = 262-primOpTag ShrinkMutableByteArrayOp_Char = 263-primOpTag ResizeMutableByteArrayOp_Char = 264-primOpTag UnsafeFreezeByteArrayOp = 265-primOpTag SizeofByteArrayOp = 266-primOpTag SizeofMutableByteArrayOp = 267-primOpTag GetSizeofMutableByteArrayOp = 268-primOpTag IndexByteArrayOp_Char = 269-primOpTag IndexByteArrayOp_WideChar = 270-primOpTag IndexByteArrayOp_Int = 271-primOpTag IndexByteArrayOp_Word = 272-primOpTag IndexByteArrayOp_Addr = 273-primOpTag IndexByteArrayOp_Float = 274-primOpTag IndexByteArrayOp_Double = 275-primOpTag IndexByteArrayOp_StablePtr = 276-primOpTag IndexByteArrayOp_Int8 = 277-primOpTag IndexByteArrayOp_Int16 = 278-primOpTag IndexByteArrayOp_Int32 = 279-primOpTag IndexByteArrayOp_Int64 = 280-primOpTag IndexByteArrayOp_Word8 = 281-primOpTag IndexByteArrayOp_Word16 = 282-primOpTag IndexByteArrayOp_Word32 = 283-primOpTag IndexByteArrayOp_Word64 = 284-primOpTag IndexByteArrayOp_Word8AsChar = 285-primOpTag IndexByteArrayOp_Word8AsWideChar = 286-primOpTag IndexByteArrayOp_Word8AsAddr = 287-primOpTag IndexByteArrayOp_Word8AsFloat = 288-primOpTag IndexByteArrayOp_Word8AsDouble = 289-primOpTag IndexByteArrayOp_Word8AsStablePtr = 290-primOpTag IndexByteArrayOp_Word8AsInt16 = 291-primOpTag IndexByteArrayOp_Word8AsInt32 = 292-primOpTag IndexByteArrayOp_Word8AsInt64 = 293-primOpTag IndexByteArrayOp_Word8AsInt = 294-primOpTag IndexByteArrayOp_Word8AsWord16 = 295-primOpTag IndexByteArrayOp_Word8AsWord32 = 296-primOpTag IndexByteArrayOp_Word8AsWord64 = 297-primOpTag IndexByteArrayOp_Word8AsWord = 298-primOpTag ReadByteArrayOp_Char = 299-primOpTag ReadByteArrayOp_WideChar = 300-primOpTag ReadByteArrayOp_Int = 301-primOpTag ReadByteArrayOp_Word = 302-primOpTag ReadByteArrayOp_Addr = 303-primOpTag ReadByteArrayOp_Float = 304-primOpTag ReadByteArrayOp_Double = 305-primOpTag ReadByteArrayOp_StablePtr = 306-primOpTag ReadByteArrayOp_Int8 = 307-primOpTag ReadByteArrayOp_Int16 = 308-primOpTag ReadByteArrayOp_Int32 = 309-primOpTag ReadByteArrayOp_Int64 = 310-primOpTag ReadByteArrayOp_Word8 = 311-primOpTag ReadByteArrayOp_Word16 = 312-primOpTag ReadByteArrayOp_Word32 = 313-primOpTag ReadByteArrayOp_Word64 = 314-primOpTag ReadByteArrayOp_Word8AsChar = 315-primOpTag ReadByteArrayOp_Word8AsWideChar = 316-primOpTag ReadByteArrayOp_Word8AsAddr = 317-primOpTag ReadByteArrayOp_Word8AsFloat = 318-primOpTag ReadByteArrayOp_Word8AsDouble = 319-primOpTag ReadByteArrayOp_Word8AsStablePtr = 320-primOpTag ReadByteArrayOp_Word8AsInt16 = 321-primOpTag ReadByteArrayOp_Word8AsInt32 = 322-primOpTag ReadByteArrayOp_Word8AsInt64 = 323-primOpTag ReadByteArrayOp_Word8AsInt = 324-primOpTag ReadByteArrayOp_Word8AsWord16 = 325-primOpTag ReadByteArrayOp_Word8AsWord32 = 326-primOpTag ReadByteArrayOp_Word8AsWord64 = 327-primOpTag ReadByteArrayOp_Word8AsWord = 328-primOpTag WriteByteArrayOp_Char = 329-primOpTag WriteByteArrayOp_WideChar = 330-primOpTag WriteByteArrayOp_Int = 331-primOpTag WriteByteArrayOp_Word = 332-primOpTag WriteByteArrayOp_Addr = 333-primOpTag WriteByteArrayOp_Float = 334-primOpTag WriteByteArrayOp_Double = 335-primOpTag WriteByteArrayOp_StablePtr = 336-primOpTag WriteByteArrayOp_Int8 = 337-primOpTag WriteByteArrayOp_Int16 = 338-primOpTag WriteByteArrayOp_Int32 = 339-primOpTag WriteByteArrayOp_Int64 = 340-primOpTag WriteByteArrayOp_Word8 = 341-primOpTag WriteByteArrayOp_Word16 = 342-primOpTag WriteByteArrayOp_Word32 = 343-primOpTag WriteByteArrayOp_Word64 = 344-primOpTag WriteByteArrayOp_Word8AsChar = 345-primOpTag WriteByteArrayOp_Word8AsWideChar = 346-primOpTag WriteByteArrayOp_Word8AsAddr = 347-primOpTag WriteByteArrayOp_Word8AsFloat = 348-primOpTag WriteByteArrayOp_Word8AsDouble = 349-primOpTag WriteByteArrayOp_Word8AsStablePtr = 350-primOpTag WriteByteArrayOp_Word8AsInt16 = 351-primOpTag WriteByteArrayOp_Word8AsInt32 = 352-primOpTag WriteByteArrayOp_Word8AsInt64 = 353-primOpTag WriteByteArrayOp_Word8AsInt = 354-primOpTag WriteByteArrayOp_Word8AsWord16 = 355-primOpTag WriteByteArrayOp_Word8AsWord32 = 356-primOpTag WriteByteArrayOp_Word8AsWord64 = 357-primOpTag WriteByteArrayOp_Word8AsWord = 358-primOpTag CompareByteArraysOp = 359-primOpTag CopyByteArrayOp = 360-primOpTag CopyMutableByteArrayOp = 361-primOpTag CopyByteArrayToAddrOp = 362-primOpTag CopyMutableByteArrayToAddrOp = 363-primOpTag CopyAddrToByteArrayOp = 364-primOpTag SetByteArrayOp = 365-primOpTag AtomicReadByteArrayOp_Int = 366-primOpTag AtomicWriteByteArrayOp_Int = 367-primOpTag CasByteArrayOp_Int = 368-primOpTag FetchAddByteArrayOp_Int = 369-primOpTag FetchSubByteArrayOp_Int = 370-primOpTag FetchAndByteArrayOp_Int = 371-primOpTag FetchNandByteArrayOp_Int = 372-primOpTag FetchOrByteArrayOp_Int = 373-primOpTag FetchXorByteArrayOp_Int = 374-primOpTag NewArrayArrayOp = 375-primOpTag SameMutableArrayArrayOp = 376-primOpTag UnsafeFreezeArrayArrayOp = 377-primOpTag SizeofArrayArrayOp = 378-primOpTag SizeofMutableArrayArrayOp = 379-primOpTag IndexArrayArrayOp_ByteArray = 380-primOpTag IndexArrayArrayOp_ArrayArray = 381-primOpTag ReadArrayArrayOp_ByteArray = 382-primOpTag ReadArrayArrayOp_MutableByteArray = 383-primOpTag ReadArrayArrayOp_ArrayArray = 384-primOpTag ReadArrayArrayOp_MutableArrayArray = 385-primOpTag WriteArrayArrayOp_ByteArray = 386-primOpTag WriteArrayArrayOp_MutableByteArray = 387-primOpTag WriteArrayArrayOp_ArrayArray = 388-primOpTag WriteArrayArrayOp_MutableArrayArray = 389-primOpTag CopyArrayArrayOp = 390-primOpTag CopyMutableArrayArrayOp = 391-primOpTag AddrAddOp = 392-primOpTag AddrSubOp = 393-primOpTag AddrRemOp = 394-primOpTag Addr2IntOp = 395-primOpTag Int2AddrOp = 396-primOpTag AddrGtOp = 397-primOpTag AddrGeOp = 398-primOpTag AddrEqOp = 399-primOpTag AddrNeOp = 400-primOpTag AddrLtOp = 401-primOpTag AddrLeOp = 402-primOpTag IndexOffAddrOp_Char = 403-primOpTag IndexOffAddrOp_WideChar = 404-primOpTag IndexOffAddrOp_Int = 405-primOpTag IndexOffAddrOp_Word = 406-primOpTag IndexOffAddrOp_Addr = 407-primOpTag IndexOffAddrOp_Float = 408-primOpTag IndexOffAddrOp_Double = 409-primOpTag IndexOffAddrOp_StablePtr = 410-primOpTag IndexOffAddrOp_Int8 = 411-primOpTag IndexOffAddrOp_Int16 = 412-primOpTag IndexOffAddrOp_Int32 = 413-primOpTag IndexOffAddrOp_Int64 = 414-primOpTag IndexOffAddrOp_Word8 = 415-primOpTag IndexOffAddrOp_Word16 = 416-primOpTag IndexOffAddrOp_Word32 = 417-primOpTag IndexOffAddrOp_Word64 = 418-primOpTag ReadOffAddrOp_Char = 419-primOpTag ReadOffAddrOp_WideChar = 420-primOpTag ReadOffAddrOp_Int = 421-primOpTag ReadOffAddrOp_Word = 422-primOpTag ReadOffAddrOp_Addr = 423-primOpTag ReadOffAddrOp_Float = 424-primOpTag ReadOffAddrOp_Double = 425-primOpTag ReadOffAddrOp_StablePtr = 426-primOpTag ReadOffAddrOp_Int8 = 427-primOpTag ReadOffAddrOp_Int16 = 428-primOpTag ReadOffAddrOp_Int32 = 429-primOpTag ReadOffAddrOp_Int64 = 430-primOpTag ReadOffAddrOp_Word8 = 431-primOpTag ReadOffAddrOp_Word16 = 432-primOpTag ReadOffAddrOp_Word32 = 433-primOpTag ReadOffAddrOp_Word64 = 434-primOpTag WriteOffAddrOp_Char = 435-primOpTag WriteOffAddrOp_WideChar = 436-primOpTag WriteOffAddrOp_Int = 437-primOpTag WriteOffAddrOp_Word = 438-primOpTag WriteOffAddrOp_Addr = 439-primOpTag WriteOffAddrOp_Float = 440-primOpTag WriteOffAddrOp_Double = 441-primOpTag WriteOffAddrOp_StablePtr = 442-primOpTag WriteOffAddrOp_Int8 = 443-primOpTag WriteOffAddrOp_Int16 = 444-primOpTag WriteOffAddrOp_Int32 = 445-primOpTag WriteOffAddrOp_Int64 = 446-primOpTag WriteOffAddrOp_Word8 = 447-primOpTag WriteOffAddrOp_Word16 = 448-primOpTag WriteOffAddrOp_Word32 = 449-primOpTag WriteOffAddrOp_Word64 = 450-primOpTag NewMutVarOp = 451-primOpTag ReadMutVarOp = 452-primOpTag WriteMutVarOp = 453-primOpTag SameMutVarOp = 454-primOpTag AtomicModifyMutVar2Op = 455-primOpTag AtomicModifyMutVar_Op = 456-primOpTag CasMutVarOp = 457-primOpTag CatchOp = 458-primOpTag RaiseOp = 459-primOpTag RaiseIOOp = 460-primOpTag MaskAsyncExceptionsOp = 461-primOpTag MaskUninterruptibleOp = 462-primOpTag UnmaskAsyncExceptionsOp = 463-primOpTag MaskStatus = 464-primOpTag AtomicallyOp = 465-primOpTag RetryOp = 466-primOpTag CatchRetryOp = 467-primOpTag CatchSTMOp = 468-primOpTag NewTVarOp = 469-primOpTag ReadTVarOp = 470-primOpTag ReadTVarIOOp = 471-primOpTag WriteTVarOp = 472-primOpTag SameTVarOp = 473-primOpTag NewMVarOp = 474-primOpTag TakeMVarOp = 475-primOpTag TryTakeMVarOp = 476-primOpTag PutMVarOp = 477-primOpTag TryPutMVarOp = 478-primOpTag ReadMVarOp = 479-primOpTag TryReadMVarOp = 480-primOpTag SameMVarOp = 481-primOpTag IsEmptyMVarOp = 482-primOpTag DelayOp = 483-primOpTag WaitReadOp = 484-primOpTag WaitWriteOp = 485-primOpTag ForkOp = 486-primOpTag ForkOnOp = 487-primOpTag KillThreadOp = 488-primOpTag YieldOp = 489-primOpTag MyThreadIdOp = 490-primOpTag LabelThreadOp = 491-primOpTag IsCurrentThreadBoundOp = 492-primOpTag NoDuplicateOp = 493-primOpTag ThreadStatusOp = 494-primOpTag MkWeakOp = 495-primOpTag MkWeakNoFinalizerOp = 496-primOpTag AddCFinalizerToWeakOp = 497-primOpTag DeRefWeakOp = 498-primOpTag FinalizeWeakOp = 499-primOpTag TouchOp = 500-primOpTag MakeStablePtrOp = 501-primOpTag DeRefStablePtrOp = 502-primOpTag EqStablePtrOp = 503-primOpTag MakeStableNameOp = 504-primOpTag EqStableNameOp = 505-primOpTag StableNameToIntOp = 506-primOpTag CompactNewOp = 507-primOpTag CompactResizeOp = 508-primOpTag CompactContainsOp = 509-primOpTag CompactContainsAnyOp = 510-primOpTag CompactGetFirstBlockOp = 511-primOpTag CompactGetNextBlockOp = 512-primOpTag CompactAllocateBlockOp = 513-primOpTag CompactFixupPointersOp = 514-primOpTag CompactAdd = 515-primOpTag CompactAddWithSharing = 516-primOpTag CompactSize = 517-primOpTag ReallyUnsafePtrEqualityOp = 518-primOpTag ParOp = 519-primOpTag SparkOp = 520-primOpTag SeqOp = 521-primOpTag GetSparkOp = 522-primOpTag NumSparks = 523-primOpTag DataToTagOp = 524-primOpTag TagToEnumOp = 525-primOpTag AddrToAnyOp = 526-primOpTag AnyToAddrOp = 527-primOpTag MkApUpd0_Op = 528-primOpTag NewBCOOp = 529-primOpTag UnpackClosureOp = 530-primOpTag ClosureSizeOp = 531-primOpTag GetApStackValOp = 532-primOpTag GetCCSOfOp = 533-primOpTag GetCurrentCCSOp = 534-primOpTag ClearCCSOp = 535-primOpTag TraceEventOp = 536-primOpTag TraceEventBinaryOp = 537-primOpTag TraceMarkerOp = 538-primOpTag GetThreadAllocationCounter = 539-primOpTag SetThreadAllocationCounter = 540-primOpTag (VecBroadcastOp IntVec 16 W8) = 541-primOpTag (VecBroadcastOp IntVec 8 W16) = 542-primOpTag (VecBroadcastOp IntVec 4 W32) = 543-primOpTag (VecBroadcastOp IntVec 2 W64) = 544-primOpTag (VecBroadcastOp IntVec 32 W8) = 545-primOpTag (VecBroadcastOp IntVec 16 W16) = 546-primOpTag (VecBroadcastOp IntVec 8 W32) = 547-primOpTag (VecBroadcastOp IntVec 4 W64) = 548-primOpTag (VecBroadcastOp IntVec 64 W8) = 549-primOpTag (VecBroadcastOp IntVec 32 W16) = 550-primOpTag (VecBroadcastOp IntVec 16 W32) = 551-primOpTag (VecBroadcastOp IntVec 8 W64) = 552-primOpTag (VecBroadcastOp WordVec 16 W8) = 553-primOpTag (VecBroadcastOp WordVec 8 W16) = 554-primOpTag (VecBroadcastOp WordVec 4 W32) = 555-primOpTag (VecBroadcastOp WordVec 2 W64) = 556-primOpTag (VecBroadcastOp WordVec 32 W8) = 557-primOpTag (VecBroadcastOp WordVec 16 W16) = 558-primOpTag (VecBroadcastOp WordVec 8 W32) = 559-primOpTag (VecBroadcastOp WordVec 4 W64) = 560-primOpTag (VecBroadcastOp WordVec 64 W8) = 561-primOpTag (VecBroadcastOp WordVec 32 W16) = 562-primOpTag (VecBroadcastOp WordVec 16 W32) = 563-primOpTag (VecBroadcastOp WordVec 8 W64) = 564-primOpTag (VecBroadcastOp FloatVec 4 W32) = 565-primOpTag (VecBroadcastOp FloatVec 2 W64) = 566-primOpTag (VecBroadcastOp FloatVec 8 W32) = 567-primOpTag (VecBroadcastOp FloatVec 4 W64) = 568-primOpTag (VecBroadcastOp FloatVec 16 W32) = 569-primOpTag (VecBroadcastOp FloatVec 8 W64) = 570-primOpTag (VecPackOp IntVec 16 W8) = 571-primOpTag (VecPackOp IntVec 8 W16) = 572-primOpTag (VecPackOp IntVec 4 W32) = 573-primOpTag (VecPackOp IntVec 2 W64) = 574-primOpTag (VecPackOp IntVec 32 W8) = 575-primOpTag (VecPackOp IntVec 16 W16) = 576-primOpTag (VecPackOp IntVec 8 W32) = 577-primOpTag (VecPackOp IntVec 4 W64) = 578-primOpTag (VecPackOp IntVec 64 W8) = 579-primOpTag (VecPackOp IntVec 32 W16) = 580-primOpTag (VecPackOp IntVec 16 W32) = 581-primOpTag (VecPackOp IntVec 8 W64) = 582-primOpTag (VecPackOp WordVec 16 W8) = 583-primOpTag (VecPackOp WordVec 8 W16) = 584-primOpTag (VecPackOp WordVec 4 W32) = 585-primOpTag (VecPackOp WordVec 2 W64) = 586-primOpTag (VecPackOp WordVec 32 W8) = 587-primOpTag (VecPackOp WordVec 16 W16) = 588-primOpTag (VecPackOp WordVec 8 W32) = 589-primOpTag (VecPackOp WordVec 4 W64) = 590-primOpTag (VecPackOp WordVec 64 W8) = 591-primOpTag (VecPackOp WordVec 32 W16) = 592-primOpTag (VecPackOp WordVec 16 W32) = 593-primOpTag (VecPackOp WordVec 8 W64) = 594-primOpTag (VecPackOp FloatVec 4 W32) = 595-primOpTag (VecPackOp FloatVec 2 W64) = 596-primOpTag (VecPackOp FloatVec 8 W32) = 597-primOpTag (VecPackOp FloatVec 4 W64) = 598-primOpTag (VecPackOp FloatVec 16 W32) = 599-primOpTag (VecPackOp FloatVec 8 W64) = 600-primOpTag (VecUnpackOp IntVec 16 W8) = 601-primOpTag (VecUnpackOp IntVec 8 W16) = 602-primOpTag (VecUnpackOp IntVec 4 W32) = 603-primOpTag (VecUnpackOp IntVec 2 W64) = 604-primOpTag (VecUnpackOp IntVec 32 W8) = 605-primOpTag (VecUnpackOp IntVec 16 W16) = 606-primOpTag (VecUnpackOp IntVec 8 W32) = 607-primOpTag (VecUnpackOp IntVec 4 W64) = 608-primOpTag (VecUnpackOp IntVec 64 W8) = 609-primOpTag (VecUnpackOp IntVec 32 W16) = 610-primOpTag (VecUnpackOp IntVec 16 W32) = 611-primOpTag (VecUnpackOp IntVec 8 W64) = 612-primOpTag (VecUnpackOp WordVec 16 W8) = 613-primOpTag (VecUnpackOp WordVec 8 W16) = 614-primOpTag (VecUnpackOp WordVec 4 W32) = 615-primOpTag (VecUnpackOp WordVec 2 W64) = 616-primOpTag (VecUnpackOp WordVec 32 W8) = 617-primOpTag (VecUnpackOp WordVec 16 W16) = 618-primOpTag (VecUnpackOp WordVec 8 W32) = 619-primOpTag (VecUnpackOp WordVec 4 W64) = 620-primOpTag (VecUnpackOp WordVec 64 W8) = 621-primOpTag (VecUnpackOp WordVec 32 W16) = 622-primOpTag (VecUnpackOp WordVec 16 W32) = 623-primOpTag (VecUnpackOp WordVec 8 W64) = 624-primOpTag (VecUnpackOp FloatVec 4 W32) = 625-primOpTag (VecUnpackOp FloatVec 2 W64) = 626-primOpTag (VecUnpackOp FloatVec 8 W32) = 627-primOpTag (VecUnpackOp FloatVec 4 W64) = 628-primOpTag (VecUnpackOp FloatVec 16 W32) = 629-primOpTag (VecUnpackOp FloatVec 8 W64) = 630-primOpTag (VecInsertOp IntVec 16 W8) = 631-primOpTag (VecInsertOp IntVec 8 W16) = 632-primOpTag (VecInsertOp IntVec 4 W32) = 633-primOpTag (VecInsertOp IntVec 2 W64) = 634-primOpTag (VecInsertOp IntVec 32 W8) = 635-primOpTag (VecInsertOp IntVec 16 W16) = 636-primOpTag (VecInsertOp IntVec 8 W32) = 637-primOpTag (VecInsertOp IntVec 4 W64) = 638-primOpTag (VecInsertOp IntVec 64 W8) = 639-primOpTag (VecInsertOp IntVec 32 W16) = 640-primOpTag (VecInsertOp IntVec 16 W32) = 641-primOpTag (VecInsertOp IntVec 8 W64) = 642-primOpTag (VecInsertOp WordVec 16 W8) = 643-primOpTag (VecInsertOp WordVec 8 W16) = 644-primOpTag (VecInsertOp WordVec 4 W32) = 645-primOpTag (VecInsertOp WordVec 2 W64) = 646-primOpTag (VecInsertOp WordVec 32 W8) = 647-primOpTag (VecInsertOp WordVec 16 W16) = 648-primOpTag (VecInsertOp WordVec 8 W32) = 649-primOpTag (VecInsertOp WordVec 4 W64) = 650-primOpTag (VecInsertOp WordVec 64 W8) = 651-primOpTag (VecInsertOp WordVec 32 W16) = 652-primOpTag (VecInsertOp WordVec 16 W32) = 653-primOpTag (VecInsertOp WordVec 8 W64) = 654-primOpTag (VecInsertOp FloatVec 4 W32) = 655-primOpTag (VecInsertOp FloatVec 2 W64) = 656-primOpTag (VecInsertOp FloatVec 8 W32) = 657-primOpTag (VecInsertOp FloatVec 4 W64) = 658-primOpTag (VecInsertOp FloatVec 16 W32) = 659-primOpTag (VecInsertOp FloatVec 8 W64) = 660-primOpTag (VecAddOp IntVec 16 W8) = 661-primOpTag (VecAddOp IntVec 8 W16) = 662-primOpTag (VecAddOp IntVec 4 W32) = 663-primOpTag (VecAddOp IntVec 2 W64) = 664-primOpTag (VecAddOp IntVec 32 W8) = 665-primOpTag (VecAddOp IntVec 16 W16) = 666-primOpTag (VecAddOp IntVec 8 W32) = 667-primOpTag (VecAddOp IntVec 4 W64) = 668-primOpTag (VecAddOp IntVec 64 W8) = 669-primOpTag (VecAddOp IntVec 32 W16) = 670-primOpTag (VecAddOp IntVec 16 W32) = 671-primOpTag (VecAddOp IntVec 8 W64) = 672-primOpTag (VecAddOp WordVec 16 W8) = 673-primOpTag (VecAddOp WordVec 8 W16) = 674-primOpTag (VecAddOp WordVec 4 W32) = 675-primOpTag (VecAddOp WordVec 2 W64) = 676-primOpTag (VecAddOp WordVec 32 W8) = 677-primOpTag (VecAddOp WordVec 16 W16) = 678-primOpTag (VecAddOp WordVec 8 W32) = 679-primOpTag (VecAddOp WordVec 4 W64) = 680-primOpTag (VecAddOp WordVec 64 W8) = 681-primOpTag (VecAddOp WordVec 32 W16) = 682-primOpTag (VecAddOp WordVec 16 W32) = 683-primOpTag (VecAddOp WordVec 8 W64) = 684-primOpTag (VecAddOp FloatVec 4 W32) = 685-primOpTag (VecAddOp FloatVec 2 W64) = 686-primOpTag (VecAddOp FloatVec 8 W32) = 687-primOpTag (VecAddOp FloatVec 4 W64) = 688-primOpTag (VecAddOp FloatVec 16 W32) = 689-primOpTag (VecAddOp FloatVec 8 W64) = 690-primOpTag (VecSubOp IntVec 16 W8) = 691-primOpTag (VecSubOp IntVec 8 W16) = 692-primOpTag (VecSubOp IntVec 4 W32) = 693-primOpTag (VecSubOp IntVec 2 W64) = 694-primOpTag (VecSubOp IntVec 32 W8) = 695-primOpTag (VecSubOp IntVec 16 W16) = 696-primOpTag (VecSubOp IntVec 8 W32) = 697-primOpTag (VecSubOp IntVec 4 W64) = 698-primOpTag (VecSubOp IntVec 64 W8) = 699-primOpTag (VecSubOp IntVec 32 W16) = 700-primOpTag (VecSubOp IntVec 16 W32) = 701-primOpTag (VecSubOp IntVec 8 W64) = 702-primOpTag (VecSubOp WordVec 16 W8) = 703-primOpTag (VecSubOp WordVec 8 W16) = 704-primOpTag (VecSubOp WordVec 4 W32) = 705-primOpTag (VecSubOp WordVec 2 W64) = 706-primOpTag (VecSubOp WordVec 32 W8) = 707-primOpTag (VecSubOp WordVec 16 W16) = 708-primOpTag (VecSubOp WordVec 8 W32) = 709-primOpTag (VecSubOp WordVec 4 W64) = 710-primOpTag (VecSubOp WordVec 64 W8) = 711-primOpTag (VecSubOp WordVec 32 W16) = 712-primOpTag (VecSubOp WordVec 16 W32) = 713-primOpTag (VecSubOp WordVec 8 W64) = 714-primOpTag (VecSubOp FloatVec 4 W32) = 715-primOpTag (VecSubOp FloatVec 2 W64) = 716-primOpTag (VecSubOp FloatVec 8 W32) = 717-primOpTag (VecSubOp FloatVec 4 W64) = 718-primOpTag (VecSubOp FloatVec 16 W32) = 719-primOpTag (VecSubOp FloatVec 8 W64) = 720-primOpTag (VecMulOp IntVec 16 W8) = 721-primOpTag (VecMulOp IntVec 8 W16) = 722-primOpTag (VecMulOp IntVec 4 W32) = 723-primOpTag (VecMulOp IntVec 2 W64) = 724-primOpTag (VecMulOp IntVec 32 W8) = 725-primOpTag (VecMulOp IntVec 16 W16) = 726-primOpTag (VecMulOp IntVec 8 W32) = 727-primOpTag (VecMulOp IntVec 4 W64) = 728-primOpTag (VecMulOp IntVec 64 W8) = 729-primOpTag (VecMulOp IntVec 32 W16) = 730-primOpTag (VecMulOp IntVec 16 W32) = 731-primOpTag (VecMulOp IntVec 8 W64) = 732-primOpTag (VecMulOp WordVec 16 W8) = 733-primOpTag (VecMulOp WordVec 8 W16) = 734-primOpTag (VecMulOp WordVec 4 W32) = 735-primOpTag (VecMulOp WordVec 2 W64) = 736-primOpTag (VecMulOp WordVec 32 W8) = 737-primOpTag (VecMulOp WordVec 16 W16) = 738-primOpTag (VecMulOp WordVec 8 W32) = 739-primOpTag (VecMulOp WordVec 4 W64) = 740-primOpTag (VecMulOp WordVec 64 W8) = 741-primOpTag (VecMulOp WordVec 32 W16) = 742-primOpTag (VecMulOp WordVec 16 W32) = 743-primOpTag (VecMulOp WordVec 8 W64) = 744-primOpTag (VecMulOp FloatVec 4 W32) = 745-primOpTag (VecMulOp FloatVec 2 W64) = 746-primOpTag (VecMulOp FloatVec 8 W32) = 747-primOpTag (VecMulOp FloatVec 4 W64) = 748-primOpTag (VecMulOp FloatVec 16 W32) = 749-primOpTag (VecMulOp FloatVec 8 W64) = 750-primOpTag (VecDivOp FloatVec 4 W32) = 751-primOpTag (VecDivOp FloatVec 2 W64) = 752-primOpTag (VecDivOp FloatVec 8 W32) = 753-primOpTag (VecDivOp FloatVec 4 W64) = 754-primOpTag (VecDivOp FloatVec 16 W32) = 755-primOpTag (VecDivOp FloatVec 8 W64) = 756-primOpTag (VecQuotOp IntVec 16 W8) = 757-primOpTag (VecQuotOp IntVec 8 W16) = 758-primOpTag (VecQuotOp IntVec 4 W32) = 759-primOpTag (VecQuotOp IntVec 2 W64) = 760-primOpTag (VecQuotOp IntVec 32 W8) = 761-primOpTag (VecQuotOp IntVec 16 W16) = 762-primOpTag (VecQuotOp IntVec 8 W32) = 763-primOpTag (VecQuotOp IntVec 4 W64) = 764-primOpTag (VecQuotOp IntVec 64 W8) = 765-primOpTag (VecQuotOp IntVec 32 W16) = 766-primOpTag (VecQuotOp IntVec 16 W32) = 767-primOpTag (VecQuotOp IntVec 8 W64) = 768-primOpTag (VecQuotOp WordVec 16 W8) = 769-primOpTag (VecQuotOp WordVec 8 W16) = 770-primOpTag (VecQuotOp WordVec 4 W32) = 771-primOpTag (VecQuotOp WordVec 2 W64) = 772-primOpTag (VecQuotOp WordVec 32 W8) = 773-primOpTag (VecQuotOp WordVec 16 W16) = 774-primOpTag (VecQuotOp WordVec 8 W32) = 775-primOpTag (VecQuotOp WordVec 4 W64) = 776-primOpTag (VecQuotOp WordVec 64 W8) = 777-primOpTag (VecQuotOp WordVec 32 W16) = 778-primOpTag (VecQuotOp WordVec 16 W32) = 779-primOpTag (VecQuotOp WordVec 8 W64) = 780-primOpTag (VecRemOp IntVec 16 W8) = 781-primOpTag (VecRemOp IntVec 8 W16) = 782-primOpTag (VecRemOp IntVec 4 W32) = 783-primOpTag (VecRemOp IntVec 2 W64) = 784-primOpTag (VecRemOp IntVec 32 W8) = 785-primOpTag (VecRemOp IntVec 16 W16) = 786-primOpTag (VecRemOp IntVec 8 W32) = 787-primOpTag (VecRemOp IntVec 4 W64) = 788-primOpTag (VecRemOp IntVec 64 W8) = 789-primOpTag (VecRemOp IntVec 32 W16) = 790-primOpTag (VecRemOp IntVec 16 W32) = 791-primOpTag (VecRemOp IntVec 8 W64) = 792-primOpTag (VecRemOp WordVec 16 W8) = 793-primOpTag (VecRemOp WordVec 8 W16) = 794-primOpTag (VecRemOp WordVec 4 W32) = 795-primOpTag (VecRemOp WordVec 2 W64) = 796-primOpTag (VecRemOp WordVec 32 W8) = 797-primOpTag (VecRemOp WordVec 16 W16) = 798-primOpTag (VecRemOp WordVec 8 W32) = 799-primOpTag (VecRemOp WordVec 4 W64) = 800-primOpTag (VecRemOp WordVec 64 W8) = 801-primOpTag (VecRemOp WordVec 32 W16) = 802-primOpTag (VecRemOp WordVec 16 W32) = 803-primOpTag (VecRemOp WordVec 8 W64) = 804-primOpTag (VecNegOp IntVec 16 W8) = 805-primOpTag (VecNegOp IntVec 8 W16) = 806-primOpTag (VecNegOp IntVec 4 W32) = 807-primOpTag (VecNegOp IntVec 2 W64) = 808-primOpTag (VecNegOp IntVec 32 W8) = 809-primOpTag (VecNegOp IntVec 16 W16) = 810-primOpTag (VecNegOp IntVec 8 W32) = 811-primOpTag (VecNegOp IntVec 4 W64) = 812-primOpTag (VecNegOp IntVec 64 W8) = 813-primOpTag (VecNegOp IntVec 32 W16) = 814-primOpTag (VecNegOp IntVec 16 W32) = 815-primOpTag (VecNegOp IntVec 8 W64) = 816-primOpTag (VecNegOp FloatVec 4 W32) = 817-primOpTag (VecNegOp FloatVec 2 W64) = 818-primOpTag (VecNegOp FloatVec 8 W32) = 819-primOpTag (VecNegOp FloatVec 4 W64) = 820-primOpTag (VecNegOp FloatVec 16 W32) = 821-primOpTag (VecNegOp FloatVec 8 W64) = 822-primOpTag (VecIndexByteArrayOp IntVec 16 W8) = 823-primOpTag (VecIndexByteArrayOp IntVec 8 W16) = 824-primOpTag (VecIndexByteArrayOp IntVec 4 W32) = 825-primOpTag (VecIndexByteArrayOp IntVec 2 W64) = 826-primOpTag (VecIndexByteArrayOp IntVec 32 W8) = 827-primOpTag (VecIndexByteArrayOp IntVec 16 W16) = 828-primOpTag (VecIndexByteArrayOp IntVec 8 W32) = 829-primOpTag (VecIndexByteArrayOp IntVec 4 W64) = 830-primOpTag (VecIndexByteArrayOp IntVec 64 W8) = 831-primOpTag (VecIndexByteArrayOp IntVec 32 W16) = 832-primOpTag (VecIndexByteArrayOp IntVec 16 W32) = 833-primOpTag (VecIndexByteArrayOp IntVec 8 W64) = 834-primOpTag (VecIndexByteArrayOp WordVec 16 W8) = 835-primOpTag (VecIndexByteArrayOp WordVec 8 W16) = 836-primOpTag (VecIndexByteArrayOp WordVec 4 W32) = 837-primOpTag (VecIndexByteArrayOp WordVec 2 W64) = 838-primOpTag (VecIndexByteArrayOp WordVec 32 W8) = 839-primOpTag (VecIndexByteArrayOp WordVec 16 W16) = 840-primOpTag (VecIndexByteArrayOp WordVec 8 W32) = 841-primOpTag (VecIndexByteArrayOp WordVec 4 W64) = 842-primOpTag (VecIndexByteArrayOp WordVec 64 W8) = 843-primOpTag (VecIndexByteArrayOp WordVec 32 W16) = 844-primOpTag (VecIndexByteArrayOp WordVec 16 W32) = 845-primOpTag (VecIndexByteArrayOp WordVec 8 W64) = 846-primOpTag (VecIndexByteArrayOp FloatVec 4 W32) = 847-primOpTag (VecIndexByteArrayOp FloatVec 2 W64) = 848-primOpTag (VecIndexByteArrayOp FloatVec 8 W32) = 849-primOpTag (VecIndexByteArrayOp FloatVec 4 W64) = 850-primOpTag (VecIndexByteArrayOp FloatVec 16 W32) = 851-primOpTag (VecIndexByteArrayOp FloatVec 8 W64) = 852-primOpTag (VecReadByteArrayOp IntVec 16 W8) = 853-primOpTag (VecReadByteArrayOp IntVec 8 W16) = 854-primOpTag (VecReadByteArrayOp IntVec 4 W32) = 855-primOpTag (VecReadByteArrayOp IntVec 2 W64) = 856-primOpTag (VecReadByteArrayOp IntVec 32 W8) = 857-primOpTag (VecReadByteArrayOp IntVec 16 W16) = 858-primOpTag (VecReadByteArrayOp IntVec 8 W32) = 859-primOpTag (VecReadByteArrayOp IntVec 4 W64) = 860-primOpTag (VecReadByteArrayOp IntVec 64 W8) = 861-primOpTag (VecReadByteArrayOp IntVec 32 W16) = 862-primOpTag (VecReadByteArrayOp IntVec 16 W32) = 863-primOpTag (VecReadByteArrayOp IntVec 8 W64) = 864-primOpTag (VecReadByteArrayOp WordVec 16 W8) = 865-primOpTag (VecReadByteArrayOp WordVec 8 W16) = 866-primOpTag (VecReadByteArrayOp WordVec 4 W32) = 867-primOpTag (VecReadByteArrayOp WordVec 2 W64) = 868-primOpTag (VecReadByteArrayOp WordVec 32 W8) = 869-primOpTag (VecReadByteArrayOp WordVec 16 W16) = 870-primOpTag (VecReadByteArrayOp WordVec 8 W32) = 871-primOpTag (VecReadByteArrayOp WordVec 4 W64) = 872-primOpTag (VecReadByteArrayOp WordVec 64 W8) = 873-primOpTag (VecReadByteArrayOp WordVec 32 W16) = 874-primOpTag (VecReadByteArrayOp WordVec 16 W32) = 875-primOpTag (VecReadByteArrayOp WordVec 8 W64) = 876-primOpTag (VecReadByteArrayOp FloatVec 4 W32) = 877-primOpTag (VecReadByteArrayOp FloatVec 2 W64) = 878-primOpTag (VecReadByteArrayOp FloatVec 8 W32) = 879-primOpTag (VecReadByteArrayOp FloatVec 4 W64) = 880-primOpTag (VecReadByteArrayOp FloatVec 16 W32) = 881-primOpTag (VecReadByteArrayOp FloatVec 8 W64) = 882-primOpTag (VecWriteByteArrayOp IntVec 16 W8) = 883-primOpTag (VecWriteByteArrayOp IntVec 8 W16) = 884-primOpTag (VecWriteByteArrayOp IntVec 4 W32) = 885-primOpTag (VecWriteByteArrayOp IntVec 2 W64) = 886-primOpTag (VecWriteByteArrayOp IntVec 32 W8) = 887-primOpTag (VecWriteByteArrayOp IntVec 16 W16) = 888-primOpTag (VecWriteByteArrayOp IntVec 8 W32) = 889-primOpTag (VecWriteByteArrayOp IntVec 4 W64) = 890-primOpTag (VecWriteByteArrayOp IntVec 64 W8) = 891-primOpTag (VecWriteByteArrayOp IntVec 32 W16) = 892-primOpTag (VecWriteByteArrayOp IntVec 16 W32) = 893-primOpTag (VecWriteByteArrayOp IntVec 8 W64) = 894-primOpTag (VecWriteByteArrayOp WordVec 16 W8) = 895-primOpTag (VecWriteByteArrayOp WordVec 8 W16) = 896-primOpTag (VecWriteByteArrayOp WordVec 4 W32) = 897-primOpTag (VecWriteByteArrayOp WordVec 2 W64) = 898-primOpTag (VecWriteByteArrayOp WordVec 32 W8) = 899-primOpTag (VecWriteByteArrayOp WordVec 16 W16) = 900-primOpTag (VecWriteByteArrayOp WordVec 8 W32) = 901-primOpTag (VecWriteByteArrayOp WordVec 4 W64) = 902-primOpTag (VecWriteByteArrayOp WordVec 64 W8) = 903-primOpTag (VecWriteByteArrayOp WordVec 32 W16) = 904-primOpTag (VecWriteByteArrayOp WordVec 16 W32) = 905-primOpTag (VecWriteByteArrayOp WordVec 8 W64) = 906-primOpTag (VecWriteByteArrayOp FloatVec 4 W32) = 907-primOpTag (VecWriteByteArrayOp FloatVec 2 W64) = 908-primOpTag (VecWriteByteArrayOp FloatVec 8 W32) = 909-primOpTag (VecWriteByteArrayOp FloatVec 4 W64) = 910-primOpTag (VecWriteByteArrayOp FloatVec 16 W32) = 911-primOpTag (VecWriteByteArrayOp FloatVec 8 W64) = 912-primOpTag (VecIndexOffAddrOp IntVec 16 W8) = 913-primOpTag (VecIndexOffAddrOp IntVec 8 W16) = 914-primOpTag (VecIndexOffAddrOp IntVec 4 W32) = 915-primOpTag (VecIndexOffAddrOp IntVec 2 W64) = 916-primOpTag (VecIndexOffAddrOp IntVec 32 W8) = 917-primOpTag (VecIndexOffAddrOp IntVec 16 W16) = 918-primOpTag (VecIndexOffAddrOp IntVec 8 W32) = 919-primOpTag (VecIndexOffAddrOp IntVec 4 W64) = 920-primOpTag (VecIndexOffAddrOp IntVec 64 W8) = 921-primOpTag (VecIndexOffAddrOp IntVec 32 W16) = 922-primOpTag (VecIndexOffAddrOp IntVec 16 W32) = 923-primOpTag (VecIndexOffAddrOp IntVec 8 W64) = 924-primOpTag (VecIndexOffAddrOp WordVec 16 W8) = 925-primOpTag (VecIndexOffAddrOp WordVec 8 W16) = 926-primOpTag (VecIndexOffAddrOp WordVec 4 W32) = 927-primOpTag (VecIndexOffAddrOp WordVec 2 W64) = 928-primOpTag (VecIndexOffAddrOp WordVec 32 W8) = 929-primOpTag (VecIndexOffAddrOp WordVec 16 W16) = 930-primOpTag (VecIndexOffAddrOp WordVec 8 W32) = 931-primOpTag (VecIndexOffAddrOp WordVec 4 W64) = 932-primOpTag (VecIndexOffAddrOp WordVec 64 W8) = 933-primOpTag (VecIndexOffAddrOp WordVec 32 W16) = 934-primOpTag (VecIndexOffAddrOp WordVec 16 W32) = 935-primOpTag (VecIndexOffAddrOp WordVec 8 W64) = 936-primOpTag (VecIndexOffAddrOp FloatVec 4 W32) = 937-primOpTag (VecIndexOffAddrOp FloatVec 2 W64) = 938-primOpTag (VecIndexOffAddrOp FloatVec 8 W32) = 939-primOpTag (VecIndexOffAddrOp FloatVec 4 W64) = 940-primOpTag (VecIndexOffAddrOp FloatVec 16 W32) = 941-primOpTag (VecIndexOffAddrOp FloatVec 8 W64) = 942-primOpTag (VecReadOffAddrOp IntVec 16 W8) = 943-primOpTag (VecReadOffAddrOp IntVec 8 W16) = 944-primOpTag (VecReadOffAddrOp IntVec 4 W32) = 945-primOpTag (VecReadOffAddrOp IntVec 2 W64) = 946-primOpTag (VecReadOffAddrOp IntVec 32 W8) = 947-primOpTag (VecReadOffAddrOp IntVec 16 W16) = 948-primOpTag (VecReadOffAddrOp IntVec 8 W32) = 949-primOpTag (VecReadOffAddrOp IntVec 4 W64) = 950-primOpTag (VecReadOffAddrOp IntVec 64 W8) = 951-primOpTag (VecReadOffAddrOp IntVec 32 W16) = 952-primOpTag (VecReadOffAddrOp IntVec 16 W32) = 953-primOpTag (VecReadOffAddrOp IntVec 8 W64) = 954-primOpTag (VecReadOffAddrOp WordVec 16 W8) = 955-primOpTag (VecReadOffAddrOp WordVec 8 W16) = 956-primOpTag (VecReadOffAddrOp WordVec 4 W32) = 957-primOpTag (VecReadOffAddrOp WordVec 2 W64) = 958-primOpTag (VecReadOffAddrOp WordVec 32 W8) = 959-primOpTag (VecReadOffAddrOp WordVec 16 W16) = 960-primOpTag (VecReadOffAddrOp WordVec 8 W32) = 961-primOpTag (VecReadOffAddrOp WordVec 4 W64) = 962-primOpTag (VecReadOffAddrOp WordVec 64 W8) = 963-primOpTag (VecReadOffAddrOp WordVec 32 W16) = 964-primOpTag (VecReadOffAddrOp WordVec 16 W32) = 965-primOpTag (VecReadOffAddrOp WordVec 8 W64) = 966-primOpTag (VecReadOffAddrOp FloatVec 4 W32) = 967-primOpTag (VecReadOffAddrOp FloatVec 2 W64) = 968-primOpTag (VecReadOffAddrOp FloatVec 8 W32) = 969-primOpTag (VecReadOffAddrOp FloatVec 4 W64) = 970-primOpTag (VecReadOffAddrOp FloatVec 16 W32) = 971-primOpTag (VecReadOffAddrOp FloatVec 8 W64) = 972-primOpTag (VecWriteOffAddrOp IntVec 16 W8) = 973-primOpTag (VecWriteOffAddrOp IntVec 8 W16) = 974-primOpTag (VecWriteOffAddrOp IntVec 4 W32) = 975-primOpTag (VecWriteOffAddrOp IntVec 2 W64) = 976-primOpTag (VecWriteOffAddrOp IntVec 32 W8) = 977-primOpTag (VecWriteOffAddrOp IntVec 16 W16) = 978-primOpTag (VecWriteOffAddrOp IntVec 8 W32) = 979-primOpTag (VecWriteOffAddrOp IntVec 4 W64) = 980-primOpTag (VecWriteOffAddrOp IntVec 64 W8) = 981-primOpTag (VecWriteOffAddrOp IntVec 32 W16) = 982-primOpTag (VecWriteOffAddrOp IntVec 16 W32) = 983-primOpTag (VecWriteOffAddrOp IntVec 8 W64) = 984-primOpTag (VecWriteOffAddrOp WordVec 16 W8) = 985-primOpTag (VecWriteOffAddrOp WordVec 8 W16) = 986-primOpTag (VecWriteOffAddrOp WordVec 4 W32) = 987-primOpTag (VecWriteOffAddrOp WordVec 2 W64) = 988-primOpTag (VecWriteOffAddrOp WordVec 32 W8) = 989-primOpTag (VecWriteOffAddrOp WordVec 16 W16) = 990-primOpTag (VecWriteOffAddrOp WordVec 8 W32) = 991-primOpTag (VecWriteOffAddrOp WordVec 4 W64) = 992-primOpTag (VecWriteOffAddrOp WordVec 64 W8) = 993-primOpTag (VecWriteOffAddrOp WordVec 32 W16) = 994-primOpTag (VecWriteOffAddrOp WordVec 16 W32) = 995-primOpTag (VecWriteOffAddrOp WordVec 8 W64) = 996-primOpTag (VecWriteOffAddrOp FloatVec 4 W32) = 997-primOpTag (VecWriteOffAddrOp FloatVec 2 W64) = 998-primOpTag (VecWriteOffAddrOp FloatVec 8 W32) = 999-primOpTag (VecWriteOffAddrOp FloatVec 4 W64) = 1000-primOpTag (VecWriteOffAddrOp FloatVec 16 W32) = 1001-primOpTag (VecWriteOffAddrOp FloatVec 8 W64) = 1002-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W8) = 1003-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W16) = 1004-primOpTag (VecIndexScalarByteArrayOp IntVec 4 W32) = 1005-primOpTag (VecIndexScalarByteArrayOp IntVec 2 W64) = 1006-primOpTag (VecIndexScalarByteArrayOp IntVec 32 W8) = 1007-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W16) = 1008-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W32) = 1009-primOpTag (VecIndexScalarByteArrayOp IntVec 4 W64) = 1010-primOpTag (VecIndexScalarByteArrayOp IntVec 64 W8) = 1011-primOpTag (VecIndexScalarByteArrayOp IntVec 32 W16) = 1012-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W32) = 1013-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W64) = 1014-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W8) = 1015-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W16) = 1016-primOpTag (VecIndexScalarByteArrayOp WordVec 4 W32) = 1017-primOpTag (VecIndexScalarByteArrayOp WordVec 2 W64) = 1018-primOpTag (VecIndexScalarByteArrayOp WordVec 32 W8) = 1019-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W16) = 1020-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W32) = 1021-primOpTag (VecIndexScalarByteArrayOp WordVec 4 W64) = 1022-primOpTag (VecIndexScalarByteArrayOp WordVec 64 W8) = 1023-primOpTag (VecIndexScalarByteArrayOp WordVec 32 W16) = 1024-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W32) = 1025-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W64) = 1026-primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W32) = 1027-primOpTag (VecIndexScalarByteArrayOp FloatVec 2 W64) = 1028-primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W32) = 1029-primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W64) = 1030-primOpTag (VecIndexScalarByteArrayOp FloatVec 16 W32) = 1031-primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W64) = 1032-primOpTag (VecReadScalarByteArrayOp IntVec 16 W8) = 1033-primOpTag (VecReadScalarByteArrayOp IntVec 8 W16) = 1034-primOpTag (VecReadScalarByteArrayOp IntVec 4 W32) = 1035-primOpTag (VecReadScalarByteArrayOp IntVec 2 W64) = 1036-primOpTag (VecReadScalarByteArrayOp IntVec 32 W8) = 1037-primOpTag (VecReadScalarByteArrayOp IntVec 16 W16) = 1038-primOpTag (VecReadScalarByteArrayOp IntVec 8 W32) = 1039-primOpTag (VecReadScalarByteArrayOp IntVec 4 W64) = 1040-primOpTag (VecReadScalarByteArrayOp IntVec 64 W8) = 1041-primOpTag (VecReadScalarByteArrayOp IntVec 32 W16) = 1042-primOpTag (VecReadScalarByteArrayOp IntVec 16 W32) = 1043-primOpTag (VecReadScalarByteArrayOp IntVec 8 W64) = 1044-primOpTag (VecReadScalarByteArrayOp WordVec 16 W8) = 1045-primOpTag (VecReadScalarByteArrayOp WordVec 8 W16) = 1046-primOpTag (VecReadScalarByteArrayOp WordVec 4 W32) = 1047-primOpTag (VecReadScalarByteArrayOp WordVec 2 W64) = 1048-primOpTag (VecReadScalarByteArrayOp WordVec 32 W8) = 1049-primOpTag (VecReadScalarByteArrayOp WordVec 16 W16) = 1050-primOpTag (VecReadScalarByteArrayOp WordVec 8 W32) = 1051-primOpTag (VecReadScalarByteArrayOp WordVec 4 W64) = 1052-primOpTag (VecReadScalarByteArrayOp WordVec 64 W8) = 1053-primOpTag (VecReadScalarByteArrayOp WordVec 32 W16) = 1054-primOpTag (VecReadScalarByteArrayOp WordVec 16 W32) = 1055-primOpTag (VecReadScalarByteArrayOp WordVec 8 W64) = 1056-primOpTag (VecReadScalarByteArrayOp FloatVec 4 W32) = 1057-primOpTag (VecReadScalarByteArrayOp FloatVec 2 W64) = 1058-primOpTag (VecReadScalarByteArrayOp FloatVec 8 W32) = 1059-primOpTag (VecReadScalarByteArrayOp FloatVec 4 W64) = 1060-primOpTag (VecReadScalarByteArrayOp FloatVec 16 W32) = 1061-primOpTag (VecReadScalarByteArrayOp FloatVec 8 W64) = 1062-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W8) = 1063-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W16) = 1064-primOpTag (VecWriteScalarByteArrayOp IntVec 4 W32) = 1065-primOpTag (VecWriteScalarByteArrayOp IntVec 2 W64) = 1066-primOpTag (VecWriteScalarByteArrayOp IntVec 32 W8) = 1067-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W16) = 1068-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W32) = 1069-primOpTag (VecWriteScalarByteArrayOp IntVec 4 W64) = 1070-primOpTag (VecWriteScalarByteArrayOp IntVec 64 W8) = 1071-primOpTag (VecWriteScalarByteArrayOp IntVec 32 W16) = 1072-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W32) = 1073-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W64) = 1074-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W8) = 1075-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W16) = 1076-primOpTag (VecWriteScalarByteArrayOp WordVec 4 W32) = 1077-primOpTag (VecWriteScalarByteArrayOp WordVec 2 W64) = 1078-primOpTag (VecWriteScalarByteArrayOp WordVec 32 W8) = 1079-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W16) = 1080-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W32) = 1081-primOpTag (VecWriteScalarByteArrayOp WordVec 4 W64) = 1082-primOpTag (VecWriteScalarByteArrayOp WordVec 64 W8) = 1083-primOpTag (VecWriteScalarByteArrayOp WordVec 32 W16) = 1084-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W32) = 1085-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W64) = 1086-primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W32) = 1087-primOpTag (VecWriteScalarByteArrayOp FloatVec 2 W64) = 1088-primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W32) = 1089-primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W64) = 1090-primOpTag (VecWriteScalarByteArrayOp FloatVec 16 W32) = 1091-primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W64) = 1092-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W8) = 1093-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W16) = 1094-primOpTag (VecIndexScalarOffAddrOp IntVec 4 W32) = 1095-primOpTag (VecIndexScalarOffAddrOp IntVec 2 W64) = 1096-primOpTag (VecIndexScalarOffAddrOp IntVec 32 W8) = 1097-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W16) = 1098-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W32) = 1099-primOpTag (VecIndexScalarOffAddrOp IntVec 4 W64) = 1100-primOpTag (VecIndexScalarOffAddrOp IntVec 64 W8) = 1101-primOpTag (VecIndexScalarOffAddrOp IntVec 32 W16) = 1102-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W32) = 1103-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W64) = 1104-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W8) = 1105-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W16) = 1106-primOpTag (VecIndexScalarOffAddrOp WordVec 4 W32) = 1107-primOpTag (VecIndexScalarOffAddrOp WordVec 2 W64) = 1108-primOpTag (VecIndexScalarOffAddrOp WordVec 32 W8) = 1109-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W16) = 1110-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W32) = 1111-primOpTag (VecIndexScalarOffAddrOp WordVec 4 W64) = 1112-primOpTag (VecIndexScalarOffAddrOp WordVec 64 W8) = 1113-primOpTag (VecIndexScalarOffAddrOp WordVec 32 W16) = 1114-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W32) = 1115-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W64) = 1116-primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W32) = 1117-primOpTag (VecIndexScalarOffAddrOp FloatVec 2 W64) = 1118-primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W32) = 1119-primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W64) = 1120-primOpTag (VecIndexScalarOffAddrOp FloatVec 16 W32) = 1121-primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W64) = 1122-primOpTag (VecReadScalarOffAddrOp IntVec 16 W8) = 1123-primOpTag (VecReadScalarOffAddrOp IntVec 8 W16) = 1124-primOpTag (VecReadScalarOffAddrOp IntVec 4 W32) = 1125-primOpTag (VecReadScalarOffAddrOp IntVec 2 W64) = 1126-primOpTag (VecReadScalarOffAddrOp IntVec 32 W8) = 1127-primOpTag (VecReadScalarOffAddrOp IntVec 16 W16) = 1128-primOpTag (VecReadScalarOffAddrOp IntVec 8 W32) = 1129-primOpTag (VecReadScalarOffAddrOp IntVec 4 W64) = 1130-primOpTag (VecReadScalarOffAddrOp IntVec 64 W8) = 1131-primOpTag (VecReadScalarOffAddrOp IntVec 32 W16) = 1132-primOpTag (VecReadScalarOffAddrOp IntVec 16 W32) = 1133-primOpTag (VecReadScalarOffAddrOp IntVec 8 W64) = 1134-primOpTag (VecReadScalarOffAddrOp WordVec 16 W8) = 1135-primOpTag (VecReadScalarOffAddrOp WordVec 8 W16) = 1136-primOpTag (VecReadScalarOffAddrOp WordVec 4 W32) = 1137-primOpTag (VecReadScalarOffAddrOp WordVec 2 W64) = 1138-primOpTag (VecReadScalarOffAddrOp WordVec 32 W8) = 1139-primOpTag (VecReadScalarOffAddrOp WordVec 16 W16) = 1140-primOpTag (VecReadScalarOffAddrOp WordVec 8 W32) = 1141-primOpTag (VecReadScalarOffAddrOp WordVec 4 W64) = 1142-primOpTag (VecReadScalarOffAddrOp WordVec 64 W8) = 1143-primOpTag (VecReadScalarOffAddrOp WordVec 32 W16) = 1144-primOpTag (VecReadScalarOffAddrOp WordVec 16 W32) = 1145-primOpTag (VecReadScalarOffAddrOp WordVec 8 W64) = 1146-primOpTag (VecReadScalarOffAddrOp FloatVec 4 W32) = 1147-primOpTag (VecReadScalarOffAddrOp FloatVec 2 W64) = 1148-primOpTag (VecReadScalarOffAddrOp FloatVec 8 W32) = 1149-primOpTag (VecReadScalarOffAddrOp FloatVec 4 W64) = 1150-primOpTag (VecReadScalarOffAddrOp FloatVec 16 W32) = 1151-primOpTag (VecReadScalarOffAddrOp FloatVec 8 W64) = 1152-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W8) = 1153-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W16) = 1154-primOpTag (VecWriteScalarOffAddrOp IntVec 4 W32) = 1155-primOpTag (VecWriteScalarOffAddrOp IntVec 2 W64) = 1156-primOpTag (VecWriteScalarOffAddrOp IntVec 32 W8) = 1157-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W16) = 1158-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W32) = 1159-primOpTag (VecWriteScalarOffAddrOp IntVec 4 W64) = 1160-primOpTag (VecWriteScalarOffAddrOp IntVec 64 W8) = 1161-primOpTag (VecWriteScalarOffAddrOp IntVec 32 W16) = 1162-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W32) = 1163-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W64) = 1164-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W8) = 1165-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W16) = 1166-primOpTag (VecWriteScalarOffAddrOp WordVec 4 W32) = 1167-primOpTag (VecWriteScalarOffAddrOp WordVec 2 W64) = 1168-primOpTag (VecWriteScalarOffAddrOp WordVec 32 W8) = 1169-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W16) = 1170-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W32) = 1171-primOpTag (VecWriteScalarOffAddrOp WordVec 4 W64) = 1172-primOpTag (VecWriteScalarOffAddrOp WordVec 64 W8) = 1173-primOpTag (VecWriteScalarOffAddrOp WordVec 32 W16) = 1174-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W32) = 1175-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W64) = 1176-primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W32) = 1177-primOpTag (VecWriteScalarOffAddrOp FloatVec 2 W64) = 1178-primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W32) = 1179-primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W64) = 1180-primOpTag (VecWriteScalarOffAddrOp FloatVec 16 W32) = 1181-primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W64) = 1182-primOpTag PrefetchByteArrayOp3 = 1183-primOpTag PrefetchMutableByteArrayOp3 = 1184-primOpTag PrefetchAddrOp3 = 1185-primOpTag PrefetchValueOp3 = 1186-primOpTag PrefetchByteArrayOp2 = 1187-primOpTag PrefetchMutableByteArrayOp2 = 1188-primOpTag PrefetchAddrOp2 = 1189-primOpTag PrefetchValueOp2 = 1190-primOpTag PrefetchByteArrayOp1 = 1191-primOpTag PrefetchMutableByteArrayOp1 = 1192-primOpTag PrefetchAddrOp1 = 1193-primOpTag PrefetchValueOp1 = 1194-primOpTag PrefetchByteArrayOp0 = 1195-primOpTag PrefetchMutableByteArrayOp0 = 1196-primOpTag PrefetchAddrOp0 = 1197-primOpTag PrefetchValueOp0 = 1198+maxPrimOpTag = 1202+primOpTag :: PrimOp -> Int+primOpTag CharGtOp = 1+primOpTag CharGeOp = 2+primOpTag CharEqOp = 3+primOpTag CharNeOp = 4+primOpTag CharLtOp = 5+primOpTag CharLeOp = 6+primOpTag OrdOp = 7+primOpTag IntAddOp = 8+primOpTag IntSubOp = 9+primOpTag IntMulOp = 10+primOpTag IntMulMayOfloOp = 11+primOpTag IntQuotOp = 12+primOpTag IntRemOp = 13+primOpTag IntQuotRemOp = 14+primOpTag AndIOp = 15+primOpTag OrIOp = 16+primOpTag XorIOp = 17+primOpTag NotIOp = 18+primOpTag IntNegOp = 19+primOpTag IntAddCOp = 20+primOpTag IntSubCOp = 21+primOpTag IntGtOp = 22+primOpTag IntGeOp = 23+primOpTag IntEqOp = 24+primOpTag IntNeOp = 25+primOpTag IntLtOp = 26+primOpTag IntLeOp = 27+primOpTag ChrOp = 28+primOpTag Int2WordOp = 29+primOpTag Int2FloatOp = 30+primOpTag Int2DoubleOp = 31+primOpTag Word2FloatOp = 32+primOpTag Word2DoubleOp = 33+primOpTag ISllOp = 34+primOpTag ISraOp = 35+primOpTag ISrlOp = 36+primOpTag Int8Extend = 37+primOpTag Int8Narrow = 38+primOpTag Int8NegOp = 39+primOpTag Int8AddOp = 40+primOpTag Int8SubOp = 41+primOpTag Int8MulOp = 42+primOpTag Int8QuotOp = 43+primOpTag Int8RemOp = 44+primOpTag Int8QuotRemOp = 45+primOpTag Int8EqOp = 46+primOpTag Int8GeOp = 47+primOpTag Int8GtOp = 48+primOpTag Int8LeOp = 49+primOpTag Int8LtOp = 50+primOpTag Int8NeOp = 51+primOpTag Word8Extend = 52+primOpTag Word8Narrow = 53+primOpTag Word8NotOp = 54+primOpTag Word8AddOp = 55+primOpTag Word8SubOp = 56+primOpTag Word8MulOp = 57+primOpTag Word8QuotOp = 58+primOpTag Word8RemOp = 59+primOpTag Word8QuotRemOp = 60+primOpTag Word8EqOp = 61+primOpTag Word8GeOp = 62+primOpTag Word8GtOp = 63+primOpTag Word8LeOp = 64+primOpTag Word8LtOp = 65+primOpTag Word8NeOp = 66+primOpTag Int16Extend = 67+primOpTag Int16Narrow = 68+primOpTag Int16NegOp = 69+primOpTag Int16AddOp = 70+primOpTag Int16SubOp = 71+primOpTag Int16MulOp = 72+primOpTag Int16QuotOp = 73+primOpTag Int16RemOp = 74+primOpTag Int16QuotRemOp = 75+primOpTag Int16EqOp = 76+primOpTag Int16GeOp = 77+primOpTag Int16GtOp = 78+primOpTag Int16LeOp = 79+primOpTag Int16LtOp = 80+primOpTag Int16NeOp = 81+primOpTag Word16Extend = 82+primOpTag Word16Narrow = 83+primOpTag Word16NotOp = 84+primOpTag Word16AddOp = 85+primOpTag Word16SubOp = 86+primOpTag Word16MulOp = 87+primOpTag Word16QuotOp = 88+primOpTag Word16RemOp = 89+primOpTag Word16QuotRemOp = 90+primOpTag Word16EqOp = 91+primOpTag Word16GeOp = 92+primOpTag Word16GtOp = 93+primOpTag Word16LeOp = 94+primOpTag Word16LtOp = 95+primOpTag Word16NeOp = 96+primOpTag WordAddOp = 97+primOpTag WordAddCOp = 98+primOpTag WordSubCOp = 99+primOpTag WordAdd2Op = 100+primOpTag WordSubOp = 101+primOpTag WordMulOp = 102+primOpTag WordMul2Op = 103+primOpTag WordQuotOp = 104+primOpTag WordRemOp = 105+primOpTag WordQuotRemOp = 106+primOpTag WordQuotRem2Op = 107+primOpTag AndOp = 108+primOpTag OrOp = 109+primOpTag XorOp = 110+primOpTag NotOp = 111+primOpTag SllOp = 112+primOpTag SrlOp = 113+primOpTag Word2IntOp = 114+primOpTag WordGtOp = 115+primOpTag WordGeOp = 116+primOpTag WordEqOp = 117+primOpTag WordNeOp = 118+primOpTag WordLtOp = 119+primOpTag WordLeOp = 120+primOpTag PopCnt8Op = 121+primOpTag PopCnt16Op = 122+primOpTag PopCnt32Op = 123+primOpTag PopCnt64Op = 124+primOpTag PopCntOp = 125+primOpTag Pdep8Op = 126+primOpTag Pdep16Op = 127+primOpTag Pdep32Op = 128+primOpTag Pdep64Op = 129+primOpTag PdepOp = 130+primOpTag Pext8Op = 131+primOpTag Pext16Op = 132+primOpTag Pext32Op = 133+primOpTag Pext64Op = 134+primOpTag PextOp = 135+primOpTag Clz8Op = 136+primOpTag Clz16Op = 137+primOpTag Clz32Op = 138+primOpTag Clz64Op = 139+primOpTag ClzOp = 140+primOpTag Ctz8Op = 141+primOpTag Ctz16Op = 142+primOpTag Ctz32Op = 143+primOpTag Ctz64Op = 144+primOpTag CtzOp = 145+primOpTag BSwap16Op = 146+primOpTag BSwap32Op = 147+primOpTag BSwap64Op = 148+primOpTag BSwapOp = 149+primOpTag BRev8Op = 150+primOpTag BRev16Op = 151+primOpTag BRev32Op = 152+primOpTag BRev64Op = 153+primOpTag BRevOp = 154+primOpTag Narrow8IntOp = 155+primOpTag Narrow16IntOp = 156+primOpTag Narrow32IntOp = 157+primOpTag Narrow8WordOp = 158+primOpTag Narrow16WordOp = 159+primOpTag Narrow32WordOp = 160+primOpTag DoubleGtOp = 161+primOpTag DoubleGeOp = 162+primOpTag DoubleEqOp = 163+primOpTag DoubleNeOp = 164+primOpTag DoubleLtOp = 165+primOpTag DoubleLeOp = 166+primOpTag DoubleAddOp = 167+primOpTag DoubleSubOp = 168+primOpTag DoubleMulOp = 169+primOpTag DoubleDivOp = 170+primOpTag DoubleNegOp = 171+primOpTag DoubleFabsOp = 172+primOpTag Double2IntOp = 173+primOpTag Double2FloatOp = 174+primOpTag DoubleExpOp = 175+primOpTag DoubleExpM1Op = 176+primOpTag DoubleLogOp = 177+primOpTag DoubleLog1POp = 178+primOpTag DoubleSqrtOp = 179+primOpTag DoubleSinOp = 180+primOpTag DoubleCosOp = 181+primOpTag DoubleTanOp = 182+primOpTag DoubleAsinOp = 183+primOpTag DoubleAcosOp = 184+primOpTag DoubleAtanOp = 185+primOpTag DoubleSinhOp = 186+primOpTag DoubleCoshOp = 187+primOpTag DoubleTanhOp = 188+primOpTag DoubleAsinhOp = 189+primOpTag DoubleAcoshOp = 190+primOpTag DoubleAtanhOp = 191+primOpTag DoublePowerOp = 192+primOpTag DoubleDecode_2IntOp = 193+primOpTag DoubleDecode_Int64Op = 194+primOpTag FloatGtOp = 195+primOpTag FloatGeOp = 196+primOpTag FloatEqOp = 197+primOpTag FloatNeOp = 198+primOpTag FloatLtOp = 199+primOpTag FloatLeOp = 200+primOpTag FloatAddOp = 201+primOpTag FloatSubOp = 202+primOpTag FloatMulOp = 203+primOpTag FloatDivOp = 204+primOpTag FloatNegOp = 205+primOpTag FloatFabsOp = 206+primOpTag Float2IntOp = 207+primOpTag FloatExpOp = 208+primOpTag FloatExpM1Op = 209+primOpTag FloatLogOp = 210+primOpTag FloatLog1POp = 211+primOpTag FloatSqrtOp = 212+primOpTag FloatSinOp = 213+primOpTag FloatCosOp = 214+primOpTag FloatTanOp = 215+primOpTag FloatAsinOp = 216+primOpTag FloatAcosOp = 217+primOpTag FloatAtanOp = 218+primOpTag FloatSinhOp = 219+primOpTag FloatCoshOp = 220+primOpTag FloatTanhOp = 221+primOpTag FloatAsinhOp = 222+primOpTag FloatAcoshOp = 223+primOpTag FloatAtanhOp = 224+primOpTag FloatPowerOp = 225+primOpTag Float2DoubleOp = 226+primOpTag FloatDecode_IntOp = 227+primOpTag NewArrayOp = 228+primOpTag SameMutableArrayOp = 229+primOpTag ReadArrayOp = 230+primOpTag WriteArrayOp = 231+primOpTag SizeofArrayOp = 232+primOpTag SizeofMutableArrayOp = 233+primOpTag IndexArrayOp = 234+primOpTag UnsafeFreezeArrayOp = 235+primOpTag UnsafeThawArrayOp = 236+primOpTag CopyArrayOp = 237+primOpTag CopyMutableArrayOp = 238+primOpTag CloneArrayOp = 239+primOpTag CloneMutableArrayOp = 240+primOpTag FreezeArrayOp = 241+primOpTag ThawArrayOp = 242+primOpTag CasArrayOp = 243+primOpTag NewSmallArrayOp = 244+primOpTag SameSmallMutableArrayOp = 245+primOpTag ReadSmallArrayOp = 246+primOpTag WriteSmallArrayOp = 247+primOpTag SizeofSmallArrayOp = 248+primOpTag SizeofSmallMutableArrayOp = 249+primOpTag IndexSmallArrayOp = 250+primOpTag UnsafeFreezeSmallArrayOp = 251+primOpTag UnsafeThawSmallArrayOp = 252+primOpTag CopySmallArrayOp = 253+primOpTag CopySmallMutableArrayOp = 254+primOpTag CloneSmallArrayOp = 255+primOpTag CloneSmallMutableArrayOp = 256+primOpTag FreezeSmallArrayOp = 257+primOpTag ThawSmallArrayOp = 258+primOpTag CasSmallArrayOp = 259+primOpTag NewByteArrayOp_Char = 260+primOpTag NewPinnedByteArrayOp_Char = 261+primOpTag NewAlignedPinnedByteArrayOp_Char = 262+primOpTag MutableByteArrayIsPinnedOp = 263+primOpTag ByteArrayIsPinnedOp = 264+primOpTag ByteArrayContents_Char = 265+primOpTag SameMutableByteArrayOp = 266+primOpTag ShrinkMutableByteArrayOp_Char = 267+primOpTag ResizeMutableByteArrayOp_Char = 268+primOpTag UnsafeFreezeByteArrayOp = 269+primOpTag SizeofByteArrayOp = 270+primOpTag SizeofMutableByteArrayOp = 271+primOpTag GetSizeofMutableByteArrayOp = 272+primOpTag IndexByteArrayOp_Char = 273+primOpTag IndexByteArrayOp_WideChar = 274+primOpTag IndexByteArrayOp_Int = 275+primOpTag IndexByteArrayOp_Word = 276+primOpTag IndexByteArrayOp_Addr = 277+primOpTag IndexByteArrayOp_Float = 278+primOpTag IndexByteArrayOp_Double = 279+primOpTag IndexByteArrayOp_StablePtr = 280+primOpTag IndexByteArrayOp_Int8 = 281+primOpTag IndexByteArrayOp_Int16 = 282+primOpTag IndexByteArrayOp_Int32 = 283+primOpTag IndexByteArrayOp_Int64 = 284+primOpTag IndexByteArrayOp_Word8 = 285+primOpTag IndexByteArrayOp_Word16 = 286+primOpTag IndexByteArrayOp_Word32 = 287+primOpTag IndexByteArrayOp_Word64 = 288+primOpTag IndexByteArrayOp_Word8AsChar = 289+primOpTag IndexByteArrayOp_Word8AsWideChar = 290+primOpTag IndexByteArrayOp_Word8AsAddr = 291+primOpTag IndexByteArrayOp_Word8AsFloat = 292+primOpTag IndexByteArrayOp_Word8AsDouble = 293+primOpTag IndexByteArrayOp_Word8AsStablePtr = 294+primOpTag IndexByteArrayOp_Word8AsInt16 = 295+primOpTag IndexByteArrayOp_Word8AsInt32 = 296+primOpTag IndexByteArrayOp_Word8AsInt64 = 297+primOpTag IndexByteArrayOp_Word8AsInt = 298+primOpTag IndexByteArrayOp_Word8AsWord16 = 299+primOpTag IndexByteArrayOp_Word8AsWord32 = 300+primOpTag IndexByteArrayOp_Word8AsWord64 = 301+primOpTag IndexByteArrayOp_Word8AsWord = 302+primOpTag ReadByteArrayOp_Char = 303+primOpTag ReadByteArrayOp_WideChar = 304+primOpTag ReadByteArrayOp_Int = 305+primOpTag ReadByteArrayOp_Word = 306+primOpTag ReadByteArrayOp_Addr = 307+primOpTag ReadByteArrayOp_Float = 308+primOpTag ReadByteArrayOp_Double = 309+primOpTag ReadByteArrayOp_StablePtr = 310+primOpTag ReadByteArrayOp_Int8 = 311+primOpTag ReadByteArrayOp_Int16 = 312+primOpTag ReadByteArrayOp_Int32 = 313+primOpTag ReadByteArrayOp_Int64 = 314+primOpTag ReadByteArrayOp_Word8 = 315+primOpTag ReadByteArrayOp_Word16 = 316+primOpTag ReadByteArrayOp_Word32 = 317+primOpTag ReadByteArrayOp_Word64 = 318+primOpTag ReadByteArrayOp_Word8AsChar = 319+primOpTag ReadByteArrayOp_Word8AsWideChar = 320+primOpTag ReadByteArrayOp_Word8AsAddr = 321+primOpTag ReadByteArrayOp_Word8AsFloat = 322+primOpTag ReadByteArrayOp_Word8AsDouble = 323+primOpTag ReadByteArrayOp_Word8AsStablePtr = 324+primOpTag ReadByteArrayOp_Word8AsInt16 = 325+primOpTag ReadByteArrayOp_Word8AsInt32 = 326+primOpTag ReadByteArrayOp_Word8AsInt64 = 327+primOpTag ReadByteArrayOp_Word8AsInt = 328+primOpTag ReadByteArrayOp_Word8AsWord16 = 329+primOpTag ReadByteArrayOp_Word8AsWord32 = 330+primOpTag ReadByteArrayOp_Word8AsWord64 = 331+primOpTag ReadByteArrayOp_Word8AsWord = 332+primOpTag WriteByteArrayOp_Char = 333+primOpTag WriteByteArrayOp_WideChar = 334+primOpTag WriteByteArrayOp_Int = 335+primOpTag WriteByteArrayOp_Word = 336+primOpTag WriteByteArrayOp_Addr = 337+primOpTag WriteByteArrayOp_Float = 338+primOpTag WriteByteArrayOp_Double = 339+primOpTag WriteByteArrayOp_StablePtr = 340+primOpTag WriteByteArrayOp_Int8 = 341+primOpTag WriteByteArrayOp_Int16 = 342+primOpTag WriteByteArrayOp_Int32 = 343+primOpTag WriteByteArrayOp_Int64 = 344+primOpTag WriteByteArrayOp_Word8 = 345+primOpTag WriteByteArrayOp_Word16 = 346+primOpTag WriteByteArrayOp_Word32 = 347+primOpTag WriteByteArrayOp_Word64 = 348+primOpTag WriteByteArrayOp_Word8AsChar = 349+primOpTag WriteByteArrayOp_Word8AsWideChar = 350+primOpTag WriteByteArrayOp_Word8AsAddr = 351+primOpTag WriteByteArrayOp_Word8AsFloat = 352+primOpTag WriteByteArrayOp_Word8AsDouble = 353+primOpTag WriteByteArrayOp_Word8AsStablePtr = 354+primOpTag WriteByteArrayOp_Word8AsInt16 = 355+primOpTag WriteByteArrayOp_Word8AsInt32 = 356+primOpTag WriteByteArrayOp_Word8AsInt64 = 357+primOpTag WriteByteArrayOp_Word8AsInt = 358+primOpTag WriteByteArrayOp_Word8AsWord16 = 359+primOpTag WriteByteArrayOp_Word8AsWord32 = 360+primOpTag WriteByteArrayOp_Word8AsWord64 = 361+primOpTag WriteByteArrayOp_Word8AsWord = 362+primOpTag CompareByteArraysOp = 363+primOpTag CopyByteArrayOp = 364+primOpTag CopyMutableByteArrayOp = 365+primOpTag CopyByteArrayToAddrOp = 366+primOpTag CopyMutableByteArrayToAddrOp = 367+primOpTag CopyAddrToByteArrayOp = 368+primOpTag SetByteArrayOp = 369+primOpTag AtomicReadByteArrayOp_Int = 370+primOpTag AtomicWriteByteArrayOp_Int = 371+primOpTag CasByteArrayOp_Int = 372+primOpTag FetchAddByteArrayOp_Int = 373+primOpTag FetchSubByteArrayOp_Int = 374+primOpTag FetchAndByteArrayOp_Int = 375+primOpTag FetchNandByteArrayOp_Int = 376+primOpTag FetchOrByteArrayOp_Int = 377+primOpTag FetchXorByteArrayOp_Int = 378+primOpTag NewArrayArrayOp = 379+primOpTag SameMutableArrayArrayOp = 380+primOpTag UnsafeFreezeArrayArrayOp = 381+primOpTag SizeofArrayArrayOp = 382+primOpTag SizeofMutableArrayArrayOp = 383+primOpTag IndexArrayArrayOp_ByteArray = 384+primOpTag IndexArrayArrayOp_ArrayArray = 385+primOpTag ReadArrayArrayOp_ByteArray = 386+primOpTag ReadArrayArrayOp_MutableByteArray = 387+primOpTag ReadArrayArrayOp_ArrayArray = 388+primOpTag ReadArrayArrayOp_MutableArrayArray = 389+primOpTag WriteArrayArrayOp_ByteArray = 390+primOpTag WriteArrayArrayOp_MutableByteArray = 391+primOpTag WriteArrayArrayOp_ArrayArray = 392+primOpTag WriteArrayArrayOp_MutableArrayArray = 393+primOpTag CopyArrayArrayOp = 394+primOpTag CopyMutableArrayArrayOp = 395+primOpTag AddrAddOp = 396+primOpTag AddrSubOp = 397+primOpTag AddrRemOp = 398+primOpTag Addr2IntOp = 399+primOpTag Int2AddrOp = 400+primOpTag AddrGtOp = 401+primOpTag AddrGeOp = 402+primOpTag AddrEqOp = 403+primOpTag AddrNeOp = 404+primOpTag AddrLtOp = 405+primOpTag AddrLeOp = 406+primOpTag IndexOffAddrOp_Char = 407+primOpTag IndexOffAddrOp_WideChar = 408+primOpTag IndexOffAddrOp_Int = 409+primOpTag IndexOffAddrOp_Word = 410+primOpTag IndexOffAddrOp_Addr = 411+primOpTag IndexOffAddrOp_Float = 412+primOpTag IndexOffAddrOp_Double = 413+primOpTag IndexOffAddrOp_StablePtr = 414+primOpTag IndexOffAddrOp_Int8 = 415+primOpTag IndexOffAddrOp_Int16 = 416+primOpTag IndexOffAddrOp_Int32 = 417+primOpTag IndexOffAddrOp_Int64 = 418+primOpTag IndexOffAddrOp_Word8 = 419+primOpTag IndexOffAddrOp_Word16 = 420+primOpTag IndexOffAddrOp_Word32 = 421+primOpTag IndexOffAddrOp_Word64 = 422+primOpTag ReadOffAddrOp_Char = 423+primOpTag ReadOffAddrOp_WideChar = 424+primOpTag ReadOffAddrOp_Int = 425+primOpTag ReadOffAddrOp_Word = 426+primOpTag ReadOffAddrOp_Addr = 427+primOpTag ReadOffAddrOp_Float = 428+primOpTag ReadOffAddrOp_Double = 429+primOpTag ReadOffAddrOp_StablePtr = 430+primOpTag ReadOffAddrOp_Int8 = 431+primOpTag ReadOffAddrOp_Int16 = 432+primOpTag ReadOffAddrOp_Int32 = 433+primOpTag ReadOffAddrOp_Int64 = 434+primOpTag ReadOffAddrOp_Word8 = 435+primOpTag ReadOffAddrOp_Word16 = 436+primOpTag ReadOffAddrOp_Word32 = 437+primOpTag ReadOffAddrOp_Word64 = 438+primOpTag WriteOffAddrOp_Char = 439+primOpTag WriteOffAddrOp_WideChar = 440+primOpTag WriteOffAddrOp_Int = 441+primOpTag WriteOffAddrOp_Word = 442+primOpTag WriteOffAddrOp_Addr = 443+primOpTag WriteOffAddrOp_Float = 444+primOpTag WriteOffAddrOp_Double = 445+primOpTag WriteOffAddrOp_StablePtr = 446+primOpTag WriteOffAddrOp_Int8 = 447+primOpTag WriteOffAddrOp_Int16 = 448+primOpTag WriteOffAddrOp_Int32 = 449+primOpTag WriteOffAddrOp_Int64 = 450+primOpTag WriteOffAddrOp_Word8 = 451+primOpTag WriteOffAddrOp_Word16 = 452+primOpTag WriteOffAddrOp_Word32 = 453+primOpTag WriteOffAddrOp_Word64 = 454+primOpTag NewMutVarOp = 455+primOpTag ReadMutVarOp = 456+primOpTag WriteMutVarOp = 457+primOpTag SameMutVarOp = 458+primOpTag AtomicModifyMutVar2Op = 459+primOpTag AtomicModifyMutVar_Op = 460+primOpTag CasMutVarOp = 461+primOpTag CatchOp = 462+primOpTag RaiseOp = 463+primOpTag RaiseIOOp = 464+primOpTag MaskAsyncExceptionsOp = 465+primOpTag MaskUninterruptibleOp = 466+primOpTag UnmaskAsyncExceptionsOp = 467+primOpTag MaskStatus = 468+primOpTag AtomicallyOp = 469+primOpTag RetryOp = 470+primOpTag CatchRetryOp = 471+primOpTag CatchSTMOp = 472+primOpTag NewTVarOp = 473+primOpTag ReadTVarOp = 474+primOpTag ReadTVarIOOp = 475+primOpTag WriteTVarOp = 476+primOpTag SameTVarOp = 477+primOpTag NewMVarOp = 478+primOpTag TakeMVarOp = 479+primOpTag TryTakeMVarOp = 480+primOpTag PutMVarOp = 481+primOpTag TryPutMVarOp = 482+primOpTag ReadMVarOp = 483+primOpTag TryReadMVarOp = 484+primOpTag SameMVarOp = 485+primOpTag IsEmptyMVarOp = 486+primOpTag DelayOp = 487+primOpTag WaitReadOp = 488+primOpTag WaitWriteOp = 489+primOpTag ForkOp = 490+primOpTag ForkOnOp = 491+primOpTag KillThreadOp = 492+primOpTag YieldOp = 493+primOpTag MyThreadIdOp = 494+primOpTag LabelThreadOp = 495+primOpTag IsCurrentThreadBoundOp = 496+primOpTag NoDuplicateOp = 497+primOpTag ThreadStatusOp = 498+primOpTag MkWeakOp = 499+primOpTag MkWeakNoFinalizerOp = 500+primOpTag AddCFinalizerToWeakOp = 501+primOpTag DeRefWeakOp = 502+primOpTag FinalizeWeakOp = 503+primOpTag TouchOp = 504+primOpTag MakeStablePtrOp = 505+primOpTag DeRefStablePtrOp = 506+primOpTag EqStablePtrOp = 507+primOpTag MakeStableNameOp = 508+primOpTag EqStableNameOp = 509+primOpTag StableNameToIntOp = 510+primOpTag CompactNewOp = 511+primOpTag CompactResizeOp = 512+primOpTag CompactContainsOp = 513+primOpTag CompactContainsAnyOp = 514+primOpTag CompactGetFirstBlockOp = 515+primOpTag CompactGetNextBlockOp = 516+primOpTag CompactAllocateBlockOp = 517+primOpTag CompactFixupPointersOp = 518+primOpTag CompactAdd = 519+primOpTag CompactAddWithSharing = 520+primOpTag CompactSize = 521+primOpTag ReallyUnsafePtrEqualityOp = 522+primOpTag ParOp = 523+primOpTag SparkOp = 524+primOpTag SeqOp = 525+primOpTag GetSparkOp = 526+primOpTag NumSparks = 527+primOpTag DataToTagOp = 528+primOpTag TagToEnumOp = 529+primOpTag AddrToAnyOp = 530+primOpTag AnyToAddrOp = 531+primOpTag MkApUpd0_Op = 532+primOpTag NewBCOOp = 533+primOpTag UnpackClosureOp = 534+primOpTag ClosureSizeOp = 535+primOpTag GetApStackValOp = 536+primOpTag GetCCSOfOp = 537+primOpTag GetCurrentCCSOp = 538+primOpTag ClearCCSOp = 539+primOpTag TraceEventOp = 540+primOpTag TraceEventBinaryOp = 541+primOpTag TraceMarkerOp = 542+primOpTag GetThreadAllocationCounter = 543+primOpTag SetThreadAllocationCounter = 544+primOpTag (VecBroadcastOp IntVec 16 W8) = 545+primOpTag (VecBroadcastOp IntVec 8 W16) = 546+primOpTag (VecBroadcastOp IntVec 4 W32) = 547+primOpTag (VecBroadcastOp IntVec 2 W64) = 548+primOpTag (VecBroadcastOp IntVec 32 W8) = 549+primOpTag (VecBroadcastOp IntVec 16 W16) = 550+primOpTag (VecBroadcastOp IntVec 8 W32) = 551+primOpTag (VecBroadcastOp IntVec 4 W64) = 552+primOpTag (VecBroadcastOp IntVec 64 W8) = 553+primOpTag (VecBroadcastOp IntVec 32 W16) = 554+primOpTag (VecBroadcastOp IntVec 16 W32) = 555+primOpTag (VecBroadcastOp IntVec 8 W64) = 556+primOpTag (VecBroadcastOp WordVec 16 W8) = 557+primOpTag (VecBroadcastOp WordVec 8 W16) = 558+primOpTag (VecBroadcastOp WordVec 4 W32) = 559+primOpTag (VecBroadcastOp WordVec 2 W64) = 560+primOpTag (VecBroadcastOp WordVec 32 W8) = 561+primOpTag (VecBroadcastOp WordVec 16 W16) = 562+primOpTag (VecBroadcastOp WordVec 8 W32) = 563+primOpTag (VecBroadcastOp WordVec 4 W64) = 564+primOpTag (VecBroadcastOp WordVec 64 W8) = 565+primOpTag (VecBroadcastOp WordVec 32 W16) = 566+primOpTag (VecBroadcastOp WordVec 16 W32) = 567+primOpTag (VecBroadcastOp WordVec 8 W64) = 568+primOpTag (VecBroadcastOp FloatVec 4 W32) = 569+primOpTag (VecBroadcastOp FloatVec 2 W64) = 570+primOpTag (VecBroadcastOp FloatVec 8 W32) = 571+primOpTag (VecBroadcastOp FloatVec 4 W64) = 572+primOpTag (VecBroadcastOp FloatVec 16 W32) = 573+primOpTag (VecBroadcastOp FloatVec 8 W64) = 574+primOpTag (VecPackOp IntVec 16 W8) = 575+primOpTag (VecPackOp IntVec 8 W16) = 576+primOpTag (VecPackOp IntVec 4 W32) = 577+primOpTag (VecPackOp IntVec 2 W64) = 578+primOpTag (VecPackOp IntVec 32 W8) = 579+primOpTag (VecPackOp IntVec 16 W16) = 580+primOpTag (VecPackOp IntVec 8 W32) = 581+primOpTag (VecPackOp IntVec 4 W64) = 582+primOpTag (VecPackOp IntVec 64 W8) = 583+primOpTag (VecPackOp IntVec 32 W16) = 584+primOpTag (VecPackOp IntVec 16 W32) = 585+primOpTag (VecPackOp IntVec 8 W64) = 586+primOpTag (VecPackOp WordVec 16 W8) = 587+primOpTag (VecPackOp WordVec 8 W16) = 588+primOpTag (VecPackOp WordVec 4 W32) = 589+primOpTag (VecPackOp WordVec 2 W64) = 590+primOpTag (VecPackOp WordVec 32 W8) = 591+primOpTag (VecPackOp WordVec 16 W16) = 592+primOpTag (VecPackOp WordVec 8 W32) = 593+primOpTag (VecPackOp WordVec 4 W64) = 594+primOpTag (VecPackOp WordVec 64 W8) = 595+primOpTag (VecPackOp WordVec 32 W16) = 596+primOpTag (VecPackOp WordVec 16 W32) = 597+primOpTag (VecPackOp WordVec 8 W64) = 598+primOpTag (VecPackOp FloatVec 4 W32) = 599+primOpTag (VecPackOp FloatVec 2 W64) = 600+primOpTag (VecPackOp FloatVec 8 W32) = 601+primOpTag (VecPackOp FloatVec 4 W64) = 602+primOpTag (VecPackOp FloatVec 16 W32) = 603+primOpTag (VecPackOp FloatVec 8 W64) = 604+primOpTag (VecUnpackOp IntVec 16 W8) = 605+primOpTag (VecUnpackOp IntVec 8 W16) = 606+primOpTag (VecUnpackOp IntVec 4 W32) = 607+primOpTag (VecUnpackOp IntVec 2 W64) = 608+primOpTag (VecUnpackOp IntVec 32 W8) = 609+primOpTag (VecUnpackOp IntVec 16 W16) = 610+primOpTag (VecUnpackOp IntVec 8 W32) = 611+primOpTag (VecUnpackOp IntVec 4 W64) = 612+primOpTag (VecUnpackOp IntVec 64 W8) = 613+primOpTag (VecUnpackOp IntVec 32 W16) = 614+primOpTag (VecUnpackOp IntVec 16 W32) = 615+primOpTag (VecUnpackOp IntVec 8 W64) = 616+primOpTag (VecUnpackOp WordVec 16 W8) = 617+primOpTag (VecUnpackOp WordVec 8 W16) = 618+primOpTag (VecUnpackOp WordVec 4 W32) = 619+primOpTag (VecUnpackOp WordVec 2 W64) = 620+primOpTag (VecUnpackOp WordVec 32 W8) = 621+primOpTag (VecUnpackOp WordVec 16 W16) = 622+primOpTag (VecUnpackOp WordVec 8 W32) = 623+primOpTag (VecUnpackOp WordVec 4 W64) = 624+primOpTag (VecUnpackOp WordVec 64 W8) = 625+primOpTag (VecUnpackOp WordVec 32 W16) = 626+primOpTag (VecUnpackOp WordVec 16 W32) = 627+primOpTag (VecUnpackOp WordVec 8 W64) = 628+primOpTag (VecUnpackOp FloatVec 4 W32) = 629+primOpTag (VecUnpackOp FloatVec 2 W64) = 630+primOpTag (VecUnpackOp FloatVec 8 W32) = 631+primOpTag (VecUnpackOp FloatVec 4 W64) = 632+primOpTag (VecUnpackOp FloatVec 16 W32) = 633+primOpTag (VecUnpackOp FloatVec 8 W64) = 634+primOpTag (VecInsertOp IntVec 16 W8) = 635+primOpTag (VecInsertOp IntVec 8 W16) = 636+primOpTag (VecInsertOp IntVec 4 W32) = 637+primOpTag (VecInsertOp IntVec 2 W64) = 638+primOpTag (VecInsertOp IntVec 32 W8) = 639+primOpTag (VecInsertOp IntVec 16 W16) = 640+primOpTag (VecInsertOp IntVec 8 W32) = 641+primOpTag (VecInsertOp IntVec 4 W64) = 642+primOpTag (VecInsertOp IntVec 64 W8) = 643+primOpTag (VecInsertOp IntVec 32 W16) = 644+primOpTag (VecInsertOp IntVec 16 W32) = 645+primOpTag (VecInsertOp IntVec 8 W64) = 646+primOpTag (VecInsertOp WordVec 16 W8) = 647+primOpTag (VecInsertOp WordVec 8 W16) = 648+primOpTag (VecInsertOp WordVec 4 W32) = 649+primOpTag (VecInsertOp WordVec 2 W64) = 650+primOpTag (VecInsertOp WordVec 32 W8) = 651+primOpTag (VecInsertOp WordVec 16 W16) = 652+primOpTag (VecInsertOp WordVec 8 W32) = 653+primOpTag (VecInsertOp WordVec 4 W64) = 654+primOpTag (VecInsertOp WordVec 64 W8) = 655+primOpTag (VecInsertOp WordVec 32 W16) = 656+primOpTag (VecInsertOp WordVec 16 W32) = 657+primOpTag (VecInsertOp WordVec 8 W64) = 658+primOpTag (VecInsertOp FloatVec 4 W32) = 659+primOpTag (VecInsertOp FloatVec 2 W64) = 660+primOpTag (VecInsertOp FloatVec 8 W32) = 661+primOpTag (VecInsertOp FloatVec 4 W64) = 662+primOpTag (VecInsertOp FloatVec 16 W32) = 663+primOpTag (VecInsertOp FloatVec 8 W64) = 664+primOpTag (VecAddOp IntVec 16 W8) = 665+primOpTag (VecAddOp IntVec 8 W16) = 666+primOpTag (VecAddOp IntVec 4 W32) = 667+primOpTag (VecAddOp IntVec 2 W64) = 668+primOpTag (VecAddOp IntVec 32 W8) = 669+primOpTag (VecAddOp IntVec 16 W16) = 670+primOpTag (VecAddOp IntVec 8 W32) = 671+primOpTag (VecAddOp IntVec 4 W64) = 672+primOpTag (VecAddOp IntVec 64 W8) = 673+primOpTag (VecAddOp IntVec 32 W16) = 674+primOpTag (VecAddOp IntVec 16 W32) = 675+primOpTag (VecAddOp IntVec 8 W64) = 676+primOpTag (VecAddOp WordVec 16 W8) = 677+primOpTag (VecAddOp WordVec 8 W16) = 678+primOpTag (VecAddOp WordVec 4 W32) = 679+primOpTag (VecAddOp WordVec 2 W64) = 680+primOpTag (VecAddOp WordVec 32 W8) = 681+primOpTag (VecAddOp WordVec 16 W16) = 682+primOpTag (VecAddOp WordVec 8 W32) = 683+primOpTag (VecAddOp WordVec 4 W64) = 684+primOpTag (VecAddOp WordVec 64 W8) = 685+primOpTag (VecAddOp WordVec 32 W16) = 686+primOpTag (VecAddOp WordVec 16 W32) = 687+primOpTag (VecAddOp WordVec 8 W64) = 688+primOpTag (VecAddOp FloatVec 4 W32) = 689+primOpTag (VecAddOp FloatVec 2 W64) = 690+primOpTag (VecAddOp FloatVec 8 W32) = 691+primOpTag (VecAddOp FloatVec 4 W64) = 692+primOpTag (VecAddOp FloatVec 16 W32) = 693+primOpTag (VecAddOp FloatVec 8 W64) = 694+primOpTag (VecSubOp IntVec 16 W8) = 695+primOpTag (VecSubOp IntVec 8 W16) = 696+primOpTag (VecSubOp IntVec 4 W32) = 697+primOpTag (VecSubOp IntVec 2 W64) = 698+primOpTag (VecSubOp IntVec 32 W8) = 699+primOpTag (VecSubOp IntVec 16 W16) = 700+primOpTag (VecSubOp IntVec 8 W32) = 701+primOpTag (VecSubOp IntVec 4 W64) = 702+primOpTag (VecSubOp IntVec 64 W8) = 703+primOpTag (VecSubOp IntVec 32 W16) = 704+primOpTag (VecSubOp IntVec 16 W32) = 705+primOpTag (VecSubOp IntVec 8 W64) = 706+primOpTag (VecSubOp WordVec 16 W8) = 707+primOpTag (VecSubOp WordVec 8 W16) = 708+primOpTag (VecSubOp WordVec 4 W32) = 709+primOpTag (VecSubOp WordVec 2 W64) = 710+primOpTag (VecSubOp WordVec 32 W8) = 711+primOpTag (VecSubOp WordVec 16 W16) = 712+primOpTag (VecSubOp WordVec 8 W32) = 713+primOpTag (VecSubOp WordVec 4 W64) = 714+primOpTag (VecSubOp WordVec 64 W8) = 715+primOpTag (VecSubOp WordVec 32 W16) = 716+primOpTag (VecSubOp WordVec 16 W32) = 717+primOpTag (VecSubOp WordVec 8 W64) = 718+primOpTag (VecSubOp FloatVec 4 W32) = 719+primOpTag (VecSubOp FloatVec 2 W64) = 720+primOpTag (VecSubOp FloatVec 8 W32) = 721+primOpTag (VecSubOp FloatVec 4 W64) = 722+primOpTag (VecSubOp FloatVec 16 W32) = 723+primOpTag (VecSubOp FloatVec 8 W64) = 724+primOpTag (VecMulOp IntVec 16 W8) = 725+primOpTag (VecMulOp IntVec 8 W16) = 726+primOpTag (VecMulOp IntVec 4 W32) = 727+primOpTag (VecMulOp IntVec 2 W64) = 728+primOpTag (VecMulOp IntVec 32 W8) = 729+primOpTag (VecMulOp IntVec 16 W16) = 730+primOpTag (VecMulOp IntVec 8 W32) = 731+primOpTag (VecMulOp IntVec 4 W64) = 732+primOpTag (VecMulOp IntVec 64 W8) = 733+primOpTag (VecMulOp IntVec 32 W16) = 734+primOpTag (VecMulOp IntVec 16 W32) = 735+primOpTag (VecMulOp IntVec 8 W64) = 736+primOpTag (VecMulOp WordVec 16 W8) = 737+primOpTag (VecMulOp WordVec 8 W16) = 738+primOpTag (VecMulOp WordVec 4 W32) = 739+primOpTag (VecMulOp WordVec 2 W64) = 740+primOpTag (VecMulOp WordVec 32 W8) = 741+primOpTag (VecMulOp WordVec 16 W16) = 742+primOpTag (VecMulOp WordVec 8 W32) = 743+primOpTag (VecMulOp WordVec 4 W64) = 744+primOpTag (VecMulOp WordVec 64 W8) = 745+primOpTag (VecMulOp WordVec 32 W16) = 746+primOpTag (VecMulOp WordVec 16 W32) = 747+primOpTag (VecMulOp WordVec 8 W64) = 748+primOpTag (VecMulOp FloatVec 4 W32) = 749+primOpTag (VecMulOp FloatVec 2 W64) = 750+primOpTag (VecMulOp FloatVec 8 W32) = 751+primOpTag (VecMulOp FloatVec 4 W64) = 752+primOpTag (VecMulOp FloatVec 16 W32) = 753+primOpTag (VecMulOp FloatVec 8 W64) = 754+primOpTag (VecDivOp FloatVec 4 W32) = 755+primOpTag (VecDivOp FloatVec 2 W64) = 756+primOpTag (VecDivOp FloatVec 8 W32) = 757+primOpTag (VecDivOp FloatVec 4 W64) = 758+primOpTag (VecDivOp FloatVec 16 W32) = 759+primOpTag (VecDivOp FloatVec 8 W64) = 760+primOpTag (VecQuotOp IntVec 16 W8) = 761+primOpTag (VecQuotOp IntVec 8 W16) = 762+primOpTag (VecQuotOp IntVec 4 W32) = 763+primOpTag (VecQuotOp IntVec 2 W64) = 764+primOpTag (VecQuotOp IntVec 32 W8) = 765+primOpTag (VecQuotOp IntVec 16 W16) = 766+primOpTag (VecQuotOp IntVec 8 W32) = 767+primOpTag (VecQuotOp IntVec 4 W64) = 768+primOpTag (VecQuotOp IntVec 64 W8) = 769+primOpTag (VecQuotOp IntVec 32 W16) = 770+primOpTag (VecQuotOp IntVec 16 W32) = 771+primOpTag (VecQuotOp IntVec 8 W64) = 772+primOpTag (VecQuotOp WordVec 16 W8) = 773+primOpTag (VecQuotOp WordVec 8 W16) = 774+primOpTag (VecQuotOp WordVec 4 W32) = 775+primOpTag (VecQuotOp WordVec 2 W64) = 776+primOpTag (VecQuotOp WordVec 32 W8) = 777+primOpTag (VecQuotOp WordVec 16 W16) = 778+primOpTag (VecQuotOp WordVec 8 W32) = 779+primOpTag (VecQuotOp WordVec 4 W64) = 780+primOpTag (VecQuotOp WordVec 64 W8) = 781+primOpTag (VecQuotOp WordVec 32 W16) = 782+primOpTag (VecQuotOp WordVec 16 W32) = 783+primOpTag (VecQuotOp WordVec 8 W64) = 784+primOpTag (VecRemOp IntVec 16 W8) = 785+primOpTag (VecRemOp IntVec 8 W16) = 786+primOpTag (VecRemOp IntVec 4 W32) = 787+primOpTag (VecRemOp IntVec 2 W64) = 788+primOpTag (VecRemOp IntVec 32 W8) = 789+primOpTag (VecRemOp IntVec 16 W16) = 790+primOpTag (VecRemOp IntVec 8 W32) = 791+primOpTag (VecRemOp IntVec 4 W64) = 792+primOpTag (VecRemOp IntVec 64 W8) = 793+primOpTag (VecRemOp IntVec 32 W16) = 794+primOpTag (VecRemOp IntVec 16 W32) = 795+primOpTag (VecRemOp IntVec 8 W64) = 796+primOpTag (VecRemOp WordVec 16 W8) = 797+primOpTag (VecRemOp WordVec 8 W16) = 798+primOpTag (VecRemOp WordVec 4 W32) = 799+primOpTag (VecRemOp WordVec 2 W64) = 800+primOpTag (VecRemOp WordVec 32 W8) = 801+primOpTag (VecRemOp WordVec 16 W16) = 802+primOpTag (VecRemOp WordVec 8 W32) = 803+primOpTag (VecRemOp WordVec 4 W64) = 804+primOpTag (VecRemOp WordVec 64 W8) = 805+primOpTag (VecRemOp WordVec 32 W16) = 806+primOpTag (VecRemOp WordVec 16 W32) = 807+primOpTag (VecRemOp WordVec 8 W64) = 808+primOpTag (VecNegOp IntVec 16 W8) = 809+primOpTag (VecNegOp IntVec 8 W16) = 810+primOpTag (VecNegOp IntVec 4 W32) = 811+primOpTag (VecNegOp IntVec 2 W64) = 812+primOpTag (VecNegOp IntVec 32 W8) = 813+primOpTag (VecNegOp IntVec 16 W16) = 814+primOpTag (VecNegOp IntVec 8 W32) = 815+primOpTag (VecNegOp IntVec 4 W64) = 816+primOpTag (VecNegOp IntVec 64 W8) = 817+primOpTag (VecNegOp IntVec 32 W16) = 818+primOpTag (VecNegOp IntVec 16 W32) = 819+primOpTag (VecNegOp IntVec 8 W64) = 820+primOpTag (VecNegOp FloatVec 4 W32) = 821+primOpTag (VecNegOp FloatVec 2 W64) = 822+primOpTag (VecNegOp FloatVec 8 W32) = 823+primOpTag (VecNegOp FloatVec 4 W64) = 824+primOpTag (VecNegOp FloatVec 16 W32) = 825+primOpTag (VecNegOp FloatVec 8 W64) = 826+primOpTag (VecIndexByteArrayOp IntVec 16 W8) = 827+primOpTag (VecIndexByteArrayOp IntVec 8 W16) = 828+primOpTag (VecIndexByteArrayOp IntVec 4 W32) = 829+primOpTag (VecIndexByteArrayOp IntVec 2 W64) = 830+primOpTag (VecIndexByteArrayOp IntVec 32 W8) = 831+primOpTag (VecIndexByteArrayOp IntVec 16 W16) = 832+primOpTag (VecIndexByteArrayOp IntVec 8 W32) = 833+primOpTag (VecIndexByteArrayOp IntVec 4 W64) = 834+primOpTag (VecIndexByteArrayOp IntVec 64 W8) = 835+primOpTag (VecIndexByteArrayOp IntVec 32 W16) = 836+primOpTag (VecIndexByteArrayOp IntVec 16 W32) = 837+primOpTag (VecIndexByteArrayOp IntVec 8 W64) = 838+primOpTag (VecIndexByteArrayOp WordVec 16 W8) = 839+primOpTag (VecIndexByteArrayOp WordVec 8 W16) = 840+primOpTag (VecIndexByteArrayOp WordVec 4 W32) = 841+primOpTag (VecIndexByteArrayOp WordVec 2 W64) = 842+primOpTag (VecIndexByteArrayOp WordVec 32 W8) = 843+primOpTag (VecIndexByteArrayOp WordVec 16 W16) = 844+primOpTag (VecIndexByteArrayOp WordVec 8 W32) = 845+primOpTag (VecIndexByteArrayOp WordVec 4 W64) = 846+primOpTag (VecIndexByteArrayOp WordVec 64 W8) = 847+primOpTag (VecIndexByteArrayOp WordVec 32 W16) = 848+primOpTag (VecIndexByteArrayOp WordVec 16 W32) = 849+primOpTag (VecIndexByteArrayOp WordVec 8 W64) = 850+primOpTag (VecIndexByteArrayOp FloatVec 4 W32) = 851+primOpTag (VecIndexByteArrayOp FloatVec 2 W64) = 852+primOpTag (VecIndexByteArrayOp FloatVec 8 W32) = 853+primOpTag (VecIndexByteArrayOp FloatVec 4 W64) = 854+primOpTag (VecIndexByteArrayOp FloatVec 16 W32) = 855+primOpTag (VecIndexByteArrayOp FloatVec 8 W64) = 856+primOpTag (VecReadByteArrayOp IntVec 16 W8) = 857+primOpTag (VecReadByteArrayOp IntVec 8 W16) = 858+primOpTag (VecReadByteArrayOp IntVec 4 W32) = 859+primOpTag (VecReadByteArrayOp IntVec 2 W64) = 860+primOpTag (VecReadByteArrayOp IntVec 32 W8) = 861+primOpTag (VecReadByteArrayOp IntVec 16 W16) = 862+primOpTag (VecReadByteArrayOp IntVec 8 W32) = 863+primOpTag (VecReadByteArrayOp IntVec 4 W64) = 864+primOpTag (VecReadByteArrayOp IntVec 64 W8) = 865+primOpTag (VecReadByteArrayOp IntVec 32 W16) = 866+primOpTag (VecReadByteArrayOp IntVec 16 W32) = 867+primOpTag (VecReadByteArrayOp IntVec 8 W64) = 868+primOpTag (VecReadByteArrayOp WordVec 16 W8) = 869+primOpTag (VecReadByteArrayOp WordVec 8 W16) = 870+primOpTag (VecReadByteArrayOp WordVec 4 W32) = 871+primOpTag (VecReadByteArrayOp WordVec 2 W64) = 872+primOpTag (VecReadByteArrayOp WordVec 32 W8) = 873+primOpTag (VecReadByteArrayOp WordVec 16 W16) = 874+primOpTag (VecReadByteArrayOp WordVec 8 W32) = 875+primOpTag (VecReadByteArrayOp WordVec 4 W64) = 876+primOpTag (VecReadByteArrayOp WordVec 64 W8) = 877+primOpTag (VecReadByteArrayOp WordVec 32 W16) = 878+primOpTag (VecReadByteArrayOp WordVec 16 W32) = 879+primOpTag (VecReadByteArrayOp WordVec 8 W64) = 880+primOpTag (VecReadByteArrayOp FloatVec 4 W32) = 881+primOpTag (VecReadByteArrayOp FloatVec 2 W64) = 882+primOpTag (VecReadByteArrayOp FloatVec 8 W32) = 883+primOpTag (VecReadByteArrayOp FloatVec 4 W64) = 884+primOpTag (VecReadByteArrayOp FloatVec 16 W32) = 885+primOpTag (VecReadByteArrayOp FloatVec 8 W64) = 886+primOpTag (VecWriteByteArrayOp IntVec 16 W8) = 887+primOpTag (VecWriteByteArrayOp IntVec 8 W16) = 888+primOpTag (VecWriteByteArrayOp IntVec 4 W32) = 889+primOpTag (VecWriteByteArrayOp IntVec 2 W64) = 890+primOpTag (VecWriteByteArrayOp IntVec 32 W8) = 891+primOpTag (VecWriteByteArrayOp IntVec 16 W16) = 892+primOpTag (VecWriteByteArrayOp IntVec 8 W32) = 893+primOpTag (VecWriteByteArrayOp IntVec 4 W64) = 894+primOpTag (VecWriteByteArrayOp IntVec 64 W8) = 895+primOpTag (VecWriteByteArrayOp IntVec 32 W16) = 896+primOpTag (VecWriteByteArrayOp IntVec 16 W32) = 897+primOpTag (VecWriteByteArrayOp IntVec 8 W64) = 898+primOpTag (VecWriteByteArrayOp WordVec 16 W8) = 899+primOpTag (VecWriteByteArrayOp WordVec 8 W16) = 900+primOpTag (VecWriteByteArrayOp WordVec 4 W32) = 901+primOpTag (VecWriteByteArrayOp WordVec 2 W64) = 902+primOpTag (VecWriteByteArrayOp WordVec 32 W8) = 903+primOpTag (VecWriteByteArrayOp WordVec 16 W16) = 904+primOpTag (VecWriteByteArrayOp WordVec 8 W32) = 905+primOpTag (VecWriteByteArrayOp WordVec 4 W64) = 906+primOpTag (VecWriteByteArrayOp WordVec 64 W8) = 907+primOpTag (VecWriteByteArrayOp WordVec 32 W16) = 908+primOpTag (VecWriteByteArrayOp WordVec 16 W32) = 909+primOpTag (VecWriteByteArrayOp WordVec 8 W64) = 910+primOpTag (VecWriteByteArrayOp FloatVec 4 W32) = 911+primOpTag (VecWriteByteArrayOp FloatVec 2 W64) = 912+primOpTag (VecWriteByteArrayOp FloatVec 8 W32) = 913+primOpTag (VecWriteByteArrayOp FloatVec 4 W64) = 914+primOpTag (VecWriteByteArrayOp FloatVec 16 W32) = 915+primOpTag (VecWriteByteArrayOp FloatVec 8 W64) = 916+primOpTag (VecIndexOffAddrOp IntVec 16 W8) = 917+primOpTag (VecIndexOffAddrOp IntVec 8 W16) = 918+primOpTag (VecIndexOffAddrOp IntVec 4 W32) = 919+primOpTag (VecIndexOffAddrOp IntVec 2 W64) = 920+primOpTag (VecIndexOffAddrOp IntVec 32 W8) = 921+primOpTag (VecIndexOffAddrOp IntVec 16 W16) = 922+primOpTag (VecIndexOffAddrOp IntVec 8 W32) = 923+primOpTag (VecIndexOffAddrOp IntVec 4 W64) = 924+primOpTag (VecIndexOffAddrOp IntVec 64 W8) = 925+primOpTag (VecIndexOffAddrOp IntVec 32 W16) = 926+primOpTag (VecIndexOffAddrOp IntVec 16 W32) = 927+primOpTag (VecIndexOffAddrOp IntVec 8 W64) = 928+primOpTag (VecIndexOffAddrOp WordVec 16 W8) = 929+primOpTag (VecIndexOffAddrOp WordVec 8 W16) = 930+primOpTag (VecIndexOffAddrOp WordVec 4 W32) = 931+primOpTag (VecIndexOffAddrOp WordVec 2 W64) = 932+primOpTag (VecIndexOffAddrOp WordVec 32 W8) = 933+primOpTag (VecIndexOffAddrOp WordVec 16 W16) = 934+primOpTag (VecIndexOffAddrOp WordVec 8 W32) = 935+primOpTag (VecIndexOffAddrOp WordVec 4 W64) = 936+primOpTag (VecIndexOffAddrOp WordVec 64 W8) = 937+primOpTag (VecIndexOffAddrOp WordVec 32 W16) = 938+primOpTag (VecIndexOffAddrOp WordVec 16 W32) = 939+primOpTag (VecIndexOffAddrOp WordVec 8 W64) = 940+primOpTag (VecIndexOffAddrOp FloatVec 4 W32) = 941+primOpTag (VecIndexOffAddrOp FloatVec 2 W64) = 942+primOpTag (VecIndexOffAddrOp FloatVec 8 W32) = 943+primOpTag (VecIndexOffAddrOp FloatVec 4 W64) = 944+primOpTag (VecIndexOffAddrOp FloatVec 16 W32) = 945+primOpTag (VecIndexOffAddrOp FloatVec 8 W64) = 946+primOpTag (VecReadOffAddrOp IntVec 16 W8) = 947+primOpTag (VecReadOffAddrOp IntVec 8 W16) = 948+primOpTag (VecReadOffAddrOp IntVec 4 W32) = 949+primOpTag (VecReadOffAddrOp IntVec 2 W64) = 950+primOpTag (VecReadOffAddrOp IntVec 32 W8) = 951+primOpTag (VecReadOffAddrOp IntVec 16 W16) = 952+primOpTag (VecReadOffAddrOp IntVec 8 W32) = 953+primOpTag (VecReadOffAddrOp IntVec 4 W64) = 954+primOpTag (VecReadOffAddrOp IntVec 64 W8) = 955+primOpTag (VecReadOffAddrOp IntVec 32 W16) = 956+primOpTag (VecReadOffAddrOp IntVec 16 W32) = 957+primOpTag (VecReadOffAddrOp IntVec 8 W64) = 958+primOpTag (VecReadOffAddrOp WordVec 16 W8) = 959+primOpTag (VecReadOffAddrOp WordVec 8 W16) = 960+primOpTag (VecReadOffAddrOp WordVec 4 W32) = 961+primOpTag (VecReadOffAddrOp WordVec 2 W64) = 962+primOpTag (VecReadOffAddrOp WordVec 32 W8) = 963+primOpTag (VecReadOffAddrOp WordVec 16 W16) = 964+primOpTag (VecReadOffAddrOp WordVec 8 W32) = 965+primOpTag (VecReadOffAddrOp WordVec 4 W64) = 966+primOpTag (VecReadOffAddrOp WordVec 64 W8) = 967+primOpTag (VecReadOffAddrOp WordVec 32 W16) = 968+primOpTag (VecReadOffAddrOp WordVec 16 W32) = 969+primOpTag (VecReadOffAddrOp WordVec 8 W64) = 970+primOpTag (VecReadOffAddrOp FloatVec 4 W32) = 971+primOpTag (VecReadOffAddrOp FloatVec 2 W64) = 972+primOpTag (VecReadOffAddrOp FloatVec 8 W32) = 973+primOpTag (VecReadOffAddrOp FloatVec 4 W64) = 974+primOpTag (VecReadOffAddrOp FloatVec 16 W32) = 975+primOpTag (VecReadOffAddrOp FloatVec 8 W64) = 976+primOpTag (VecWriteOffAddrOp IntVec 16 W8) = 977+primOpTag (VecWriteOffAddrOp IntVec 8 W16) = 978+primOpTag (VecWriteOffAddrOp IntVec 4 W32) = 979+primOpTag (VecWriteOffAddrOp IntVec 2 W64) = 980+primOpTag (VecWriteOffAddrOp IntVec 32 W8) = 981+primOpTag (VecWriteOffAddrOp IntVec 16 W16) = 982+primOpTag (VecWriteOffAddrOp IntVec 8 W32) = 983+primOpTag (VecWriteOffAddrOp IntVec 4 W64) = 984+primOpTag (VecWriteOffAddrOp IntVec 64 W8) = 985+primOpTag (VecWriteOffAddrOp IntVec 32 W16) = 986+primOpTag (VecWriteOffAddrOp IntVec 16 W32) = 987+primOpTag (VecWriteOffAddrOp IntVec 8 W64) = 988+primOpTag (VecWriteOffAddrOp WordVec 16 W8) = 989+primOpTag (VecWriteOffAddrOp WordVec 8 W16) = 990+primOpTag (VecWriteOffAddrOp WordVec 4 W32) = 991+primOpTag (VecWriteOffAddrOp WordVec 2 W64) = 992+primOpTag (VecWriteOffAddrOp WordVec 32 W8) = 993+primOpTag (VecWriteOffAddrOp WordVec 16 W16) = 994+primOpTag (VecWriteOffAddrOp WordVec 8 W32) = 995+primOpTag (VecWriteOffAddrOp WordVec 4 W64) = 996+primOpTag (VecWriteOffAddrOp WordVec 64 W8) = 997+primOpTag (VecWriteOffAddrOp WordVec 32 W16) = 998+primOpTag (VecWriteOffAddrOp WordVec 16 W32) = 999+primOpTag (VecWriteOffAddrOp WordVec 8 W64) = 1000+primOpTag (VecWriteOffAddrOp FloatVec 4 W32) = 1001+primOpTag (VecWriteOffAddrOp FloatVec 2 W64) = 1002+primOpTag (VecWriteOffAddrOp FloatVec 8 W32) = 1003+primOpTag (VecWriteOffAddrOp FloatVec 4 W64) = 1004+primOpTag (VecWriteOffAddrOp FloatVec 16 W32) = 1005+primOpTag (VecWriteOffAddrOp FloatVec 8 W64) = 1006+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W8) = 1007+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W16) = 1008+primOpTag (VecIndexScalarByteArrayOp IntVec 4 W32) = 1009+primOpTag (VecIndexScalarByteArrayOp IntVec 2 W64) = 1010+primOpTag (VecIndexScalarByteArrayOp IntVec 32 W8) = 1011+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W16) = 1012+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W32) = 1013+primOpTag (VecIndexScalarByteArrayOp IntVec 4 W64) = 1014+primOpTag (VecIndexScalarByteArrayOp IntVec 64 W8) = 1015+primOpTag (VecIndexScalarByteArrayOp IntVec 32 W16) = 1016+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W32) = 1017+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W64) = 1018+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W8) = 1019+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W16) = 1020+primOpTag (VecIndexScalarByteArrayOp WordVec 4 W32) = 1021+primOpTag (VecIndexScalarByteArrayOp WordVec 2 W64) = 1022+primOpTag (VecIndexScalarByteArrayOp WordVec 32 W8) = 1023+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W16) = 1024+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W32) = 1025+primOpTag (VecIndexScalarByteArrayOp WordVec 4 W64) = 1026+primOpTag (VecIndexScalarByteArrayOp WordVec 64 W8) = 1027+primOpTag (VecIndexScalarByteArrayOp WordVec 32 W16) = 1028+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W32) = 1029+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W64) = 1030+primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W32) = 1031+primOpTag (VecIndexScalarByteArrayOp FloatVec 2 W64) = 1032+primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W32) = 1033+primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W64) = 1034+primOpTag (VecIndexScalarByteArrayOp FloatVec 16 W32) = 1035+primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W64) = 1036+primOpTag (VecReadScalarByteArrayOp IntVec 16 W8) = 1037+primOpTag (VecReadScalarByteArrayOp IntVec 8 W16) = 1038+primOpTag (VecReadScalarByteArrayOp IntVec 4 W32) = 1039+primOpTag (VecReadScalarByteArrayOp IntVec 2 W64) = 1040+primOpTag (VecReadScalarByteArrayOp IntVec 32 W8) = 1041+primOpTag (VecReadScalarByteArrayOp IntVec 16 W16) = 1042+primOpTag (VecReadScalarByteArrayOp IntVec 8 W32) = 1043+primOpTag (VecReadScalarByteArrayOp IntVec 4 W64) = 1044+primOpTag (VecReadScalarByteArrayOp IntVec 64 W8) = 1045+primOpTag (VecReadScalarByteArrayOp IntVec 32 W16) = 1046+primOpTag (VecReadScalarByteArrayOp IntVec 16 W32) = 1047+primOpTag (VecReadScalarByteArrayOp IntVec 8 W64) = 1048+primOpTag (VecReadScalarByteArrayOp WordVec 16 W8) = 1049+primOpTag (VecReadScalarByteArrayOp WordVec 8 W16) = 1050+primOpTag (VecReadScalarByteArrayOp WordVec 4 W32) = 1051+primOpTag (VecReadScalarByteArrayOp WordVec 2 W64) = 1052+primOpTag (VecReadScalarByteArrayOp WordVec 32 W8) = 1053+primOpTag (VecReadScalarByteArrayOp WordVec 16 W16) = 1054+primOpTag (VecReadScalarByteArrayOp WordVec 8 W32) = 1055+primOpTag (VecReadScalarByteArrayOp WordVec 4 W64) = 1056+primOpTag (VecReadScalarByteArrayOp WordVec 64 W8) = 1057+primOpTag (VecReadScalarByteArrayOp WordVec 32 W16) = 1058+primOpTag (VecReadScalarByteArrayOp WordVec 16 W32) = 1059+primOpTag (VecReadScalarByteArrayOp WordVec 8 W64) = 1060+primOpTag (VecReadScalarByteArrayOp FloatVec 4 W32) = 1061+primOpTag (VecReadScalarByteArrayOp FloatVec 2 W64) = 1062+primOpTag (VecReadScalarByteArrayOp FloatVec 8 W32) = 1063+primOpTag (VecReadScalarByteArrayOp FloatVec 4 W64) = 1064+primOpTag (VecReadScalarByteArrayOp FloatVec 16 W32) = 1065+primOpTag (VecReadScalarByteArrayOp FloatVec 8 W64) = 1066+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W8) = 1067+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W16) = 1068+primOpTag (VecWriteScalarByteArrayOp IntVec 4 W32) = 1069+primOpTag (VecWriteScalarByteArrayOp IntVec 2 W64) = 1070+primOpTag (VecWriteScalarByteArrayOp IntVec 32 W8) = 1071+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W16) = 1072+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W32) = 1073+primOpTag (VecWriteScalarByteArrayOp IntVec 4 W64) = 1074+primOpTag (VecWriteScalarByteArrayOp IntVec 64 W8) = 1075+primOpTag (VecWriteScalarByteArrayOp IntVec 32 W16) = 1076+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W32) = 1077+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W64) = 1078+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W8) = 1079+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W16) = 1080+primOpTag (VecWriteScalarByteArrayOp WordVec 4 W32) = 1081+primOpTag (VecWriteScalarByteArrayOp WordVec 2 W64) = 1082+primOpTag (VecWriteScalarByteArrayOp WordVec 32 W8) = 1083+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W16) = 1084+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W32) = 1085+primOpTag (VecWriteScalarByteArrayOp WordVec 4 W64) = 1086+primOpTag (VecWriteScalarByteArrayOp WordVec 64 W8) = 1087+primOpTag (VecWriteScalarByteArrayOp WordVec 32 W16) = 1088+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W32) = 1089+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W64) = 1090+primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W32) = 1091+primOpTag (VecWriteScalarByteArrayOp FloatVec 2 W64) = 1092+primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W32) = 1093+primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W64) = 1094+primOpTag (VecWriteScalarByteArrayOp FloatVec 16 W32) = 1095+primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W64) = 1096+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W8) = 1097+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W16) = 1098+primOpTag (VecIndexScalarOffAddrOp IntVec 4 W32) = 1099+primOpTag (VecIndexScalarOffAddrOp IntVec 2 W64) = 1100+primOpTag (VecIndexScalarOffAddrOp IntVec 32 W8) = 1101+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W16) = 1102+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W32) = 1103+primOpTag (VecIndexScalarOffAddrOp IntVec 4 W64) = 1104+primOpTag (VecIndexScalarOffAddrOp IntVec 64 W8) = 1105+primOpTag (VecIndexScalarOffAddrOp IntVec 32 W16) = 1106+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W32) = 1107+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W64) = 1108+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W8) = 1109+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W16) = 1110+primOpTag (VecIndexScalarOffAddrOp WordVec 4 W32) = 1111+primOpTag (VecIndexScalarOffAddrOp WordVec 2 W64) = 1112+primOpTag (VecIndexScalarOffAddrOp WordVec 32 W8) = 1113+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W16) = 1114+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W32) = 1115+primOpTag (VecIndexScalarOffAddrOp WordVec 4 W64) = 1116+primOpTag (VecIndexScalarOffAddrOp WordVec 64 W8) = 1117+primOpTag (VecIndexScalarOffAddrOp WordVec 32 W16) = 1118+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W32) = 1119+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W64) = 1120+primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W32) = 1121+primOpTag (VecIndexScalarOffAddrOp FloatVec 2 W64) = 1122+primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W32) = 1123+primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W64) = 1124+primOpTag (VecIndexScalarOffAddrOp FloatVec 16 W32) = 1125+primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W64) = 1126+primOpTag (VecReadScalarOffAddrOp IntVec 16 W8) = 1127+primOpTag (VecReadScalarOffAddrOp IntVec 8 W16) = 1128+primOpTag (VecReadScalarOffAddrOp IntVec 4 W32) = 1129+primOpTag (VecReadScalarOffAddrOp IntVec 2 W64) = 1130+primOpTag (VecReadScalarOffAddrOp IntVec 32 W8) = 1131+primOpTag (VecReadScalarOffAddrOp IntVec 16 W16) = 1132+primOpTag (VecReadScalarOffAddrOp IntVec 8 W32) = 1133+primOpTag (VecReadScalarOffAddrOp IntVec 4 W64) = 1134+primOpTag (VecReadScalarOffAddrOp IntVec 64 W8) = 1135+primOpTag (VecReadScalarOffAddrOp IntVec 32 W16) = 1136+primOpTag (VecReadScalarOffAddrOp IntVec 16 W32) = 1137+primOpTag (VecReadScalarOffAddrOp IntVec 8 W64) = 1138+primOpTag (VecReadScalarOffAddrOp WordVec 16 W8) = 1139+primOpTag (VecReadScalarOffAddrOp WordVec 8 W16) = 1140+primOpTag (VecReadScalarOffAddrOp WordVec 4 W32) = 1141+primOpTag (VecReadScalarOffAddrOp WordVec 2 W64) = 1142+primOpTag (VecReadScalarOffAddrOp WordVec 32 W8) = 1143+primOpTag (VecReadScalarOffAddrOp WordVec 16 W16) = 1144+primOpTag (VecReadScalarOffAddrOp WordVec 8 W32) = 1145+primOpTag (VecReadScalarOffAddrOp WordVec 4 W64) = 1146+primOpTag (VecReadScalarOffAddrOp WordVec 64 W8) = 1147+primOpTag (VecReadScalarOffAddrOp WordVec 32 W16) = 1148+primOpTag (VecReadScalarOffAddrOp WordVec 16 W32) = 1149+primOpTag (VecReadScalarOffAddrOp WordVec 8 W64) = 1150+primOpTag (VecReadScalarOffAddrOp FloatVec 4 W32) = 1151+primOpTag (VecReadScalarOffAddrOp FloatVec 2 W64) = 1152+primOpTag (VecReadScalarOffAddrOp FloatVec 8 W32) = 1153+primOpTag (VecReadScalarOffAddrOp FloatVec 4 W64) = 1154+primOpTag (VecReadScalarOffAddrOp FloatVec 16 W32) = 1155+primOpTag (VecReadScalarOffAddrOp FloatVec 8 W64) = 1156+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W8) = 1157+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W16) = 1158+primOpTag (VecWriteScalarOffAddrOp IntVec 4 W32) = 1159+primOpTag (VecWriteScalarOffAddrOp IntVec 2 W64) = 1160+primOpTag (VecWriteScalarOffAddrOp IntVec 32 W8) = 1161+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W16) = 1162+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W32) = 1163+primOpTag (VecWriteScalarOffAddrOp IntVec 4 W64) = 1164+primOpTag (VecWriteScalarOffAddrOp IntVec 64 W8) = 1165+primOpTag (VecWriteScalarOffAddrOp IntVec 32 W16) = 1166+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W32) = 1167+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W64) = 1168+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W8) = 1169+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W16) = 1170+primOpTag (VecWriteScalarOffAddrOp WordVec 4 W32) = 1171+primOpTag (VecWriteScalarOffAddrOp WordVec 2 W64) = 1172+primOpTag (VecWriteScalarOffAddrOp WordVec 32 W8) = 1173+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W16) = 1174+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W32) = 1175+primOpTag (VecWriteScalarOffAddrOp WordVec 4 W64) = 1176+primOpTag (VecWriteScalarOffAddrOp WordVec 64 W8) = 1177+primOpTag (VecWriteScalarOffAddrOp WordVec 32 W16) = 1178+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W32) = 1179+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W64) = 1180+primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W32) = 1181+primOpTag (VecWriteScalarOffAddrOp FloatVec 2 W64) = 1182+primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W32) = 1183+primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W64) = 1184+primOpTag (VecWriteScalarOffAddrOp FloatVec 16 W32) = 1185+primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W64) = 1186+primOpTag PrefetchByteArrayOp3 = 1187+primOpTag PrefetchMutableByteArrayOp3 = 1188+primOpTag PrefetchAddrOp3 = 1189+primOpTag PrefetchValueOp3 = 1190+primOpTag PrefetchByteArrayOp2 = 1191+primOpTag PrefetchMutableByteArrayOp2 = 1192+primOpTag PrefetchAddrOp2 = 1193+primOpTag PrefetchValueOp2 = 1194+primOpTag PrefetchByteArrayOp1 = 1195+primOpTag PrefetchMutableByteArrayOp1 = 1196+primOpTag PrefetchAddrOp1 = 1197+primOpTag PrefetchValueOp1 = 1198+primOpTag PrefetchByteArrayOp0 = 1199+primOpTag PrefetchMutableByteArrayOp0 = 1200+primOpTag PrefetchAddrOp0 = 1201+primOpTag PrefetchValueOp0 = 1202
ghc-lib/stage1/lib/llvm-targets view
@@ -6,6 +6,8 @@ ,("armv6l-unknown-linux-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm1176jzf-s", "+strict-align")) ,("armv7-unknown-linux-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "")) ,("armv7a-unknown-linux-gnueabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", ""))+,("armv7a-unknown-linux-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", ""))+,("armv7l-unknown-linux-gnueabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "")) ,("armv7l-unknown-linux-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "")) ,("aarch64-unknown-linux-gnu", ("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "generic", "+neon")) ,("aarch64-unknown-linux", ("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "generic", "+neon"))@@ -13,19 +15,21 @@ ,("i386-unknown-linux", ("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128", "pentium4", "")) ,("x86_64-unknown-linux-gnu", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", "")) ,("x86_64-unknown-linux", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))+,("x86_64-unknown-linux-android", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", "+sse4.2 +popcnt")) ,("armv7-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "")) ,("aarch64-unknown-linux-android", ("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "generic", "+neon"))+,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "")) ,("powerpc64le-unknown-linux", ("e-m:e-i64:64-n32:64", "ppc64le", ""))-,("amd64-portbld-freebsd", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))-,("x86_64-unknown-freebsd", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))-,("arm-unknown-nto-qnx-eabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm7tdmi", "+strict-align")) ,("i386-apple-darwin", ("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128", "yonah", "")) ,("x86_64-apple-darwin", ("e-m:o-i64:64-f80:128-n8:16:32:64-S128", "core2", "")) ,("armv7-apple-ios", ("e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32", "generic", "")) ,("aarch64-apple-ios", ("e-m:o-i64:64-i128:128-n32:64-S128", "generic", "+neon")) ,("i386-apple-ios", ("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128", "yonah", "")) ,("x86_64-apple-ios", ("e-m:o-i64:64-f80:128-n8:16:32:64-S128", "core2", ""))+,("amd64-portbld-freebsd", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))+,("x86_64-unknown-freebsd", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", "")) ,("aarch64-unknown-freebsd", ("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "generic", "+neon")) ,("armv6-unknown-freebsd-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm1176jzf-s", "+strict-align")) ,("armv7-unknown-freebsd-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "+strict-align"))+,("arm-unknown-nto-qnx-eabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm7tdmi", "+strict-align")) ]
ghc-lib/stage1/lib/settings view
@@ -1,9 +1,10 @@ [("GCC extra via C opts", "-fwrapv -fno-builtin")-,("C compiler command", "gcc")+,("C compiler command", "cc") ,("C compiler flags", "")+,("C++ compiler flags", "") ,("C compiler link flags", "") ,("C compiler supports -no-pie", "NO")-,("Haskell CPP command", "gcc")+,("Haskell CPP command", "cc") ,("Haskell CPP flags", "-E -undef -traditional -Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs") ,("ld command", "ld") ,("ld flags", "")
ghc/GHCi/Leak.hs view
@@ -13,7 +13,7 @@ import GHCi.Util import HscTypes import Outputable-import Platform (target32Bit)+import GHC.Platform (target32Bit) import Prelude import System.Mem import System.Mem.Weak
ghc/GHCi/UI.hs view
@@ -108,6 +108,7 @@ import Data.Maybe import Data.Map (Map) import qualified Data.Map as M+import qualified Data.IntMap.Strict as IntMap import Data.Time.LocalTime ( getZonedTime ) import Data.Time.Format ( formatTime, defaultTimeLocale ) import Data.Version ( showVersion )@@ -187,8 +188,10 @@ ("def", keepGoing (defineMacro False), completeExpression), ("def!", keepGoing (defineMacro True), completeExpression), ("delete", keepGoing deleteCmd, noCompletion),+ ("disable", keepGoing disableCmd, noCompletion), ("doc", keepGoing' docCmd, completeIdentifier), ("edit", keepGoing' editFile, completeFilename),+ ("enable", keepGoing enableCmd, noCompletion), ("etags", keepGoing createETagsFileCmd, completeFilename), ("force", keepGoing forceCmd, completeExpression), ("forward", keepGoing forwardCmd, noCompletion),@@ -223,7 +226,8 @@ ("unadd", keepGoingPaths unAddModule, completeFilename), ("undef", keepGoing undefineMacro, completeMacro), ("unset", keepGoing unsetOptions, completeSetOptions),- ("where", keepGoing whereCmd, noCompletion)+ ("where", keepGoing whereCmd, noCompletion),+ ("instances", keepGoing' instancesCmd, completeExpression) ] ++ map mkCmdHidden [ -- hidden commands ("all-types", keepGoing' allTypesCmd), ("complete", keepGoing completeCmd),@@ -330,8 +334,12 @@ " :break [<mod>] <l> [<col>] set a breakpoint at the specified location\n" ++ " :break <name> set a breakpoint on the specified function\n" ++ " :continue resume after a breakpoint\n" ++- " :delete <number> delete the specified breakpoint\n" +++ " :delete <number> ... delete the specified breakpoints\n" ++ " :delete * delete all breakpoints\n" +++ " :disable <number> ... disable the specified breakpoints\n" +++ " :disable * disable all breakpoints\n" +++ " :enable <number> ... enable the specified breakpoints\n" +++ " :enable * enable all breakpoints\n" ++ " :force <expr> print <expr>, forcing unevaluated parts\n" ++ " :forward [<n>] go forward in the history N step s(after :back)\n" ++ " :history [<n>] after :trace, show the execution history\n" ++@@ -492,7 +500,7 @@ -- incremented after reading a line. line_number = 0, break_ctr = 0,- breaks = [],+ breaks = IntMap.empty, tickarrays = emptyModuleEnv, ghci_commands = availableCommands config, ghci_macros = [],@@ -1299,7 +1307,7 @@ let md = GHC.breakInfo_module inf nm = GHC.breakInfo_number inf st <- getGHCiState- return $ listToMaybe [ id_loc | id_loc@(_,loc) <- breaks st,+ return $ listToMaybe [ id_loc | id_loc@(_,loc) <- IntMap.assocs (breaks st), breakModule loc == md, breakTick loc == nm ] @@ -1535,8 +1543,8 @@ graph <- GHC.getModuleGraph when (not (null $ GHC.mgModSummaries graph)) $ liftIO $ putStrLn "Warning: changing directory causes all loaded modules to be unloaded,\nbecause the search path has changed."- GHC.setTargets []- _ <- GHC.load LoadAllTargets+ -- delete targets and all eventually defined breakpoints (#1620)+ clearAllTargets setContextAfterLoad False [] GHC.workingDirectoryChanged dir' <- expandPath dir@@ -1780,6 +1788,19 @@ InteractiveName -> ProgramError msg -----------------------------------------------------------------------------+-- :instances++instancesCmd :: String -> InputT GHCi ()+instancesCmd "" =+ throwGhcException (CmdLineError "syntax: ':instances <type-you-want-instances-for>'")+instancesCmd s = do+ handleSourceError GHC.printException $ do+ ty <- GHC.parseInstanceHead s+ res <- GHC.getInstancesForType ty++ printForUser $ vcat $ map ppr res++----------------------------------------------------------------------------- -- :load, :add, :reload -- | Sets '-fdefer-type-errors' if 'defer' is true, executes 'load' and unsets@@ -1831,9 +1852,7 @@ -- unload first _ <- GHC.abandonAll- discardActiveBreakPoints- GHC.setTargets []- _ <- GHC.load LoadAllTargets+ clearAllTargets GHC.setTargets targets success <- doLoadAndCollectInfo False LoadAllTargets@@ -2799,14 +2818,14 @@ nm = read nm_str st <- getGHCiState let old_breaks = breaks st- if all ((/= nm) . fst) old_breaks- then printForUser (text "Breakpoint" <+> ppr nm <+>- text "does not exist")- else do- let new_breaks = map fn old_breaks- fn (i,loc) | i == nm = (i,loc { onBreakCmd = dropWhile isSpace rest })- | otherwise = (i,loc)- setGHCiState st{ breaks = new_breaks }+ case IntMap.lookup nm old_breaks of+ Nothing -> printForUser (text "Breakpoint" <+> ppr nm <+>+ text "does not exist")+ Just loc -> do+ let new_breaks = IntMap.insert nm+ loc { onBreakCmd = dropWhile isSpace rest }+ old_breaks+ setGHCiState st{ breaks = new_breaks } setStop cmd = modifyGHCiState (\st -> st { stop = cmd }) setPrompt :: GhciMonad m => PromptFunction -> m ()@@ -2895,8 +2914,8 @@ when (verbosity dflags2 > 0) $ liftIO . putStrLn $ "package flags have changed, resetting and loading new packages..."- GHC.setTargets []- _ <- GHC.load LoadAllTargets+ -- delete targets and all eventually defined breakpoints. (#1620)+ clearAllTargets liftIO $ linkPackages hsc_env new_pkgs -- package flags changed, we can't re-use any of the old context setContextAfterLoad False []@@ -3507,6 +3526,56 @@ | all isDigit str = deleteBreak (read str) | otherwise = return () +enableCmd :: GhciMonad m => String -> m ()+enableCmd argLine = withSandboxOnly ":enable" $ do+ enaDisaSwitch True $ words argLine++disableCmd :: GhciMonad m => String -> m ()+disableCmd argLine = withSandboxOnly ":disable" $ do+ enaDisaSwitch False $ words argLine++enaDisaSwitch :: GhciMonad m => Bool -> [String] -> m ()+enaDisaSwitch enaDisa [] =+ printForUser (text "The" <+> text strCmd <+>+ text "command requires at least one argument.")+ where+ strCmd = if enaDisa then ":enable" else ":disable"+enaDisaSwitch enaDisa ("*" : _) = enaDisaAllBreaks enaDisa+enaDisaSwitch enaDisa idents = do+ mapM_ (enaDisaOneBreak enaDisa) idents+ where+ enaDisaOneBreak :: GhciMonad m => Bool -> String -> m ()+ enaDisaOneBreak enaDisa strId = do+ sdoc_loc <- getBreakLoc enaDisa strId+ case sdoc_loc of+ Left sdoc -> printForUser sdoc+ Right loc -> enaDisaAssoc enaDisa (read strId, loc)++getBreakLoc :: GhciMonad m => Bool -> String -> m (Either SDoc BreakLocation)+getBreakLoc enaDisa strId = do+ st <- getGHCiState+ case readMaybe strId >>= flip IntMap.lookup (breaks st) of+ Nothing -> return $ Left (text "Breakpoint" <+> text strId <+>+ text "not found")+ Just loc ->+ if breakEnabled loc == enaDisa+ then return $ Left+ (text "Breakpoint" <+> text strId <+>+ text "already in desired state")+ else return $ Right loc++enaDisaAssoc :: GhciMonad m => Bool -> (Int, BreakLocation) -> m ()+enaDisaAssoc enaDisa (intId, loc) = do+ st <- getGHCiState+ newLoc <- turnBreakOnOff enaDisa loc+ let new_breaks = IntMap.insert intId newLoc (breaks st)+ setGHCiState $ st { breaks = new_breaks }++enaDisaAllBreaks :: GhciMonad m => Bool -> m()+enaDisaAllBreaks enaDisa = do+ st <- getGHCiState+ mapM_ (enaDisaAssoc enaDisa) $ IntMap.assocs $ breaks st+ historyCmd :: GHC.GhcMonad m => String -> m () historyCmd arg | null arg = history 20@@ -3556,7 +3625,7 @@ forwardCmd arg | null arg = forward 1 | all isDigit arg = forward (read arg)- | otherwise = liftIO $ putStrLn "Syntax: :back [num]"+ | otherwise = liftIO $ putStrLn "Syntax: :forward [num]" where forward num = withSandboxOnly ":forward" $ do (names, ix, pan, _) <- GHC.forward num@@ -3634,6 +3703,7 @@ , breakLoc = RealSrcSpan pan , breakTick = tick , onBreakCmd = ""+ , breakEnabled = True } printForUser $ text "Breakpoint " <> ppr nm <>@@ -3899,26 +3969,29 @@ discardActiveBreakPoints :: GhciMonad m => m () discardActiveBreakPoints = do st <- getGHCiState- mapM_ (turnOffBreak.snd) (breaks st)- setGHCiState $ st { breaks = [] }+ mapM_ (turnBreakOnOff False) $ breaks st+ setGHCiState $ st { breaks = IntMap.empty } deleteBreak :: GhciMonad m => Int -> m () deleteBreak identity = do st <- getGHCiState- let oldLocations = breaks st- (this,rest) = partition (\loc -> fst loc == identity) oldLocations- if null this- then printForUser (text "Breakpoint" <+> ppr identity <+>- text "does not exist")- else do- mapM_ (turnOffBreak.snd) this+ let oldLocations = breaks st+ case IntMap.lookup identity oldLocations of+ Nothing -> printForUser (text "Breakpoint" <+> ppr identity <+>+ text "does not exist")+ Just loc -> do+ _ <- (turnBreakOnOff False) loc+ let rest = IntMap.delete identity oldLocations setGHCiState $ st { breaks = rest } -turnOffBreak :: GHC.GhcMonad m => BreakLocation -> m ()-turnOffBreak loc = do- (arr, _) <- getModBreak (breakModule loc)- hsc_env <- GHC.getSession- liftIO $ enableBreakpoint hsc_env arr (breakTick loc) False+turnBreakOnOff :: GHC.GhcMonad m => Bool -> BreakLocation -> m BreakLocation+turnBreakOnOff onOff loc+ | onOff == breakEnabled loc = return loc+ | otherwise = do+ (arr, _) <- getModBreak (breakModule loc)+ hsc_env <- GHC.getSession+ liftIO $ enableBreakpoint hsc_env arr (breakTick loc) onOff+ return loc { breakEnabled = onOff } getModBreak :: GHC.GhcMonad m => Module -> m (ForeignRef BreakArray, Array Int SrcSpan)@@ -4053,3 +4126,9 @@ then noCanDo n $ text "module " <> ppr modl <> text " is not interpreted" else and_then n++clearAllTargets :: GhciMonad m => m ()+clearAllTargets = discardActiveBreakPoints+ >> GHC.setTargets []+ >> GHC.load LoadAllTargets+ >> pure ()
ghc/GHCi/UI/Monad.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, FlexibleInstances #-}+{-# LANGUAGE CPP, FlexibleInstances, DeriveFunctor #-} {-# OPTIONS_GHC -fno-cse -fno-warn-orphans #-} -- -fno-cse is needed for GLOBAL_VAR's to behave properly @@ -41,14 +41,18 @@ import GhcMonad hiding (liftIO) import Outputable hiding (printForUser, printForUserPartWay) import qualified Outputable+import OccName import DynFlags import FastString import HscTypes import SrcLoc import Module+import RdrName (mkOrig)+import PrelNames (gHC_GHCI_HELPERS) import GHCi import GHCi.RemoteTypes import HsSyn (ImportDecl, GhcPs, GhciLStmt, LHsDecl)+import HsUtils import Util import Exception@@ -66,6 +70,7 @@ import Control.Monad.Trans.Class import Control.Monad.IO.Class import Data.Map.Strict (Map)+import qualified Data.IntMap.Strict as IntMap import qualified GHC.LanguageExtensions as LangExt -----------------------------------------------------------------------------@@ -84,7 +89,7 @@ options :: [GHCiOption], line_number :: !Int, -- ^ input line break_ctr :: !Int,- breaks :: ![(Int, BreakLocation)],+ breaks :: !(IntMap.IntMap BreakLocation), tickarrays :: ModuleEnv TickArray, -- ^ 'tickarrays' caches the 'TickArray' for loaded modules, -- so that we don't rebuild it each time the user sets@@ -213,6 +218,7 @@ { breakModule :: !GHC.Module , breakLoc :: !SrcSpan , breakTick :: {-# UNPACK #-} !Int+ , breakEnabled:: !Bool , onBreakCmd :: String } @@ -220,21 +226,27 @@ loc1 == loc2 = breakModule loc1 == breakModule loc2 && breakTick loc1 == breakTick loc2 -prettyLocations :: [(Int, BreakLocation)] -> SDoc-prettyLocations [] = text "No active breakpoints."-prettyLocations locs = vcat $ map (\(i, loc) -> brackets (int i) <+> ppr loc) $ reverse $ locs+prettyLocations :: IntMap.IntMap BreakLocation -> SDoc+prettyLocations locs =+ case IntMap.null locs of+ True -> text "No active breakpoints."+ False -> vcat $ map (\(i, loc) -> brackets (int i) <+> ppr loc) $ IntMap.toAscList locs instance Outputable BreakLocation where- ppr loc = (ppr $ breakModule loc) <+> ppr (breakLoc loc) <+>+ ppr loc = (ppr $ breakModule loc) <+> ppr (breakLoc loc) <+> pprEnaDisa <+> if null (onBreakCmd loc) then Outputable.empty else doubleQuotes (text (onBreakCmd loc))+ where pprEnaDisa = case breakEnabled loc of+ True -> text "enabled"+ False -> text "disabled" recordBreak :: GhciMonad m => BreakLocation -> m (Bool{- was already present -}, Int) recordBreak brkLoc = do st <- getGHCiState- let oldActiveBreaks = breaks st+ let oldmap = breaks st+ oldActiveBreaks = IntMap.assocs oldmap -- don't store the same break point twice case [ nm | (nm, loc) <- oldActiveBreaks, loc == brkLoc ] of (nm:_) -> return (True, nm)@@ -242,11 +254,12 @@ let oldCounter = break_ctr st newCounter = oldCounter + 1 setGHCiState $ st { break_ctr = newCounter,- breaks = (oldCounter, brkLoc) : oldActiveBreaks+ breaks = IntMap.insert oldCounter brkLoc oldmap } return (False, oldCounter) newtype GHCi a = GHCi { unGHCi :: IORef GHCiState -> Ghc a }+ deriving (Functor) reflectGHCi :: (Session, IORef GHCiState) -> GHCi a -> IO a reflectGHCi (s, gs) m = unGhc (unGHCi m gs) s@@ -254,9 +267,6 @@ startGHCi :: GHCi a -> GHCiState -> Ghc a startGHCi g state = do ref <- liftIO $ newIORef state; unGHCi g ref -instance Functor GHCi where- fmap = liftM- instance Applicative GHCi where pure a = GHCi $ \_ -> pure a (<*>) = ap@@ -482,13 +492,12 @@ -- | Compile "hFlush stdout; hFlush stderr" once, so we can use it repeatedly initInterpBuffering :: Ghc (ForeignHValue, ForeignHValue) initInterpBuffering = do- nobuf <- compileGHCiExpr $- "do { System.IO.hSetBuffering System.IO.stdin System.IO.NoBuffering; " ++- " System.IO.hSetBuffering System.IO.stdout System.IO.NoBuffering; " ++- " System.IO.hSetBuffering System.IO.stderr System.IO.NoBuffering }"- flush <- compileGHCiExpr $- "do { System.IO.hFlush System.IO.stdout; " ++- " System.IO.hFlush System.IO.stderr }"+ let mkHelperExpr :: OccName -> Ghc ForeignHValue+ mkHelperExpr occ =+ GHC.compileParsedExprRemote+ $ GHC.nlHsVar $ RdrName.mkOrig gHC_GHCI_HELPERS occ+ nobuf <- mkHelperExpr $ mkVarOcc "disableBuffering"+ flush <- mkHelperExpr $ mkVarOcc "flushAll" return (nobuf, flush) -- | Invoke "hFlush stdout; hFlush stderr" in the interpreter@@ -511,13 +520,18 @@ mkEvalWrapper :: GhcMonad m => String -> [String] -> m ForeignHValue mkEvalWrapper progname args =- compileGHCiExpr $- "\\m -> System.Environment.withProgName " ++ show progname ++- "(System.Environment.withArgs " ++ show args ++ " m)"+ runInternal $ GHC.compileParsedExprRemote+ $ evalWrapper `GHC.mkHsApp` nlHsString progname+ `GHC.mkHsApp` nlList (map nlHsString args)+ where+ nlHsString = nlHsLit . mkHsString+ evalWrapper =+ GHC.nlHsVar $ RdrName.mkOrig gHC_GHCI_HELPERS (mkVarOcc "evalWrapper") -compileGHCiExpr :: GhcMonad m => String -> m ForeignHValue-compileGHCiExpr expr =- withTempSession mkTempSession $ GHC.compileExprRemote expr+-- | Run a 'GhcMonad' action to compile an expression for internal usage.+runInternal :: GhcMonad m => m a -> m a+runInternal =+ withTempSession mkTempSession where mkTempSession hsc_env = hsc_env { hsc_dflags = (hsc_dflags hsc_env) {@@ -534,3 +548,6 @@ -- with fully qualified names without imports. `gopt_set` Opt_ImplicitImportQualified }++compileGHCiExpr :: GhcMonad m => String -> m ForeignHValue+compileGHCiExpr expr = runInternal $ GHC.compileExprRemote expr
ghc/Main.hs view
@@ -25,17 +25,20 @@ import DriverPipeline ( oneShot, compileFile ) import DriverMkDepend ( doMkDependHS ) import DriverBkp ( doBackpack )-#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) import GHCi.UI ( interactiveUI, ghciWelcomeMsg, defaultGhciSettings ) #endif -- Frontend plugins-#if defined(GHCI)-import DynamicLoading ( loadFrontendPlugin, initializePlugins )+#if defined(HAVE_INTERPRETER)+import DynamicLoading ( loadFrontendPlugin ) import Plugins #else import DynamicLoading ( pluginError ) #endif+#if defined(HAVE_INTERNAL_INTERPRETER)+import DynamicLoading ( initializePlugins )+#endif import Module ( ModuleName ) @@ -271,7 +274,7 @@ ghciUI :: HscEnv -> DynFlags -> [(FilePath, Maybe Phase)] -> Maybe [String] -> Ghc ()-#if !defined(GHCI)+#if !defined(HAVE_INTERNAL_INTERPRETER) ghciUI _ _ _ _ = throwGhcException (CmdLineError "not built for interactive use") #else@@ -521,7 +524,7 @@ isDoEvalMode (Right (Right (DoEval _))) = True isDoEvalMode _ = False -#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) isInteractiveMode :: PostLoadMode -> Bool isInteractiveMode DoInteractive = True isInteractiveMode _ = False@@ -752,7 +755,7 @@ showBanner _postLoadMode dflags = do let verb = verbosity dflags -#if defined(GHCI)+#if defined(HAVE_INTERNAL_INTERPRETER) -- Show the GHCi banner when (isInteractiveMode _postLoadMode && verb >= 1) $ putStrLn ghciWelcomeMsg #endif@@ -844,7 +847,7 @@ -- Frontend plugin support doFrontend :: ModuleName -> [(String, Maybe Phase)] -> Ghc ()-#if !defined(GHCI)+#if !defined(HAVE_INTERPRETER) doFrontend modname _ = pluginError [modname] #else doFrontend modname srcs = do
includes/Cmm.h view
@@ -308,7 +308,9 @@ #define ENTER_(ret,x) \ again: \ W_ info; \- LOAD_INFO(ret,x) \+ LOAD_INFO(ret,x) \+ /* See Note [Heap memory barriers] in SMP.h */ \+ prim_read_barrier; \ switch [INVALID_OBJECT .. N_CLOSURE_TYPES] \ (TO_W_( %INFO_TYPE(%STD_INFO(info)) )) { \ case \@@ -631,6 +633,14 @@ #define OVERWRITING_CLOSURE_OFS(c,n) /* nothing */ #endif +// Memory barriers.+// For discussion of how these are used to fence heap object+// accesses see Note [Heap memory barriers] in SMP.h.+#if defined(THREADED_RTS)+#define prim_read_barrier prim %read_barrier()+#else+#define prim_read_barrier /* nothing */+#endif #if defined(THREADED_RTS) #define prim_write_barrier prim %write_barrier() #else
includes/CodeGen.Platform.hs view
@@ -495,13 +495,13 @@ ,DoubleReg 1 #endif #if defined(REG_XMM1)- ,XmmReg 1+ ,XmmReg 1 2 W64 Integer #endif #if defined(REG_YMM1)- ,YmmReg 1+ ,YmmReg 1 4 W64 Integer #endif #if defined(REG_ZMM1)- ,ZmmReg 1+ ,ZmmReg 1 8 W64 Integer #endif #if defined(REG_F2) ,FloatReg 2@@ -510,13 +510,13 @@ ,DoubleReg 2 #endif #if defined(REG_XMM2)- ,XmmReg 2+ ,XmmReg 2 2 W64 Integer #endif #if defined(REG_YMM2)- ,YmmReg 2+ ,YmmReg 2 4 W64 Integer #endif #if defined(REG_ZMM2)- ,ZmmReg 2+ ,ZmmReg 2 8 W64 Integer #endif #if defined(REG_F3) ,FloatReg 3@@ -525,13 +525,13 @@ ,DoubleReg 3 #endif #if defined(REG_XMM3)- ,XmmReg 3+ ,XmmReg 3 2 W64 Integer #endif #if defined(REG_YMM3)- ,YmmReg 3+ ,YmmReg 3 4 W64 Integer #endif #if defined(REG_ZMM3)- ,ZmmReg 3+ ,ZmmReg 3 8 W64 Integer #endif #if defined(REG_F4) ,FloatReg 4@@ -540,13 +540,13 @@ ,DoubleReg 4 #endif #if defined(REG_XMM4)- ,XmmReg 4+ ,XmmReg 4 2 W64 Integer #endif #if defined(REG_YMM4)- ,YmmReg 4+ ,YmmReg 4 4 W64 Integer #endif #if defined(REG_ZMM4)- ,ZmmReg 4+ ,ZmmReg 4 8 W64 Integer #endif #if defined(REG_F5) ,FloatReg 5@@ -555,13 +555,13 @@ ,DoubleReg 5 #endif #if defined(REG_XMM5)- ,XmmReg 5+ ,XmmReg 5 2 W64 Integer #endif #if defined(REG_YMM5)- ,YmmReg 5+ ,YmmReg 5 4 W64 Integer #endif #if defined(REG_ZMM5)- ,ZmmReg 5+ ,ZmmReg 5 8 W64 Integer #endif #if defined(REG_F6) ,FloatReg 6@@ -570,13 +570,13 @@ ,DoubleReg 6 #endif #if defined(REG_XMM6)- ,XmmReg 6+ ,XmmReg 6 2 W64 Integer #endif #if defined(REG_YMM6)- ,YmmReg 6+ ,YmmReg 6 4 W64 Integer #endif #if defined(REG_ZMM6)- ,ZmmReg 6+ ,ZmmReg 6 8 W64 Integer #endif #else /* MAX_REAL_XMM_REG == 0 */ #if defined(REG_F1)@@ -733,62 +733,62 @@ # endif # if MAX_REAL_XMM_REG != 0 # if defined(REG_XMM1)-globalRegMaybe (XmmReg 1) = Just (RealRegSingle REG_XMM1)+globalRegMaybe (XmmReg 1 _ _ _) = Just (RealRegSingle REG_XMM1) # endif # if defined(REG_XMM2)-globalRegMaybe (XmmReg 2) = Just (RealRegSingle REG_XMM2)+globalRegMaybe (XmmReg 2 _ _ _) = Just (RealRegSingle REG_XMM2) # endif # if defined(REG_XMM3)-globalRegMaybe (XmmReg 3) = Just (RealRegSingle REG_XMM3)+globalRegMaybe (XmmReg 3 _ _ _) = Just (RealRegSingle REG_XMM3) # endif # if defined(REG_XMM4)-globalRegMaybe (XmmReg 4) = Just (RealRegSingle REG_XMM4)+globalRegMaybe (XmmReg 4 _ _ _) = Just (RealRegSingle REG_XMM4) # endif # if defined(REG_XMM5)-globalRegMaybe (XmmReg 5) = Just (RealRegSingle REG_XMM5)+globalRegMaybe (XmmReg 5 _ _ _) = Just (RealRegSingle REG_XMM5) # endif # if defined(REG_XMM6)-globalRegMaybe (XmmReg 6) = Just (RealRegSingle REG_XMM6)+globalRegMaybe (XmmReg 6 _ _ _) = Just (RealRegSingle REG_XMM6) # endif # endif # if defined(MAX_REAL_YMM_REG) && MAX_REAL_YMM_REG != 0 # if defined(REG_YMM1)-globalRegMaybe (YmmReg 1) = Just (RealRegSingle REG_YMM1)+globalRegMaybe (YmmReg 1 _ _ _) = Just (RealRegSingle REG_YMM1) # endif # if defined(REG_YMM2)-globalRegMaybe (YmmReg 2) = Just (RealRegSingle REG_YMM2)+globalRegMaybe (YmmReg 2 _ _ _) = Just (RealRegSingle REG_YMM2) # endif # if defined(REG_YMM3)-globalRegMaybe (YmmReg 3) = Just (RealRegSingle REG_YMM3)+globalRegMaybe (YmmReg 3 _ _ _) = Just (RealRegSingle REG_YMM3) # endif # if defined(REG_YMM4)-globalRegMaybe (YmmReg 4) = Just (RealRegSingle REG_YMM4)+globalRegMaybe (YmmReg 4 _ _ _) = Just (RealRegSingle REG_YMM4) # endif # if defined(REG_YMM5)-globalRegMaybe (YmmReg 5) = Just (RealRegSingle REG_YMM5)+globalRegMaybe (YmmReg 5 _ _ _) = Just (RealRegSingle REG_YMM5) # endif # if defined(REG_YMM6)-globalRegMaybe (YmmReg 6) = Just (RealRegSingle REG_YMM6)+globalRegMaybe (YmmReg 6 _ _ _) = Just (RealRegSingle REG_YMM6) # endif # endif # if defined(MAX_REAL_ZMM_REG) && MAX_REAL_ZMM_REG != 0 # if defined(REG_ZMM1)-globalRegMaybe (ZmmReg 1) = Just (RealRegSingle REG_ZMM1)+globalRegMaybe (ZmmReg 1 _ _ _) = Just (RealRegSingle REG_ZMM1) # endif # if defined(REG_ZMM2)-globalRegMaybe (ZmmReg 2) = Just (RealRegSingle REG_ZMM2)+globalRegMaybe (ZmmReg 2 _ _ _) = Just (RealRegSingle REG_ZMM2) # endif # if defined(REG_ZMM3)-globalRegMaybe (ZmmReg 3) = Just (RealRegSingle REG_ZMM3)+globalRegMaybe (ZmmReg 3 _ _ _) = Just (RealRegSingle REG_ZMM3) # endif # if defined(REG_ZMM4)-globalRegMaybe (ZmmReg 4) = Just (RealRegSingle REG_ZMM4)+globalRegMaybe (ZmmReg 4 _ _ _) = Just (RealRegSingle REG_ZMM4) # endif # if defined(REG_ZMM5)-globalRegMaybe (ZmmReg 5) = Just (RealRegSingle REG_ZMM5)+globalRegMaybe (ZmmReg 5 _ _ _) = Just (RealRegSingle REG_ZMM5) # endif # if defined(REG_ZMM6)-globalRegMaybe (ZmmReg 6) = Just (RealRegSingle REG_ZMM6)+globalRegMaybe (ZmmReg 6 _ _ _) = Just (RealRegSingle REG_ZMM6) # endif # endif # if defined(REG_Sp)
includes/Rts.h view
@@ -147,6 +147,14 @@ #define USED_IF_NOT_THREADS #endif +#if defined(PROFILING)+#define USED_IF_PROFILING+#define USED_IF_NOT_PROFILING STG_UNUSED+#else+#define USED_IF_PROFILING STG_UNUSED+#define USED_IF_NOT_PROFILING+#endif+ #define FMT_SizeT "zu" #define FMT_HexSizeT "zx"
includes/rts/Config.h view
@@ -26,11 +26,15 @@ #define USING_LIBBFD 1 #endif -/* DEBUG implies TRACING and TICKY_TICKY */-#if defined(DEBUG)+/* DEBUG and PROFILING both imply TRACING */+#if defined(DEBUG) || defined(PROFILING) #if !defined(TRACING) #define TRACING #endif+#endif++/* DEBUG implies TICKY_TICKY */+#if defined(DEBUG) #if !defined(TICKY_TICKY) #define TICKY_TICKY #endif
includes/rts/EventLogFormat.h view
@@ -178,6 +178,7 @@ #define EVENT_HEAP_PROF_SAMPLE_BEGIN 162 #define EVENT_HEAP_PROF_SAMPLE_COST_CENTRE 163 #define EVENT_HEAP_PROF_SAMPLE_STRING 164+#define EVENT_HEAP_PROF_SAMPLE_END 165 #define EVENT_USER_BINARY_MSG 181
includes/rts/storage/ClosureMacros.h view
@@ -542,8 +542,10 @@ EXTERN_INLINE void overwritingClosure_ (StgClosure *p, uint32_t offset /* in words */,- uint32_t size /* closure size, in words */);-EXTERN_INLINE void overwritingClosure_ (StgClosure *p, uint32_t offset, uint32_t size)+ uint32_t size /* closure size, in words */,+ bool prim /* Whether to call LDV_recordDead */+ );+EXTERN_INLINE void overwritingClosure_ (StgClosure *p, uint32_t offset, uint32_t size, bool prim USED_IF_PROFILING) { #if ZERO_SLOP_FOR_LDV_PROF && !ZERO_SLOP_FOR_SANITY_CHECK // see Note [zeroing slop], also #8402@@ -552,7 +554,7 @@ // For LDV profiling, we need to record the closure as dead #if defined(PROFILING)- LDV_recordDead(p, size);+ if (!prim) { LDV_recordDead(p, size); }; #endif for (uint32_t i = offset; i < size; i++) {@@ -563,7 +565,7 @@ EXTERN_INLINE void overwritingClosure (StgClosure *p); EXTERN_INLINE void overwritingClosure (StgClosure *p) {- overwritingClosure_(p, sizeofW(StgThunkHeader), closure_sizeW(p));+ overwritingClosure_(p, sizeofW(StgThunkHeader), closure_sizeW(p), false); } // Version of 'overwritingClosure' which overwrites only a suffix of a@@ -576,12 +578,14 @@ EXTERN_INLINE void overwritingClosureOfs (StgClosure *p, uint32_t offset); EXTERN_INLINE void overwritingClosureOfs (StgClosure *p, uint32_t offset) {- overwritingClosure_(p, offset, closure_sizeW(p));+ // Set prim = true because only called on ARR_WORDS with the+ // shrinkMutableByteArray# primop+ overwritingClosure_(p, offset, closure_sizeW(p), true); } // Version of 'overwritingClosure' which takes closure size as argument. EXTERN_INLINE void overwritingClosureSize (StgClosure *p, uint32_t size /* in words */); EXTERN_INLINE void overwritingClosureSize (StgClosure *p, uint32_t size) {- overwritingClosure_(p, sizeofW(StgThunkHeader), size);+ overwritingClosure_(p, sizeofW(StgThunkHeader), size, false); }
+ libraries/ghc-boot/GHC/Settings.hs view
@@ -0,0 +1,104 @@+-- Note [Settings file]+-- ~~~~~~~~~~~~~~~~~~~~+--+-- GHC has a file, `${top_dir}/settings`, which is the main source of run-time+-- configuration. ghc-pkg needs just a little bit of it: the target platform CPU+-- arch and OS. It uses that to figure out what subdirectory of `~/.ghc` is+-- associated with the current version/target.+--+-- This module has just enough code to read key value pairs from the settings+-- file, and read the target platform from those pairs.+--+-- The "0" suffix is because the caller will partially apply it, and that will+-- in turn be used a few more times.+module GHC.Settings where++import Prelude -- See Note [Why do we import Prelude here?]++import GHC.BaseDir+import GHC.Platform++import Data.Char (isSpace)+import Data.Map (Map)+import qualified Data.Map as Map++-----------------------------------------------------------------------------+-- parts of settings file++getTargetPlatform+ :: FilePath -> RawSettings -> Either String Platform+getTargetPlatform settingsFile mySettings = do+ let+ getBooleanSetting = getBooleanSetting0 settingsFile mySettings+ readSetting :: (Show a, Read a) => String -> Either String a+ readSetting = readSetting0 settingsFile mySettings++ targetArch <- readSetting "target arch"+ targetOS <- readSetting "target os"+ targetWordSize <- readSetting "target word size"+ targetUnregisterised <- getBooleanSetting "Unregisterised"+ targetHasGnuNonexecStack <- readSetting "target has GNU nonexec stack"+ targetHasIdentDirective <- readSetting "target has .ident directive"+ targetHasSubsectionsViaSymbols <- readSetting "target has subsections via symbols"+ crossCompiling <- getBooleanSetting "cross compiling"++ pure $ Platform+ { platformArch = targetArch+ , platformOS = targetOS+ , platformWordSize = targetWordSize+ , platformUnregisterised = targetUnregisterised+ , platformHasGnuNonexecStack = targetHasGnuNonexecStack+ , platformHasIdentDirective = targetHasIdentDirective+ , platformHasSubsectionsViaSymbols = targetHasSubsectionsViaSymbols+ , platformIsCrossCompiling = crossCompiling+ }++-----------------------------------------------------------------------------+-- settings file helpers++type RawSettings = Map String String++-- | See Note [Settings file] for "0" suffix+getSetting0+ :: FilePath -> RawSettings -> String -> Either String String+getSetting0 settingsFile mySettings key = case Map.lookup key mySettings of+ Just xs -> Right xs+ Nothing -> Left $ "No entry for " ++ show key ++ " in " ++ show settingsFile++-- | See Note [Settings file] for "0" suffix+getFilePathSetting0+ :: FilePath -> FilePath -> RawSettings -> String -> Either String String+getFilePathSetting0 top_dir settingsFile mySettings key =+ expandTopDir top_dir <$> getSetting0 settingsFile mySettings key++-- | See Note [Settings file] for "0" suffix+getBooleanSetting0+ :: FilePath -> RawSettings -> String -> Either String Bool+getBooleanSetting0 settingsFile mySettings key = do+ rawValue <- getSetting0 settingsFile mySettings key+ case rawValue of+ "YES" -> Right True+ "NO" -> Right False+ xs -> Left $ "Bad value for " ++ show key ++ ": " ++ show xs++-- | See Note [Settings file] for "0" suffix+readSetting0+ :: (Show a, Read a) => FilePath -> RawSettings -> String -> Either String a+readSetting0 settingsFile mySettings key = case Map.lookup key mySettings of+ Just xs -> case maybeRead xs of+ Just v -> Right v+ Nothing -> Left $ "Failed to read " ++ show key ++ " value " ++ show xs+ Nothing -> Left $ "No entry for " ++ show key ++ " in " ++ show settingsFile++-----------------------------------------------------------------------------+-- read helpers++maybeRead :: Read a => String -> Maybe a+maybeRead str = case reads str of+ [(x, "")] -> Just x+ _ -> Nothing++maybeReadFuzzy :: Read a => String -> Maybe a+maybeReadFuzzy str = case reads str of+ [(x, s)] | all isSpace s -> Just x+ _ -> Nothing
libraries/ghci/GHCi/InfoTable.hsc view
@@ -10,13 +10,13 @@ -- module GHCi.InfoTable (-#ifdef GHCI+#if defined(HAVE_INTERPRETER) mkConInfoTable #endif ) where import Prelude -- See note [Why do we import Prelude here?]-#ifdef GHCI+#if defined(HAVE_INTERPRETER) import Foreign import Foreign.C import GHC.Ptr@@ -27,13 +27,13 @@ #endif ghciTablesNextToCode :: Bool-#ifdef TABLES_NEXT_TO_CODE+#if defined(TABLES_NEXT_TO_CODE) ghciTablesNextToCode = True #else ghciTablesNextToCode = False #endif -#ifdef GHCI /* To end */+#if defined(HAVE_INTERPRETER) /* To end */ -- NOTE: Must return a pointer acceptable for use in the header of a closure. -- If tables_next_to_code is enabled, then it must point the the 'code' field. -- Otherwise, it should point to the start of the StgInfoTable.@@ -387,4 +387,4 @@ conInfoTableSizeB :: Int conInfoTableSizeB = wORD_SIZE + itblSize-#endif /* GHCI */+#endif /* HAVE_INTERPRETER */