-
Wilke Pierre authoredWilke Pierre authored
linear_gen.ml 1.36 KiB
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