1 package Analysis.Pointer;
3 import Analysis.Pointer.AllocFactory.AllocNode;
4 import Analysis.Pointer.BasicBlock.BBlock;
8 HashMap<AllocNode, MySet<Edge>> heapedgeremove;
9 HashMap<AllocNode, MySet<Edge>> heapedgeadd;
10 HashMap<TempDescriptor, MySet<Edge>> varedgeadd;
11 HashMap<TempDescriptor, MySet<Edge>> varedgeremove;
12 HashMap<AllocNode, MySet<Edge>> baseheapedge;
13 HashMap<TempDescriptor, MySet<Edge>> basevaredge;
14 HashSet<AllocNode> baseNodeAges;
15 HashSet<AllocNode> addNodeAges;
16 HashMap<AllocNode, Boolean> baseOldNodes;
17 HashMap<AllocNode, Boolean> addOldNodes;
19 public Delta check() {
20 for(Map.Entry<AllocNode, MySet<Edge>> entry:heapedgeadd.entrySet()) {
21 AllocNode node=entry.getKey();
22 for(Edge e:entry.getValue())
24 throw new Error(e.src+" is not equal to "+node);
34 /* Init is set for false for delta propagations inside of one basic block.
37 public Delta(PPoint block, boolean init) {
39 this.baseheapedge=new HashMap<AllocNode, MySet<Edge>>();
40 this.basevaredge=new HashMap<TempDescriptor, MySet<Edge>>();
41 this.heapedgeadd=new HashMap<AllocNode, MySet<Edge>>();
42 this.heapedgeremove=new HashMap<AllocNode, MySet<Edge>>();
43 this.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
44 this.varedgeremove=new HashMap<TempDescriptor, MySet<Edge>>();
45 this.baseNodeAges=new HashSet<AllocNode>();
46 this.addNodeAges=new HashSet<AllocNode>();
47 this.baseOldNodes=new HashMap<AllocNode, Boolean>();
48 this.addOldNodes=new HashMap<AllocNode, Boolean>();
55 public PPoint getBlock() {
59 public void setBlock(PPoint block) {
63 public Delta changeParams(HashMap<TempDescriptor, TempDescriptor> tmpMap, PPoint bblock) {
64 Delta newdelta=new Delta();
65 newdelta.baseheapedge=baseheapedge;
66 newdelta.basevaredge=basevaredge;
67 newdelta.heapedgeadd=heapedgeadd;
68 newdelta.heapedgeremove=heapedgeremove;
69 //Update variable edge mappings
70 newdelta.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
71 for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varedgeadd.entrySet()) {
72 varedgeadd.put(tmpMap.get(entry.getKey()), entry.getValue());
74 newdelta.varedgeremove=varedgeremove;
75 newdelta.addNodeAges=addNodeAges;
76 newdelta.baseNodeAges=baseNodeAges;
77 newdelta.addOldNodes=addOldNodes;
78 newdelta.baseOldNodes=baseOldNodes;
79 newdelta.block=bblock;
83 public Delta buildBase(MySet<Edge> edges) {
84 Delta newdelta=new Delta();
85 newdelta.baseheapedge=baseheapedge;
86 newdelta.basevaredge=basevaredge;
87 newdelta.heapedgeadd=heapedgeadd;
88 newdelta.heapedgeremove=heapedgeremove;
89 newdelta.varedgeadd=varedgeadd;
90 newdelta.addNodeAges=addNodeAges;
91 newdelta.baseNodeAges=baseNodeAges;
92 newdelta.addOldNodes=addOldNodes;
93 newdelta.baseOldNodes=baseOldNodes;
96 if (!newdelta.varedgeadd.containsKey(e.srcvar)) {
97 newdelta.varedgeadd.put(e.srcvar, new MySet<Edge>());
99 newdelta.varedgeadd.get(e.srcvar).add(e);
101 if (!newdelta.heapedgeadd.containsKey(e.src)) {
102 newdelta.heapedgeadd.put(e.src, new MySet<Edge>());
104 newdelta.heapedgeadd.get(e.src).add(e);
110 public Delta diffBlock(PPoint bblock) {
111 Delta newdelta=new Delta();
112 newdelta.baseheapedge=baseheapedge;
113 newdelta.basevaredge=basevaredge;
114 newdelta.heapedgeadd=heapedgeadd;
115 newdelta.heapedgeremove=heapedgeremove;
116 newdelta.varedgeadd=varedgeadd;
117 newdelta.varedgeremove=varedgeremove;
118 newdelta.block=bblock;
119 newdelta.addNodeAges=addNodeAges;
120 newdelta.baseNodeAges=baseNodeAges;
121 newdelta.addOldNodes=addOldNodes;
122 newdelta.baseOldNodes=baseOldNodes;
126 public boolean getInit() {
130 public void addEdge(Edge e) {
138 public void addHeapEdge(Edge e) {
139 if (!heapedgeadd.containsKey(e.src))
140 heapedgeadd.put(e.src, new MySet<Edge>(e));
142 heapedgeadd.get(e.src).add(e);
145 public void addVarEdge(Edge e) {
146 if (!varedgeadd.containsKey(e.srcvar))
147 varedgeadd.put(e.srcvar, new MySet<Edge>(e));
149 varedgeadd.get(e.srcvar).add(e);
152 public void removeEdge(Edge e) {
160 public void removeHeapEdge(Edge e) {
161 if (heapedgeadd.containsKey(e.src)&&heapedgeadd.get(e.src).contains(e))
162 heapedgeadd.get(e.src).remove(e);
163 if (!heapedgeremove.containsKey(e.src))
164 heapedgeremove.put(e.src, new MySet<Edge>(e));
166 heapedgeremove.get(e.src).add(e);
170 public void removeVarEdge(Edge e) {
171 if (varedgeadd.containsKey(e.src)&&varedgeadd.get(e.src).contains(e))
172 varedgeadd.get(e.src).remove(e);
173 if (!varedgeremove.containsKey(e.srcvar))
174 varedgeremove.put(e.srcvar, new MySet<Edge>(e));
176 varedgeremove.get(e.srcvar).add(e);
179 public void setInit(boolean init) {