beginning of points-to analysis
[IRC.git] / Robust / src / Analysis / Pointer / Pointer.java
1 package Analysis.Pointer;
2 import java.util.*;
3 import IR.Flat.*;
4 import IR.*;
5 import Analysis.Pointer.BasicBlock.BBlock;
6 import Analysis.Pointer.AllocFactory.AllocNode;
7
8 public class Pointer {
9   HashMap<FlatMethod, BasicBlock> blockMap;
10   HashMap<FlatNode, Graph> graphMap;
11   State state;
12   TypeUtil typeUtil;
13   AllocFactory allocFactory;
14   LinkedList<Delta> toprocess;
15
16   public Pointer(State state, TypeUtil typeUtil) {
17     this.state=state;
18     this.blockMap=new HashMap<FlatMethod, BasicBlock>();
19     this.graphMap=new HashMap<FlatNode, Graph>();
20     this.typeUtil=typeUtil;
21     this.allocFactory=new AllocFactory(state, typeUtil);
22     this.toprocess=new LinkedList<Delta>();
23   }
24
25   public BasicBlock getBBlock(FlatMethod fm) {
26     if (!blockMap.containsKey(fm))
27       blockMap.put(fm, BasicBlock.getBBlock(fm));
28     return blockMap.get(fm);
29   }
30   
31   Delta buildInitialContext() {
32     MethodDescriptor md=typeUtil.getMain();
33     FlatMethod fm=state.getMethodFlat(md);
34     BasicBlock bb=getBBlock(fm);
35     BBlock start=bb.getStart();
36     Delta delta=new Delta(start, true);
37     delta.addHeapEdge(allocFactory.StringArray, new Edge(allocFactory.StringArray, null, allocFactory.Strings));
38     delta.addVarEdge(fm.getParameter(0), new Edge(fm.getParameter(0), allocFactory.StringArray));
39     return delta;
40   }
41
42   void doAnalysis() {
43     toprocess.add(buildInitialContext());
44
45     while(!toprocess.isEmpty()) {
46       Delta delta=toprocess.remove();
47       BBlock bblock=delta.getBlock();
48       Vector<FlatNode> nodes=bblock.nodes();
49       FlatNode firstNode=nodes.get(0);
50
51       //Get graph for first node
52       if (!graphMap.containsKey(firstNode)) {
53         graphMap.put(firstNode, new Graph(null));
54       }
55       Graph graph=graphMap.get(firstNode);
56
57       //First entrance is special...
58       if (delta.getInit()) {
59         applyInit(delta, graph);
60       } else {
61         applyDelta(delta, graph);
62       }
63       
64       Graph nodeGraph=null;
65       for(int i=1; i<nodes.size();i++) {
66         FlatNode currNode=nodes.get(i);
67         if (!graphMap.containsKey(currNode)) {
68           graphMap.put(currNode, new Graph(graph, nodeGraph));
69         }
70         nodeGraph=graphMap.get(currNode);
71
72         if (delta.getInit()) {
73           applyInitDiff(delta, nodeGraph);
74         } else {
75           applyDeltaDiff(delta, nodeGraph);       
76         }
77       }
78     }
79     
80   }
81 }