let internal_function_behaviors cfg =
let def_annot_bhv = HdefAnnotBhv.create 42 in
let get_stmt_bhv node stmt acc =
let add_bhv_info acc b =
if b.b_name = Cil.default_behavior_name then
begin
let _, int_edges = Cil2cfg.get_internal_edges cfg node in
let n = Cil2cfg.Eset.cardinal int_edges in
let reg e =
try
let (_old_s, old_n) = HdefAnnotBhv.find def_annot_bhv e in
if n < old_n then
raise Not_found
with Not_found ->
HdefAnnotBhv.replace def_annot_bhv e (stmt, n)
in
Cil2cfg.Eset.iter reg int_edges
end;
(node, stmt, b.b_name)::acc
in
let spec_bhv_names acc annot = match annot with
| {annot_content = AStmtSpec spec} ->
List.fold_left add_bhv_info acc spec.spec_behavior
| _ -> Wp_parameters.fatal "filter on is_contract didn't work ?"
in
let annots = Annotations.get_filter Logic_utils.is_contract stmt in
let annots = List.map Annotations.get_code_annotation annots in
List.fold_left spec_bhv_names acc annots
in
let get_bhv n ((seen_stmts, bhvs) as l) =
match Cil2cfg.start_stmt_of_node n with None -> l
| Some s ->
if List.mem s.sid seen_stmts then l
else
let seen_stmts = s.sid::seen_stmts in
let bhvs = get_stmt_bhv n s bhvs in
(seen_stmts, bhvs)
in
let _, bhvs = Cil2cfg.fold_nodes get_bhv cfg ([], []) in
bhvs, def_annot_bhv