4e1143103e4ae10340f7855a92453d5496db44a1
[IRC.git] / Robust / src / Analysis / Pointer / Delta.java
1 package Analysis.Pointer;
2 import java.util.*;
3 import Analysis.Pointer.AllocFactory.AllocNode;
4 import Analysis.Pointer.BasicBlock.BBlock;
5 import IR.Flat.*;
6
7 public class Delta {
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
17   boolean init;
18   PPoint block;
19   boolean callStart;
20
21   /* Init is set for false for delta propagations inside of one basic block.
22    */
23   
24   public Delta(PPoint block, boolean init) {
25     this.init=init;
26     this.baseheapedge=new HashMap<AllocNode, MySet<Edge>>();
27     this.basevaredge=new HashMap<TempDescriptor, MySet<Edge>>();
28     this.heapedgeadd=new HashMap<AllocNode, MySet<Edge>>();
29     this.heapedgeremove=new HashMap<AllocNode, MySet<Edge>>();
30     this.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
31     this.varedgeremove=new HashMap<TempDescriptor, MySet<Edge>>();
32     this.baseNodeAges=new HashSet<AllocNode>();
33     this.addNodeAges=new HashSet<AllocNode>();
34     this.block=block;
35   }
36
37   private Delta() {
38   }
39
40   public PPoint getBlock() {
41     return block;
42   }
43
44   public void setBlock(PPoint block) {
45     this.block=block;
46   }
47
48   public Delta changeParams(HashMap<TempDescriptor, TempDescriptor> tmpMap, PPoint bblock) {
49     Delta newdelta=new Delta();
50     newdelta.baseheapedge=baseheapedge;
51     newdelta.basevaredge=basevaredge;
52     newdelta.heapedgeadd=heapedgeadd;
53     newdelta.heapedgeremove=heapedgeremove;
54     //Update variable edge mappings
55     newdelta.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
56     for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varedgeadd.entrySet()) {
57       varedgeadd.put(tmpMap.get(entry.getKey()), entry.getValue());
58     }
59     newdelta.varedgeremove=varedgeremove;
60     newdelta.block=bblock;
61     return newdelta;
62   }
63
64   public Delta buildBase(MySet<Edge> edges) {
65     Delta newdelta=new Delta();
66     newdelta.baseheapedge=baseheapedge;
67     newdelta.basevaredge=basevaredge;
68     newdelta.heapedgeadd=heapedgeadd;
69     newdelta.heapedgeremove=heapedgeremove;
70     newdelta.varedgeadd=varedgeadd;
71     for(Edge e:edges) {
72       if (e.srcvar!=null) {
73         if (!newdelta.varedgeadd.containsKey(e.srcvar)) {
74           newdelta.varedgeadd.put(e.srcvar, new MySet<Edge>());
75         }
76         newdelta.varedgeadd.get(e.srcvar).add(e);
77       } else {
78         if (!newdelta.heapedgeadd.containsKey(e.src)) {
79           newdelta.heapedgeadd.put(e.src, new MySet<Edge>());
80         }
81         newdelta.heapedgeadd.get(e.src).add(e);
82       }
83     }
84     return newdelta;
85   }
86
87   public Delta diffBlock(PPoint bblock) {
88     Delta newdelta=new Delta();
89     newdelta.baseheapedge=baseheapedge;
90     newdelta.basevaredge=basevaredge;
91     newdelta.heapedgeadd=heapedgeadd;
92     newdelta.heapedgeremove=heapedgeremove;
93     newdelta.varedgeadd=varedgeadd;
94     newdelta.varedgeremove=varedgeremove;
95     newdelta.block=bblock;
96     return newdelta;
97   }
98
99   public boolean getInit() {
100     return init;
101   }
102
103   public void setInit(boolean init) {
104     this.init=init;
105   }
106 }