000001| (** Overall analysis lattice *)
000002|
000003| module LabelMap = Map.Make(struct type t = int
000004| let compare i i' = (*[123593]*)i - i' end)
000005|
000006| type elem = Statelattice.elem LabelMap.t
000007|
000008| (* leq : elem -> elem -> bool *)
000009| let leq st0 st1 =
000010| (*[651]*)LabelMap.fold (fun lab obj acc ->
000011| (*[7356]*)let obj' = try (*[7356]*)LabelMap.find lab st1
000012| with Not_found -> (*[1289]*)Statelattice.bot
000013| in (*[7356]*)acc && (*[4768]*)Statelattice.leq obj obj') st0 true
000014|
000015| (* eq : elem -> elem -> bool *)
000016| let eq = (*[1]*)LabelMap.equal (Statelattice.eq)
000017|
000018| (* join : elem -> elem -> elem *)
000019| let join st0 st1 = (*[2394]*)LabelMap.merge (fun lab obj0 obj1 -> match obj0,obj1 with
000020| | None,_ -> (*[18]*)obj1
000021| | _,None -> (*[55]*)obj0
000022| | Some obj0,Some obj1 -> (*[52486]*)Some (Statelattice.join obj0 obj1)) st0 st1
000023|
000024| (* meet : elem -> elem -> elem *)
000029|
000030| (* bot : elem *)
000031| let bot = (*[1]*)LabelMap.empty
000032|
000033|
000034| (** {3 Lattice operations } *)
000035|
000036| (* init : elem *)
000037| let init = (*[1]*)LabelMap.empty
000038|
000039| (* lookup : elem -> label -> Statelattice.elem *)
000040| let lookup lat lab =
000041| (*[8937]*)try (*[8937]*)LabelMap.find lab lat
000042| with Not_found -> (*[1268]*)Statelattice.bot
000043|
000044| (* add : elem -> label -> Statelattice.elem -> elem *)
000045| let add lat lab sl =
000046| (*[4587]*)LabelMap.add lab sl lat
000047|
000048|
000049| (** {2 Pretty printing} *)
000050|
000051| (* pprint : elem -> unit *)
000052| let pprint alat =
000053| begin
000054| Format.printf "{ @[<v 0>";
000055| ignore (LabelMap.fold (fun lab slat first ->
000056| begin
000057| (if first then () else Format.print_space ());
000058| Format.printf "%-is -> " lab;
000059| Statelattice.pprint slat;
000060| false
000061| end) alat true);
000062| Format.printf "@] }";
000063| end
000064|
000065| (* to_string : elem -> string *)
000066| let to_string alat =
000067| let buf = Buffer.create 512 in
000068| let out,flush = Format.get_formatter_output_functions () in (* save previous outputters *)
000069| begin
000070| Format.set_formatter_output_functions (Buffer.add_substring buf) (fun () -> ());
000071| pprint alat;
000072| Format.print_flush ();
000073| Format.set_formatter_output_functions out flush; (* restore previous outputters *)
000074| Buffer.contents buf
000075| end