bug fixes
[IRC.git] / Robust / src / Analysis / Disjoint / AllocSite.java
1 package Analysis.Disjoint;
2
3 import IR.*;
4 import IR.Flat.*;
5 import java.util.*;
6
7 // allocation sites are independent of any particular
8 // reachability graph, unlike most of the other elements
9 // of the reachability analysis.  An allocation site is
10 // simply a collection of heap region identifiers that
11 // are associated with a single allocation site in the
12 // program under analysis.
13
14 // So two different reachability graphs may incorporate
15 // nodes that represent the memory from one allocation
16 // site.  In this case there are two different sets of
17 // HeapRegionNode objects, but they have the same
18 // node identifiers, and there is one AllocSite
19 // object associated with the FlatNew node that gives
20 // the graphs the identifiers in question.
21
22 // note that an allocsite extends Canonical because they
23 // are Canonical, but specifically so an AllocSite can
24 // be an operand to a CanonicalOp
25
26 public class AllocSite extends Canonical {
27
28   static protected int uniqueIDcount = 0;
29
30   public static final int AGE_notInThisSite = 100;
31   public static final int AGE_in_I          = 101;
32   public static final int AGE_oldest        = 102;
33   public static final int AGE_summary       = 103;
34
35   public static final int SHADOWAGE_notInThisSite = -100;
36   public static final int SHADOWAGE_in_I          = -101;
37   public static final int SHADOWAGE_oldest        = -102;
38   public static final int SHADOWAGE_summary       = -103;
39
40   protected Integer         id;
41   protected int             allocationDepth;
42   protected Vector<Integer> ithOldest;
43   protected Integer         summary;
44   protected FlatNew         flatNew;
45   protected String          disjointId;
46   protected boolean         flag;
47
48
49   public AllocSite( int     allocationDepth, 
50                     FlatNew flatNew, 
51                     String  disjointId
52                     ) {
53
54     assert allocationDepth >= 1;
55
56     this.allocationDepth = allocationDepth;
57     this.flatNew         = flatNew;
58     this.disjointId      = disjointId;
59     this.flag            = false;
60
61     ithOldest = new Vector<Integer>( allocationDepth );
62     id        = generateUniqueAllocSiteID();
63   }
64
65   static public Integer generateUniqueAllocSiteID() {
66     ++uniqueIDcount;
67     return new Integer( uniqueIDcount );
68   }
69
70   public String getDisjointAnalysisId() {
71     return disjointId;
72   }
73
74
75   public int getAllocationDepth() {
76     return allocationDepth;
77   }
78
79   public void setIthOldest( int i, Integer id ) {
80     assert i  >= 0;
81     assert i  <  allocationDepth;
82     assert id != null;
83
84     ithOldest.add( i, id );
85   }
86
87   public Integer getIthOldest( int i ) {
88     assert i >= 0;
89     assert i <  allocationDepth;
90
91     return ithOldest.get( i );
92   }
93
94   public Integer getIthOldestShadow( int i ) {
95     assert i >= 0;
96     assert i <  allocationDepth;
97
98     return -ithOldest.get( i );
99   }
100
101   public Integer getOldest() {
102     return ithOldest.get( allocationDepth - 1 );
103   }
104
105   public Integer getOldestShadow() {
106     return -ithOldest.get( allocationDepth - 1 );
107   }
108
109   public void setSummary( Integer id ) {
110     assert id != null;
111     summary = id;
112   }
113
114   public Integer getSummary() {
115     return summary;
116   }
117
118   public Integer getSummaryShadow() {
119     return -summary;
120   }
121
122   public FlatNew getFlatNew() {
123     return flatNew;
124   }
125
126   public TypeDescriptor getType() {
127     return flatNew.getType();
128   }
129
130   public int getAgeCategory( Integer id ) {
131
132     if( id.equals( summary ) ) {
133       return AGE_summary;
134     }
135
136     if( id.equals( getOldest() ) ) {
137       return AGE_oldest;
138     }
139
140     for( int i = 0; i < allocationDepth - 1; ++i ) {
141       if( id.equals( ithOldest.get( i ) ) ) {
142         return AGE_in_I;
143       }
144     }
145
146     return AGE_notInThisSite;
147   }
148
149   public Integer getAge( Integer id ) {
150     for( int i = 0; i < allocationDepth; ++i ) {
151       if( id.equals( ithOldest.get( i ) ) ) {
152         return new Integer( i );
153       }
154     }
155
156     return null;
157   }
158
159   public int getShadowAgeCategory( Integer id ) {
160     if( id.equals( -summary ) ) {
161       return SHADOWAGE_summary;
162     }
163
164     if( id.equals( getOldestShadow() ) ) {
165       return SHADOWAGE_oldest;
166     }
167
168     for( int i = 0; i < allocationDepth - 1; ++i ) {
169       if( id.equals( getIthOldestShadow( i ) ) ) {
170         return SHADOWAGE_in_I;
171       }
172     }
173
174     return SHADOWAGE_notInThisSite;
175   }
176
177   public Integer getShadowAge( Integer id ) {
178     for( int i = 0; i < allocationDepth - 1; ++i ) {
179       if( id.equals( getIthOldestShadow( i ) ) ) {
180         return new Integer( -i );
181       }
182     }
183
184     return null;
185   }
186
187   public Integer getShadowIDfromID( Integer id ) {
188     int ageCat = getAgeCategory( id );
189     switch( ageCat ) {
190       
191     case AGE_summary:
192     case AGE_oldest:
193     case AGE_in_I:
194       return -id;
195       
196     case AGE_notInThisSite:
197     default:
198       System.out.println( toStringWithIDs() );
199       throw new Error( "ID "+id+" not from this site." );
200     }
201   }
202
203   public String toString() {
204     if( disjointId == null ) {
205       return "allocSite"+id;
206     }
207     return "allocSite "+disjointId+" ("+id+")";
208   }
209
210   public String toStringVerbose() {
211     if( disjointId == null ) {
212       return "allocSite"+id+" "+
213         flatNew.getType().toPrettyString();
214     }
215     return "allocSite "+disjointId+" ("+id+") "+
216       flatNew.getType().toPrettyString();
217   }
218
219   public String toStringForDOT() {
220     if( disjointId != null ) {
221       return "disjoint "+disjointId+"\\n"+toString()+
222         "\\n"+getType().toPrettyString();
223     } else {
224       return                              toString()+
225         "\\n"+getType().toPrettyString();
226     }
227   }
228
229   public String toStringWithIDs() {
230     String s = "allocSite"+id+" ";
231     for( int i = 0; i < ithOldest.size(); ++i ) {
232       s += i+"("+ithOldest.get( i )+") ";
233     }
234     s += "summary("+summary+")";
235     return s;
236   }
237
238
239   public int hashCodeSpecific() {
240     return id;
241   }
242   
243   public void setFlag( boolean flag ) {
244     this.flag = flag;
245   }
246   
247   public boolean getFlag() {
248     return flag;
249   }
250 }