X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=CoreTools.hs;h=bd6f329c537ea93842bf5b221998cf47fb69085c;hb=46f93616d6a7ef012c5f07698d56372881196015;hp=9c75bcc7b61caa6289fbec13e6e03257435e08ad;hpb=78b45072fc36c7311bee97f2d9195bbc33b994cf;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/CoreTools.hs b/CoreTools.hs index 9c75bcc..bd6f329 100644 --- a/CoreTools.hs +++ b/CoreTools.hs @@ -6,6 +6,7 @@ module CoreTools where --Standard modules import qualified Maybe +import System.IO.Unsafe -- GHC API import qualified GHC @@ -14,6 +15,7 @@ import qualified TcType import qualified HsExpr import qualified HsTypes import qualified HsBinds +import qualified HscTypes import qualified RdrName import qualified Name import qualified OccName @@ -27,6 +29,7 @@ import qualified VarSet import qualified Unique import qualified CoreUtils import qualified CoreFVs +import qualified Literal -- Local imports import GhcTools @@ -40,7 +43,6 @@ eval_tfp_int ty = unsafeRunGhc $ do -- Automatically import modules for any fully qualified identifiers setDynFlag DynFlags.Opt_ImplicitImportQualified - --setDynFlag DynFlags.Opt_D_dump_if_trace let from_int_t_name = mkRdrName "Types.Data.Num" "fromIntegerT" let from_int_t = SrcLoc.noLoc $ HsExpr.HsVar from_int_t_name @@ -59,9 +61,15 @@ eval_tfp_int ty = core <- toCore modules expr execCore core +normalise_tfp_int :: HscTypes.HscEnv -> Type.Type -> Type.Type +normalise_tfp_int env ty = + unsafePerformIO $ do + nty <- normaliseType env ty + return nty + -- | Get the width of a SizedWord type -sized_word_len :: Type.Type -> Int -sized_word_len ty = eval_tfp_int (sized_word_len_ty ty) +-- sized_word_len :: HscTypes.HscEnv -> Type.Type -> Int +-- sized_word_len env ty = eval_tfp_int env (sized_word_len_ty ty) sized_word_len_ty :: Type.Type -> Type.Type sized_word_len_ty ty = len @@ -72,8 +80,8 @@ sized_word_len_ty ty = len [len] = args -- | Get the width of a SizedInt type -sized_int_len :: Type.Type -> Int -sized_int_len ty = eval_tfp_int (sized_int_len_ty ty) +-- sized_int_len :: HscTypes.HscEnv -> Type.Type -> Int +-- sized_int_len env ty = eval_tfp_int env (sized_int_len_ty ty) sized_int_len_ty :: Type.Type -> Type.Type sized_int_len_ty ty = len @@ -84,8 +92,8 @@ sized_int_len_ty ty = len [len] = args -- | Get the upperbound of a RangedWord type -ranged_word_bound :: Type.Type -> Int -ranged_word_bound ty = eval_tfp_int (ranged_word_bound_ty ty) +-- ranged_word_bound :: HscTypes.HscEnv -> Type.Type -> Int +-- ranged_word_bound env ty = eval_tfp_int env (ranged_word_bound_ty ty) ranged_word_bound_ty :: Type.Type -> Type.Type ranged_word_bound_ty ty = len @@ -112,8 +120,8 @@ ranged_word_bound_ty ty = len -- execCore core -- | Get the length of a FSVec type -tfvec_len :: Type.Type -> Int -tfvec_len ty = eval_tfp_int (tfvec_len_ty ty) +-- tfvec_len :: HscTypes.HscEnv -> Type.Type -> Int +-- tfvec_len env ty = eval_tfp_int env (tfvec_len_ty ty) tfvec_len_ty :: Type.Type -> Type.Type tfvec_len_ty ty = len @@ -163,6 +171,10 @@ is_var :: CoreSyn.CoreExpr -> Bool is_var (CoreSyn.Var _) = True is_var _ = False +is_lit :: CoreSyn.CoreExpr -> Bool +is_lit (CoreSyn.Lit _) = True +is_lit _ = False + -- Can the given core expression be applied to something? This is true for -- applying to a value as well as a type. is_applicable :: CoreSyn.CoreExpr -> Bool @@ -189,6 +201,11 @@ exprToVar :: CoreSyn.CoreExpr -> Var.Id exprToVar (CoreSyn.Var id) = id exprToVar expr = error $ "\nCoreTools.exprToVar: Not a var: " ++ show expr +-- Turns a Lit CoreExpr into the Literal inside it. +exprToLit :: CoreSyn.CoreExpr -> Literal.Literal +exprToLit (CoreSyn.Lit lit) = lit +exprToLit expr = error $ "\nCoreTools.exprToLit: Not a lit: " ++ show expr + -- Removes all the type and dictionary arguments from the given argument list, -- leaving only the normal value arguments. The type given is the type of the -- expression applied to this argument list. @@ -200,3 +217,9 @@ get_val_args ty args = drop n args -- (length predtypes) arguments should be dictionaries. We drop this many -- arguments, to get at the value arguments. n = length tyvars + length predtypes + +getLiterals :: CoreSyn.CoreExpr -> [CoreSyn.CoreExpr] +getLiterals app@(CoreSyn.App _ _) = literals + where + (CoreSyn.Var f, args) = CoreSyn.collectArgs app + literals = filter (is_lit) args