open Preamble open CostLabel open FrontEndVal open Hide open ByteValues open GenMem open FrontEndMem open Proper open PositiveMap open Deqsets open Extralib open Lists open Identifiers open Integers open AST open Division open Exp open Arithmetic open Extranat open Vector open FoldStuff open BitVector open Z open BitVectorZ open Pointers open ErrorMessages open Option open Setoids open Monad open Positive open PreIdentifiers open Errors open Div_and_mod open Jmeq open Russell open Util open Bool open Relations open Nat open List open Hints_declaration open Core_notation open Pts open Logic open Types open Coqlib open Values open FrontEndOps open Cminor_syntax open Extra_bool open Globalenvs (** val init_expr : AST.init_data -> (AST.typ, Cminor_syntax.expr) Types.dPair Types.option **) let init_expr = function | AST.Init_int8 i -> Types.Some { Types.dpi1 = (AST.ASTint (AST.I8, AST.Unsigned)); Types.dpi2 = (Cminor_syntax.Cst ((AST.ASTint (AST.I8, AST.Unsigned)), (FrontEndOps.Ointconst (AST.I8, AST.Unsigned, i)))) } | AST.Init_int16 i -> Types.Some { Types.dpi1 = (AST.ASTint (AST.I16, AST.Unsigned)); Types.dpi2 = (Cminor_syntax.Cst ((AST.ASTint (AST.I16, AST.Unsigned)), (FrontEndOps.Ointconst (AST.I16, AST.Unsigned, i)))) } | AST.Init_int32 i -> Types.Some { Types.dpi1 = (AST.ASTint (AST.I32, AST.Unsigned)); Types.dpi2 = (Cminor_syntax.Cst ((AST.ASTint (AST.I32, AST.Unsigned)), (FrontEndOps.Ointconst (AST.I32, AST.Unsigned, i)))) } | AST.Init_space n -> Types.None | AST.Init_null -> Types.Some { Types.dpi1 = AST.ASTptr; Types.dpi2 = (Cminor_syntax.Op1 ((AST.ASTint (AST.I8, AST.Unsigned)), AST.ASTptr, (FrontEndOps.Optrofint (AST.I8, AST.Unsigned)), (Cminor_syntax.Cst ((AST.ASTint (AST.I8, AST.Unsigned)), (FrontEndOps.Ointconst (AST.I8, AST.Unsigned, (BitVector.zero (AST.bitsize_of_intsize AST.I8)))))))) } | AST.Init_addrof (id, off) -> Types.Some { Types.dpi1 = AST.ASTptr; Types.dpi2 = (Cminor_syntax.Cst (AST.ASTptr, (FrontEndOps.Oaddrsymbol (id, off)))) } (** val option_jmdiscr : 'a1 Types.option -> 'a1 Types.option -> __ **) let option_jmdiscr x y = Logic.eq_rect_Type2 x (match x with | Types.None -> Obj.magic (fun _ dH -> dH) | Types.Some a0 -> Obj.magic (fun _ dH -> dH __)) y (** val dPair_jmdiscr : ('a1, 'a2) Types.dPair -> ('a1, 'a2) Types.dPair -> __ **) let dPair_jmdiscr x y = Logic.eq_rect_Type2 x (let { Types.dpi1 = a0; Types.dpi2 = a10 } = x in Obj.magic (fun _ dH -> dH __ __)) y (** val init_datum : AST.ident -> AST.region -> AST.init_data -> Nat.nat -> Cminor_syntax.stmt Types.sig0 **) let init_datum id r init off = (match init_expr init with | Types.None -> (fun _ -> Cminor_syntax.St_skip) | Types.Some x -> (fun _ -> (let { Types.dpi1 = t; Types.dpi2 = e } = x in (fun _ -> Cminor_syntax.St_store (t, (Cminor_syntax.Cst (AST.ASTptr, (FrontEndOps.Oaddrsymbol (id, off)))), e))) __)) __ (** val init_var : AST.ident -> AST.region -> AST.init_data List.list -> Cminor_syntax.stmt Types.sig0 **) let init_var id r init = (Util.foldl (fun os datum -> let { Types.fst = off; Types.snd = s } = os in { Types.fst = (Nat.plus off (Globalenvs.size_init_data datum)); Types.snd = (Cminor_syntax.St_seq ((Types.pi1 (init_datum id r datum off)), s)) }) { Types.fst = Nat.O; Types.snd = (Types.pi1 Cminor_syntax.St_skip) } init).Types.snd (** val init_vars : ((AST.ident, AST.region) Types.prod, AST.init_data List.list) Types.prod List.list -> Cminor_syntax.stmt Types.sig0 **) let init_vars vars = List.foldr (fun var s -> Cminor_syntax.St_seq ((Types.pi1 s), (Types.pi1 (init_var var.Types.fst.Types.fst var.Types.fst.Types.snd var.Types.snd)))) Cminor_syntax.St_skip vars (** val add_statement : CostLabel.costlabel -> AST.ident -> Cminor_syntax.stmt Types.sig0 -> (AST.ident, Cminor_syntax.internal_function AST.fundef) Types.prod List.list -> (AST.ident, Cminor_syntax.internal_function AST.fundef) Types.prod List.list **) let add_statement cost id s = let s0 = s in List.map (fun idf -> let { Types.fst = id'; Types.snd = f' } = idf in (match AST.ident_eq id id' with | Types.Inl _ -> (match f' with | AST.Internal f -> { Types.fst = id; Types.snd = (AST.Internal { Cminor_syntax.f_return = f.Cminor_syntax.f_return; Cminor_syntax.f_params = f.Cminor_syntax.f_params; Cminor_syntax.f_vars = f.Cminor_syntax.f_vars; Cminor_syntax.f_stacksize = f.Cminor_syntax.f_stacksize; Cminor_syntax.f_body = (Cminor_syntax.St_cost (cost, (Cminor_syntax.St_seq (s0, f.Cminor_syntax.f_body)))) }) } | AST.External f -> { Types.fst = id; Types.snd = (AST.External f) }) | Types.Inr _ -> { Types.fst = id'; Types.snd = f' })) (** val empty_vars : ((AST.ident, AST.region) Types.prod, AST.init_data List.list) Types.prod List.list -> ((AST.ident, AST.region) Types.prod, Nat.nat) Types.prod List.list **) let empty_vars = List.map (fun v -> { Types.fst = { Types.fst = v.Types.fst.Types.fst; Types.snd = v.Types.fst.Types.snd }; Types.snd = (Globalenvs.size_init_data_list v.Types.snd) }) (** val replace_init : CostLabel.costlabel -> Cminor_syntax.cminor_program -> Cminor_syntax.cminor_noinit_program **) let replace_init cost p = { AST.prog_vars = (empty_vars p.AST.prog_vars); AST.prog_funct = (add_statement cost p.AST.prog_main (init_vars p.AST.prog_vars) p.AST.prog_funct); AST.prog_main = p.AST.prog_main }