let finalize_pdg pdg from_opt =
P.debug ~level:2 "try to finalize_pdg";
let last_state =
try Some (State.get_last_state (get_states pdg))
with Not_found ->
CilE.warn_once "no final state. Probably unreachable..."; None
in
let _ = match from_opt with
| None -> ()
| Some froms ->
let in_state =
match last_state with Some s -> s | None -> assert false in
let state = in_state in
let process_out out (default, from_out) state =
add_from pdg in_state state out (default, from_out)
in
let from_table = froms.Function_Froms.deps_table in
let new_state =
try Lmap_bitwise.From_Model.fold process_out from_table state
with Lmap_bitwise.From_Model.Cannot_fold ->
process_out Locations.Zone.top (false, Locations.Zone.top) state
in
let new_state =
if (not (Kernel_function.returns_void pdg.fct)) then
let from0 = froms.Function_Froms.deps_return in
let _ = create_fun_output_node pdg (Some new_state)
(Lmap_bitwise.From_Model.LOffset.collapse from0)
in new_state
else new_state
in
store_last_state pdg new_state
in
let init_state = process_other_inputs pdg in
store_init_state pdg init_state;
add_ctrl_dpds pdg ;
P.debug ~level:2 "finalize_pdg ok";
let states = get_states pdg in
let pdg = PdgTypes.Pdg.make pdg.fct pdg.graph states pdg.index
in
pdg