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 }