more changes toward compiler DSM support
[IRC.git] / Robust / src / Analysis / Locality / LocalityBinding.java
1 package Analysis.Locality;
2 import IR.MethodDescriptor;
3
4 public class LocalityBinding {
5     private MethodDescriptor md;
6     private Integer[] isglobal;
7     private boolean isatomic;
8     private Integer isglobalreturn;
9     private Integer isglobalthis;
10     private LocalityBinding parent;
11     private boolean hasatomic;
12
13     public LocalityBinding(MethodDescriptor md, boolean atomic) {
14         this.md=md;
15         isglobal=new Integer[md.numParameters()];
16         isatomic=atomic;
17     }
18
19     public void setHasAtomic() {
20         hasatomic=true;
21     }
22
23     public boolean getHasAtomic() {
24         return hasatomic;
25     }
26
27     private static String globalToString(Integer g) {
28         if (g==LocalityAnalysis.GLOBAL)
29             return "G";
30         else if (g==LocalityAnalysis.LOCAL)
31             return "L";
32         else if (g==LocalityAnalysis.EITHER)
33             return "E";
34         else if (g==LocalityAnalysis.CONFLICT)
35             return "C";
36         else throw new Error();
37     }
38     
39     public String getSignature() {
40         String st="_";
41         if (isatomic) {
42             st+="A";
43         } else
44             st+="N";
45         st+=globalToString(isglobalthis);
46         for(int i=0;i<isglobal.length;i++) {
47             st+=globalToString(isglobal[i]);
48         }
49         st+="_";
50         return st;
51     }
52
53     /* Use this for an explanation */
54     public void setParent(LocalityBinding lb) {
55         parent=lb;
56     }
57
58     public String getExplanation() {
59         if (parent==null)
60             return toString();
61         else
62             return parent.getExplanation()+"\n"+toString();
63     }
64
65     public String toString() {
66         String st=md.toString()+" ";
67         for(int i=0;i<isglobal.length;i++)
68             if (isglobal[i].equals(LocalityAnalysis.LOCAL))
69                 st+="local ";
70             else if (isglobal[i].equals(LocalityAnalysis.GLOBAL))
71                 st+="global ";
72             else if (isglobal[i].equals(LocalityAnalysis.EITHER))
73                 st+="either ";
74             else if (isglobal[i].equals(LocalityAnalysis.CONFLICT))
75                 st+="conflict ";
76         return st;
77     }
78
79     public void setGlobal(int i, Integer global) {
80         isglobal[i]=global;
81     }
82
83     public Integer isGlobal(int i) {
84         return isglobal[i];
85     }
86
87     public void setGlobalReturn(Integer global) {
88         isglobalreturn=global;
89     }
90
91     public Integer getGlobalReturn() {
92         return isglobalreturn;
93     }
94
95     public void setGlobalThis(Integer global) {
96         isglobalthis=global;
97     }
98
99     public Integer getGlobalThis() {
100         return isglobalthis;
101     }
102
103     public MethodDescriptor getMethod() {
104         return md;
105     }
106
107     public boolean isAtomic() {
108         return isatomic;
109     }
110
111     public boolean equals(Object o) {
112         if (o instanceof LocalityBinding) {
113             LocalityBinding lb=(LocalityBinding)o;
114             if (md!=lb.md)
115                 return false;
116             for(int i=0;i<isglobal.length;i++)
117                 if (!isglobal[i].equals(lb.isglobal[i]))
118                     return false;
119             if (!isglobalthis.equals(lb.isglobalthis))
120                 return false;
121             return (isatomic==lb.isatomic);
122         }
123         return false;
124     }
125
126     public int hashCode() {
127         int hashcode=md.hashCode();
128         for(int i=0;i<isglobal.length;i++) {
129             hashcode=hashcode*31+(isglobal[i].intValue());
130         }
131         hashcode=hashcode*31+(isatomic?1:0);
132         return hashcode;
133     }
134 }