1 cananian 1.1.2.6 // DataFlowBasicBlockVisitor.java, created Wed Mar 10 9:00:53 1999 by jwhaley 2 cananian 1.1.2.12 // Copyright (C) 1998 John Whaley <jwhaley@alum.mit.edu> 3 cananian 1.1.2.5 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 jwhaley 1.1.2.1 package harpoon.Analysis.DataFlow; 5 jwhaley 1.1.2.1 6 pnkfelix 1.1.2.7 import harpoon.Analysis.BasicBlock; 7 salcianu 1.1.2.14 import harpoon.Analysis.BasicBlockInterf; 8 jwhaley 1.1.2.1 import java.util.Enumeration; 9 cananian 1.6 import net.cscott.jutil.WorkSet; 10 salcianu 1.1.2.14 11 salcianu 1.1.2.14 import harpoon.Util.Util; 12 salcianu 1.1.2.14 13 jwhaley 1.1.2.1 /** 14 pnkfelix 1.1.2.2 * <code>DataFlowBasicBlockVisitor</code> is a specialized 15 pnkfelix 1.1.2.8 * <code>BasicBlockVisitor</code> for performing data flow analysis on 16 pnkfelix 1.1.2.2 * a set of <code>BasicBlock</code>. 17 jwhaley 1.1.2.1 * 18 cananian 1.1.2.12 * @author John Whaley <jwhaley@alum.mit.edu> 19 cananian 1.6 * @version $Id: DataFlowBasicBlockVisitor.java,v 1.6 2004/02/08 01:51:05 cananian Exp $ 20 jwhaley 1.1.2.1 */ 21 jwhaley 1.1.2.1 22 salcianu 1.1.2.14 public abstract class DataFlowBasicBlockVisitor extends harpoon.Analysis.BasicBlockInterfVisitor { 23 jwhaley 1.1.2.1 24 pnkfelix 1.1.2.4 private static boolean DEBUG = false; 25 pnkfelix 1.1.2.2 public static void db(String s) { System.out.println(s); } 26 pnkfelix 1.1.2.11 27 pnkfelix 1.1.2.2 /** 28 pnkfelix 1.1.2.2 * Adds the successors of the basic block q to the worklist W, 29 pnkfelix 1.1.2.2 * performing merge operations if necessary. 30 pnkfelix 1.1.2.2 */ 31 cananian 1.6 public abstract void addSuccessors(WorkSet W, BasicBlockInterf q); 32 pnkfelix 1.1.2.2 33 pnkfelix 1.1.2.2 /** 34 pnkfelix 1.1.2.3 Merges operation on the from and to basic block. Returns true if 35 pnkfelix 1.1.2.3 the to basic block changes. 36 pnkfelix 1.1.2.3 37 pnkfelix 1.1.2.3 <BR> <B>NOTE:</B> "changes" above refers to our knowledge about 38 pnkfelix 1.1.2.9 the basic block changing, not the contents of the basic 39 pnkfelix 1.1.2.9 block itself, which shouldn't be modified during Analysis. 40 pnkfelix 1.1.2.9 Thus, an appropriate "change" would be a variable being 41 pnkfelix 1.1.2.9 added to the IN-set of 'to' during Forward Dataflow 42 pnkfelix 1.1.2.9 Analysis. 43 pnkfelix 1.1.2.3 44 pnkfelix 1.1.2.3 */ 45 salcianu 1.4 public abstract boolean merge(BasicBlockInterf from, BasicBlockInterf to); 46 pnkfelix 1.1.2.2 47 pnkfelix 1.1.2.2 48 pnkfelix 1.1.2.3 /** Performs some transfer function on a basic block b. 49 pnkfelix 1.1.2.2 <BR> <B>NOTE:</B> Transfer functions must be monotonic for 50 pnkfelix 1.1.2.2 dataflow analysis to terminate. 51 pnkfelix 1.1.2.2 */ 52 pnkfelix 1.1.2.2 public abstract void visit(BasicBlock b); 53 salcianu 1.1.2.14 54 salcianu 1.4 /** Performs some transfer function on a basic block b. 55 salcianu 1.4 <BR> <B>NOTE:</B> Transfer functions must be monotonic for 56 salcianu 1.4 dataflow analysis to terminate. 57 salcianu 1.4 */ 58 salcianu 1.1.2.14 public void visit(BasicBlockInterf b) { 59 cananian 1.3.2.1 assert false : "Unexpected BasicBlockInterf subclass"; 60 salcianu 1.1.2.14 } 61 jwhaley 1.1.2.1 } 62 cananian 1.2