Generate chain of CFG nodes for instructions in a function.

master
Rohan Jacob-Rao 9 years ago
parent 7e00a845d8
commit 9b8cd7d582

@ -69,26 +69,26 @@ let trans_func_def (cfg : Cfg.cfg) (cg: Cg.t) : LAst.func_def -> unit = function
captured = []; captured = [];
loc = Sil.dummy_location loc = Sil.dummy_location
} in } in
let nodekind_of_instr : LAst.instr -> Cfg.Node.nodekind = function
| Ret _ -> Cfg.Node.Stmt_node "method_body"
| _ -> raise (Unimplemented "Need to get node type for instruction.") in
let add_instr (cfg : Cfg.cfg) (procdesc : Cfg.Procdesc.t) (instr : LAst.instr) : unit =
let _ = Cfg.Node.create
cfg Sil.dummy_location (nodekind_of_instr instr)
(trans_instr cfg procdesc instr) procdesc [] in
() in
let procdesc = Cfg.Procdesc.create procdesc_builder in let procdesc = Cfg.Procdesc.create procdesc_builder in
let procname = Cfg.Procdesc.get_proc_name procdesc in let procname = Cfg.Procdesc.get_proc_name procdesc in
let start_kind = Cfg.Node.Start_node procdesc in let start_kind = Cfg.Node.Start_node procdesc in
let start_node = Cfg.Node.create cfg Sil.dummy_location start_kind [] procdesc [] in let start_node = Cfg.Node.create cfg Sil.dummy_location start_kind [] procdesc [] in
let exit_kind = Cfg.Node.Exit_node procdesc in let exit_kind = Cfg.Node.Exit_node procdesc in
let exit_node = Cfg.Node.create cfg Sil.dummy_location exit_kind [] procdesc [] in let exit_node = Cfg.Node.create cfg Sil.dummy_location exit_kind [] procdesc [] in
Cfg.Node.set_succs_exn start_node [exit_node] [exit_node]; let nodekind_of_instr : LAst.instr -> Cfg.Node.nodekind = function
| Ret _ -> Cfg.Node.Stmt_node "method_body"
| _ -> raise (Unimplemented "Need to get node type for instruction.") in
let node_of_instr (cfg : Cfg.cfg) (procdesc : Cfg.Procdesc.t) (instr : LAst.instr) : Cfg.Node.t =
Cfg.Node.create cfg Sil.dummy_location (nodekind_of_instr instr) (trans_instr cfg procdesc instr) procdesc [] in
let rec link_nodes (start_node : Cfg.Node.t) : Cfg.Node.t list -> unit = function
(* link all nodes in a chain for now *)
| [] -> Cfg.Node.set_succs_exn start_node [exit_node] [exit_node]
| nd :: nds -> Cfg.Node.set_succs_exn start_node [nd] [exit_node]; link_nodes nd nds in
let nodes = List.map (node_of_instr cfg procdesc) instrs in
Cfg.Procdesc.set_start_node procdesc start_node; Cfg.Procdesc.set_start_node procdesc start_node;
Cfg.Procdesc.set_exit_node procdesc exit_node; Cfg.Procdesc.set_exit_node procdesc exit_node;
(*add_edges context start_node exn_node [exit_node] method_body_nodes impl * false;*) link_nodes start_node nodes;
Cg.add_node cg procname; Cg.add_node cg procname
List.iter (fun instr -> add_instr cfg procdesc instr) instrs
let trans_prog : LAst.prog -> Cfg.cfg * Cg.t * Sil.tenv = function let trans_prog : LAst.prog -> Cfg.cfg * Cg.t * Sil.tenv = function
Prog func_defs -> Prog func_defs ->

Loading…
Cancel
Save