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();
23 throw new Error("null node key");
24 for(Edge e : entry.getValue())
26 throw new Error(e.src+" is not equal to "+node);
29 for(Map.Entry<TempDescriptor, MySet<Edge>> entry : varedgeadd.entrySet()) {
30 TempDescriptor tmp=entry.getKey();
32 throw new Error("null temp key");
33 for(Edge e : entry.getValue())
35 throw new Error(e.srcvar+" is not equal to "+tmp);
44 /* Init is set for false for delta propagations inside of one basic block.
47 public Delta(PPoint block, boolean init) {
49 this.baseheapedge=new HashMap<AllocNode, MySet<Edge>>();
50 this.basevaredge=new HashMap<TempDescriptor, MySet<Edge>>();
51 this.heapedgeadd=new HashMap<AllocNode, MySet<Edge>>();
52 this.heapedgeremove=new HashMap<AllocNode, MySet<Edge>>();
53 this.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
54 this.varedgeremove=new HashMap<TempDescriptor, MySet<Edge>>();
55 this.baseNodeAges=new HashSet<AllocNode>();
56 this.addNodeAges=new HashSet<AllocNode>();
57 this.baseOldNodes=new HashMap<AllocNode, Boolean>();
58 this.addOldNodes=new HashMap<AllocNode, Boolean>();
62 public boolean isEmpty() {
63 return baseheapedge.isEmpty()&&basevaredge.isEmpty()&&heapedgeadd.isEmpty()&&heapedgeremove.isEmpty()&&varedgeadd.isEmpty()&&(varedgeremove==null||varedgeremove.isEmpty())&&baseNodeAges.isEmpty()&&addNodeAges.isEmpty()&&baseOldNodes.isEmpty()&&addOldNodes.isEmpty();
67 System.out.println("----------------------------------------------");
68 System.out.println("init:"+init);
69 System.out.println("baseheapedge:"+baseheapedge);
70 System.out.println("basevaredge:"+basevaredge);
71 System.out.println("heapedgeadd:"+heapedgeadd);
72 System.out.println("heapedgeremove:"+heapedgeremove);
73 System.out.println("varedgeadd:"+varedgeadd);
74 if (varedgeremove==null)
75 System.out.println("varedgeremove: null");
77 System.out.println("varedgeremove:"+varedgeremove);
78 System.out.println("baseNodeAges:"+baseNodeAges);
79 System.out.println("addNodeAges:"+addNodeAges);
80 System.out.println("baseOldNodes:"+baseOldNodes);
81 System.out.println("addOldNodes:"+addOldNodes);
87 public PPoint getBlock() {
91 public void setBlock(PPoint block) {
95 public Delta changeParams(HashMap<TempDescriptor, TempDescriptor> tmpMap, PPoint bblock) {
96 Delta newdelta=new Delta();
97 newdelta.baseheapedge=baseheapedge;
98 newdelta.basevaredge=basevaredge;
99 newdelta.heapedgeadd=heapedgeadd;
100 newdelta.heapedgeremove=heapedgeremove;
101 //Update variable edge mappings
102 newdelta.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
103 for(Map.Entry<TempDescriptor, MySet<Edge>> entry : varedgeadd.entrySet()) {
104 TempDescriptor origTmp=entry.getKey();
105 TempDescriptor newTmp=tmpMap.get(entry.getKey());
106 MySet<Edge> edgeset=entry.getValue();
107 if (!edgeset.isEmpty()) {
108 newdelta.varedgeadd.put(newTmp, new MySet<Edge>());
109 for(Edge e : edgeset) {
110 newdelta.varedgeadd.get(newTmp).add(e.rewrite(origTmp, newTmp));
114 newdelta.varedgeremove=varedgeremove;
115 newdelta.addNodeAges=addNodeAges;
116 newdelta.baseNodeAges=baseNodeAges;
117 newdelta.addOldNodes=addOldNodes;
118 newdelta.baseOldNodes=baseOldNodes;
119 newdelta.block=bblock;
123 public Delta buildBase(MySet<Edge> edges) {
124 Delta newdelta=new Delta();
125 newdelta.baseheapedge=baseheapedge;
126 newdelta.basevaredge=basevaredge;
127 newdelta.heapedgeremove=heapedgeremove;
128 newdelta.heapedgeadd=new HashMap<AllocNode, MySet<Edge>>();
129 newdelta.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
130 newdelta.addNodeAges=addNodeAges;
131 newdelta.baseNodeAges=baseNodeAges;
132 newdelta.addOldNodes=addOldNodes;
133 newdelta.baseOldNodes=baseOldNodes;
135 for (Map.Entry<AllocNode, MySet<Edge>> entry : heapedgeadd.entrySet()) {
136 newdelta.heapedgeadd.put(entry.getKey(), new MySet<Edge>(entry.getValue()));
139 for (Map.Entry<TempDescriptor, MySet<Edge>> entry : varedgeadd.entrySet()) {
140 newdelta.varedgeadd.put(entry.getKey(), new MySet<Edge>(entry.getValue()));
144 for(Edge e : edges) {
145 if (e.srcvar!=null) {
146 if (!newdelta.varedgeadd.containsKey(e.srcvar)) {
147 newdelta.varedgeadd.put(e.srcvar, new MySet<Edge>());
149 newdelta.varedgeadd.get(e.srcvar).add(e);
151 if (!newdelta.heapedgeadd.containsKey(e.src)) {
152 newdelta.heapedgeadd.put(e.src, new MySet<Edge>());
154 newdelta.heapedgeadd.get(e.src).add(e.makeOld());
160 public Delta diffBlock(PPoint bblock) {
161 Delta newdelta=new Delta();
162 newdelta.baseheapedge=baseheapedge;
163 newdelta.basevaredge=basevaredge;
164 newdelta.heapedgeadd=heapedgeadd;
165 newdelta.heapedgeremove=heapedgeremove;
166 newdelta.varedgeadd=varedgeadd;
167 newdelta.varedgeremove=varedgeremove;
168 newdelta.block=bblock;
169 newdelta.addNodeAges=addNodeAges;
170 newdelta.baseNodeAges=baseNodeAges;
171 newdelta.addOldNodes=addOldNodes;
172 newdelta.baseOldNodes=baseOldNodes;
176 public boolean getInit() {
180 public void addEdge(Edge e) {
188 public void addHeapEdge(Edge e) {
189 if (!heapedgeadd.containsKey(e.src))
190 heapedgeadd.put(e.src, new MySet<Edge>(e));
192 Edge.mergeEdgeInto(heapedgeadd.get(e.src), e);
195 public void addVarEdge(Edge e) {
196 if (!varedgeadd.containsKey(e.srcvar)) {
197 varedgeadd.put(e.srcvar, new MySet<Edge>(e));
199 Edge.mergeEdgeInto(varedgeadd.get(e.srcvar), e);
203 public void addEdgeClear(Edge e) {
211 public void addHeapEdgeClear(Edge e) {
212 if (heapedgeremove.containsKey(e.src))
213 heapedgeremove.get(e.src).remove(e);
216 public void addVarEdgeClear(Edge e) {
217 if (varedgeremove.containsKey(e.srcvar))
218 varedgeremove.get(e.srcvar).remove(e);
221 public void removeEdges(MySet<Edge> eset) {
227 public void removeEdge(Edge e) {
235 public void removeHeapEdge(Edge e) {
236 if (heapedgeadd.containsKey(e.src)&&heapedgeadd.get(e.src).contains(e))
237 heapedgeadd.get(e.src).remove(e);
238 if (!heapedgeremove.containsKey(e.src))
239 heapedgeremove.put(e.src, new MySet<Edge>(e));
241 heapedgeremove.get(e.src).add(e);
245 public void removeVarEdge(Edge e) {
246 if (varedgeadd.containsKey(e.srcvar)&&varedgeadd.get(e.srcvar).contains(e))
247 varedgeadd.get(e.srcvar).remove(e);
248 if (!varedgeremove.containsKey(e.srcvar))
249 varedgeremove.put(e.srcvar, new MySet<Edge>(e));
251 varedgeremove.get(e.srcvar).add(e);
254 public void setInit(boolean init) {