open Batteries open Rtl open Linear open Prog open Utils let succs_of_rtl_instr (i: rtl_instr) = match i with | Rtl.Rbranch (_, _, _, s1) -> [s1] | Rtl.Rjmp s -> [s] | _ -> [] let rec succs_of_rtl_instrs il : int list = List.concat (List.map succs_of_rtl_instr il) (* effectue un tri topologique des blocs. *) let sort_blocks (nodes: (int, rtl_instr list) Hashtbl.t) entry = let rec add_block order n = (* TODO *) List.of_enum (Hashtbl.keys nodes) in add_block [] entry (* Supprime les jumps inutiles (Jmp à un label défini juste en dessous). *) let rec remove_useless_jumps (l: rtl_instr list) = (* TODO *) l (* Remove labels that are never jumped to. *) let remove_useless_labels (l: rtl_instr list) = (* TODO *) l let linear_of_rtl_fun ({ rtlfunargs; rtlfunbody; rtlfunentry; rtlfuninfo }: rtl_fun) = let block_order = sort_blocks rtlfunbody rtlfunentry in let linearinstrs = List.fold_left (fun l n -> match Hashtbl.find_option rtlfunbody n with | None -> l | Some li -> l @ Rlabel(n) :: li ) [] block_order in { linearfunargs = rtlfunargs; linearfunbody = linearinstrs |> remove_useless_jumps |> remove_useless_labels; linearfuninfo = rtlfuninfo; } let linear_of_rtl_gdef = function Gfun f -> Gfun (linear_of_rtl_fun f) let linear_of_rtl r = assoc_map linear_of_rtl_gdef r