1 vivien 1.1.2.1 // ODParIntGraphPair.java, created Mon Mar 27 20:11:14 2000 by salcianu 2 cananian 1.1.2.2 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu> 3 vivien 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 vivien 1.1.2.1 package harpoon.Analysis.PointerAnalysis; 5 vivien 1.1.2.1 6 vivien 1.1.2.1 /** 7 vivien 1.1.2.1 * <code>ODParIntGraphPair</code> is a simple pair of two 8 vivien 1.1.2.1 <code>ODParIntGraph</code>s. 9 vivien 1.1.2.1 10 vivien 1.1.2.1 The existence of this structure is motivated by some details 11 vivien 1.1.2.1 of the FLEX intermediate representation. 12 vivien 1.1.2.1 13 vivien 1.1.2.1 In the original algorithm, a single parallel interaction graph 14 vivien 1.1.2.1 at the end of each BB was enough. However, as in FLEX CALL is 15 vivien 1.1.2.1 an implicit if, with a branch for normal execution and another 16 vivien 1.1.2.1 one for exceptions, there could be two ways of finishing a BB, 17 vivien 1.1.2.1 and hence, we need to maintain two graphs. 18 vivien 1.1.2.1 19 vivien 1.1.2.1 * 20 cananian 1.1.2.2 * @author Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu> 21 cananian 1.2 * @version $Id: ODParIntGraphPair.java,v 1.2 2002/02/25 20:58:40 cananian Exp $ 22 vivien 1.1.2.1 */ 23 vivien 1.1.2.1 class ODParIntGraphPair { 24 vivien 1.1.2.1 25 vivien 1.1.2.1 // Normally, pig0 is enough; if the BB is terminated with a CALL 26 vivien 1.1.2.1 // pig0 is the graph for normal return from the call, and 27 vivien 1.1.2.1 // pig1 is the graph in case an exception is returned 28 vivien 1.1.2.1 ODParIntGraph pig[] = new ODParIntGraph[2]; 29 vivien 1.1.2.1 30 vivien 1.1.2.1 /** Creates a <code>ODParIntGraphPair</code>. */ 31 vivien 1.1.2.1 ODParIntGraphPair(ODParIntGraph _pig0, ODParIntGraph _pig1) { 32 vivien 1.1.2.1 this.pig[0] = _pig0; 33 vivien 1.1.2.1 this.pig[1] = _pig1; 34 vivien 1.1.2.1 } 35 vivien 1.1.2.1 36 vivien 1.1.2.1 /** Checks whether two pairs are equal or not. */ 37 vivien 1.1.2.1 static boolean identical(ODParIntGraphPair pp1, ODParIntGraphPair pp2){ 38 vivien 1.1.2.1 if((pp1 == null) || (pp2 == null)) 39 vivien 1.1.2.1 return pp1 == pp2; 40 vivien 1.1.2.1 return 41 vivien 1.1.2.1 ODParIntGraph.identical(pp1.pig[0], pp2.pig[0]) && 42 vivien 1.1.2.1 ODParIntGraph.identical(pp1.pig[1], pp2.pig[1]); 43 vivien 1.1.2.1 } 44 vivien 1.1.2.1 45 vivien 1.1.2.1 /** Join another pair of <code>ODParIntGraph</code>s to this one. 46 vivien 1.1.2.1 The operation is done pairwise. This method is called only by 47 vivien 1.1.2.1 the <code>InterProcPA</code> module. */ 48 vivien 1.1.2.1 void join(ODParIntGraphPair pp2){ 49 vivien 1.1.2.1 if(pp2 == null) return; 50 vivien 1.1.2.1 partial_join(0, pp2.pig[0]); 51 vivien 1.1.2.1 partial_join(1, pp2.pig[1]); 52 vivien 1.1.2.1 } 53 vivien 1.1.2.1 54 vivien 1.1.2.1 void join(ODParIntGraphPair pp2, boolean type){ 55 vivien 1.1.2.1 if(pp2 == null) return; 56 vivien 1.1.2.1 partial_join(0, pp2.pig[0]); 57 vivien 1.1.2.1 if(type) 58 vivien 1.1.2.1 partial_join(1, pp2.pig[1]); 59 vivien 1.1.2.1 } 60 vivien 1.1.2.1 61 vivien 1.1.2.1 private void partial_join(int k, ODParIntGraph pig2) { 62 vivien 1.1.2.1 if(pig2 == null) 63 vivien 1.1.2.1 return; 64 vivien 1.1.2.1 65 vivien 1.1.2.1 if(pig[k] == null) 66 vivien 1.1.2.1 pig[k] = (ODParIntGraph) pig2.clone(); 67 vivien 1.1.2.1 68 vivien 1.1.2.1 pig[k].join(pig2); 69 vivien 1.1.2.1 } 70 vivien 1.1.2.1 71 vivien 1.1.2.1 } 72 cananian 1.2