000001| (** Overall analysis lattice *)
000002|
000003| module LabelMap = Map.Make(struct type t = int
000004| let compare i i' = (*[1499631]*)i - i' end)
000005|
000006| type elem = Statelattice.elem LabelMap.t
000007|
000008| (* leq : elem -> elem -> bool *)
000009| let leq st0 st1 =
000010| (*[16000]*)LabelMap.fold (fun lab obj acc ->
000011| (*[71230]*)let obj' = try (*[71230]*)LabelMap.find lab st1
000013| in (*[71230]*)acc && (*[71230]*)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 = (*[13000]*)LabelMap.merge (fun lab obj0 obj1 -> match obj0,obj1 with
000020| | None,_ -> (*[62520]*)obj1
000021| | _,None -> (*[52081]*)obj0
000022| | Some obj0,Some obj1 -> (*[39166]*)Some (Statelattice.join obj0 obj1)) st0 st1
000023|
000024| (* meet : elem -> elem -> elem *)
000025| let meet st0 st1 = (*[13000]*)LabelMap.merge (fun lab obj0 obj1 -> match obj0,obj1 with
000026| | None,_ -> (*[60143]*)None
000027| | _,None -> (*[37895]*)None
000028| | Some obj0,Some obj1 -> (*[41332]*)Some (Statelattice.meet obj0 obj1)) st0 st1
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| (*[5000]*)try (*[5000]*)LabelMap.find lab lat
000042| with Not_found -> (*[4124]*)Statelattice.bot
000043|
000044| (* add : elem -> label -> Statelattice.elem -> elem *)
000045| let add lat lab sl =
000046| (*[8000]*)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