You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

36 lines
1.3 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
open Graph
module L = Logging
module CFG = ProcCfg.Normal
(* Use ocamlgraph's dominators functor to get the dominators *)
module GDoms = Dominator.Make (ProcCfg.MakeOcamlGraph (CFG))
let print_dominators cfg idom =
L.(debug Analysis Medium) "@\n ----- **** Dominators TABLE **** -------@\n" ;
Procdesc.get_nodes cfg
|> List.iter ~f:(fun n ->
L.(debug Analysis Medium) "@\n Node: %a Dominators:\n" Procdesc.Node.pp n ;
List.iter
~f:(L.(debug Analysis Medium) "%a;" Procdesc.Node.pp)
(GDoms.idom_to_dominators idom n) )
(* Computes the dominator tree, using ocamlgraph's Lengauer-Tarjan algorithm.
[compute_idom cfg node] returns a function [idom : Procdesc.Node.t -> Procdesc.Node.t] s.t.
[idom n] returns the immediate dominator of [n]. *)
let get_idoms pdesc =
let idom = GDoms.compute_idom pdesc (ProcCfg.Normal.start_node pdesc) in
print_dominators pdesc idom ;
idom
(* make each node to be dominated by itself, i.e reflexive, unlike ocamlgraph *)
let dominates idom x y = GDoms.idom_to_dom idom x y || Procdesc.Node.equal x y