1 salcianu 1.1 // SSICallGraph.java, created Mon Apr 8 22:51:08 2002 by salcianu 2 salcianu 1.1 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@MIT.EDU> 3 salcianu 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 salcianu 1.1 package harpoon.Analysis.Quads; 5 salcianu 1.1 6 salcianu 1.1 import java.util.Set; 7 salcianu 1.1 import java.util.Vector; 8 salcianu 1.1 import java.util.Iterator; 9 salcianu 1.1 import java.util.Map; 10 salcianu 1.1 import java.util.HashMap; 11 salcianu 1.3 import java.util.List; 12 salcianu 1.1 13 salcianu 1.1 import harpoon.ClassFile.HMethod; 14 salcianu 1.1 import harpoon.ClassFile.HCodeFactory; 15 salcianu 1.1 import harpoon.ClassFile.HCode; 16 salcianu 1.1 17 salcianu 1.1 import harpoon.Analysis.ClassHierarchy; 18 salcianu 1.1 import harpoon.Analysis.ReachingDefs; 19 salcianu 1.1 import harpoon.Analysis.SSxReachingDefsImpl; 20 salcianu 1.1 import harpoon.Analysis.Quads.SCC.SCCAnalysis; 21 salcianu 1.1 import harpoon.Analysis.Maps.ExactTypeMap; 22 salcianu 1.1 import harpoon.Analysis.Quads.TypeInfo; 23 salcianu 1.1 import harpoon.IR.Quads.Code; 24 salcianu 1.1 25 salcianu 1.1 import harpoon.IR.Quads.CALL; 26 cananian 1.2 import harpoon.IR.Quads.Code; 27 salcianu 1.1 import harpoon.IR.Quads.Quad; 28 salcianu 1.1 import harpoon.IR.Quads.QuadKind; 29 salcianu 1.1 import harpoon.IR.Quads.QuadSSI; 30 salcianu 1.1 31 salcianu 1.1 import harpoon.Util.Util; 32 salcianu 1.1 33 salcianu 1.1 import harpoon.Analysis.PointerAnalysis.Debug; 34 salcianu 1.1 35 salcianu 1.1 /** 36 salcianu 1.1 * <code>SSICallGraph</code> 37 salcianu 1.1 * 38 salcianu 1.1 * @author Alexandru SALCIANU <salcianu@MIT.EDU> 39 salcianu 1.4 * @version $Id: SSICallGraph.java,v 1.4 2002/04/11 18:53:50 salcianu Exp $ 40 salcianu 1.1 */ 41 salcianu 1.3 public class SSICallGraph extends AbstrCallGraph { 42 salcianu 1.1 43 salcianu 1.1 private CallGraphImpl2 cg; 44 salcianu 1.1 private ClassHierarchy ch; 45 salcianu 1.1 46 salcianu 1.1 /** Creates a <code>SSICallGraph</code>. */ 47 salcianu 1.1 public SSICallGraph(ClassHierarchy ch, HCodeFactory hcf) { 48 salcianu 1.1 assert hcf.getCodeName().equals(QuadSSI.codename) : 49 salcianu 1.1 "works only with an SSI code factory"; 50 salcianu 1.1 this.ch = ch; 51 salcianu 1.1 this.hcf = hcf; 52 salcianu 1.1 cg = new CallGraphImpl2(ch, hcf); 53 salcianu 1.1 } 54 salcianu 1.1 55 salcianu 1.1 public HMethod[] calls(final HMethod hm) { 56 salcianu 1.1 return cg.calls(hm); 57 salcianu 1.1 } 58 salcianu 1.1 59 salcianu 1.1 60 salcianu 1.1 public HMethod[] calls(final HMethod hm, final CALL cs) { 61 salcianu 1.1 return calls(cs); 62 salcianu 1.1 } 63 salcianu 1.1 64 salcianu 1.1 65 salcianu 1.1 public HMethod[] calls(final CALL cs) { 66 salcianu 1.1 HMethod[] retval = (HMethod[]) cs2callees.get(cs); 67 salcianu 1.1 if(retval != null) 68 salcianu 1.1 return retval; 69 salcianu 1.1 70 salcianu 1.1 // For efficiency reasons, we compute the callees for all call 71 salcianu 1.1 // sites; this way we construct the auxiliary objects 72 salcianu 1.1 // "ReachingDefs rd" and "ExactTypeMap etm" once for each 73 salcianu 1.1 // method. 74 cananian 1.2 Code hcode = cs.getFactory().getParent(); 75 salcianu 1.1 ReachingDefs rd = new SSxReachingDefsImpl(hcode); 76 cananian 1.2 ExactTypeMap etm = new TypeInfo(hcode); 77 salcianu 1.1 78 salcianu 1.3 List<Quad> calls = hcode.selectCALLs(); 79 salcianu 1.3 for(Iterator<Quad> it = calls.iterator(); it.hasNext(); ) { 80 salcianu 1.3 CALL call = (CALL) it.next(); 81 salcianu 1.3 cs2callees.put(call, cg.calls(call, rd, etm)); 82 salcianu 1.3 } 83 salcianu 1.1 84 salcianu 1.1 return (HMethod[]) cs2callees.get(cs); 85 salcianu 1.1 } 86 salcianu 1.1 private Map cs2callees = new HashMap(); 87 salcianu 1.1 88 salcianu 1.1 89 salcianu 1.1 public Set callableMethods() { 90 salcianu 1.1 return ch.callableMethods(); 91 salcianu 1.1 } 92 salcianu 1.1 93 salcianu 1.1 }