1 cananian 1.1.2.6 // ForwardDataFlowBasicBlockVisitor.java, created Wed Mar 10 9:00:53 1999 by jwhaley 2 cananian 1.1.2.9 // 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 salcianu 1.4 import harpoon.Analysis.BasicBlockInterf; 7 salcianu 1.4 import java.util.Iterator; 8 cananian 1.5 import net.cscott.jutil.WorkSet; 9 pnkfelix 1.1.2.3 10 jwhaley 1.1.2.1 /** 11 jwhaley 1.1.2.1 * ForwardDataFlowBasicBlockVisitor 12 jwhaley 1.1.2.1 * 13 cananian 1.1.2.9 * @author John Whaley <jwhaley@alum.mit.edu> 14 cananian 1.6 * @version $Id: ForwardDataFlowBasicBlockVisitor.java,v 1.6 2004/02/08 03:19:21 cananian Exp $ 15 jwhaley 1.1.2.1 */ 16 jwhaley 1.1.2.1 17 jwhaley 1.1.2.1 public abstract class ForwardDataFlowBasicBlockVisitor extends DataFlowBasicBlockVisitor { 18 pnkfelix 1.1.2.4 19 pnkfelix 1.1.2.4 private static final boolean DEBUG = false; 20 jwhaley 1.1.2.1 21 pnkfelix 1.1.2.8 /** Performs the <i>merge</i> operation between <code>q</code> and 22 pnkfelix 1.1.2.8 its successors, readding <code>BasicBlock</code>s to 23 pnkfelix 1.1.2.8 <code>W</code> where necessary. 24 pnkfelix 1.1.2.8 <BR> <B>effects:</B> Runs <code>merge(q, s)</code> for all 25 pnkfelix 1.1.2.8 <code>s</code> element of Successors(<code>q</code>). 26 pnkfelix 1.1.2.8 If the <code>merge(q, s)</code> operation returns 27 pnkfelix 1.1.2.8 <code>true</code> for a given <code>s</code>, adds 28 pnkfelix 1.1.2.8 <code>s</code> to <code>W</code>, indicating that 29 pnkfelix 1.1.2.8 <code>s</code> must be revisited by <code>this</code>. 30 cananian 1.3 @see #merge(BasicBlock, BasicBlock) 31 pnkfelix 1.1.2.2 */ 32 cananian 1.5 public void addSuccessors(WorkSet W, BasicBlockInterf q) { 33 salcianu 1.4 if (DEBUG) db("adding successors of " + q + " to worklist"); 34 pnkfelix 1.1.2.2 35 cananian 1.6 for (Object qnO : q.nextSet()) { 36 cananian 1.6 BasicBlockInterf qn = (BasicBlockInterf) qnO; 37 pnkfelix 1.1.2.2 38 salcianu 1.4 if (DEBUG) db("looking at " + q + " -> " + qn); 39 salcianu 1.4 40 salcianu 1.4 if (merge(q, qn)) { 41 salcianu 1.4 42 salcianu 1.4 if (DEBUG) db("added " + qn + " to the work queue"); 43 salcianu 1.4 44 cananian 1.5 W.add(qn); // in set changed -- need to revisit target node 45 salcianu 1.4 } 46 jwhaley 1.1.2.1 } 47 jwhaley 1.1.2.1 } 48 jwhaley 1.1.2.1 49 jwhaley 1.1.2.1 } 50 cananian 1.2