changes:
[IRC.git] / Robust / src / Analysis / Loops / GlobalFieldType.java
index c81fdab50808a90d92c083caeade820f3b524431..3aa5ef8973bb6ef32de64ee81621eaa0ad5c05ce 100644 (file)
@@ -18,6 +18,8 @@ public class GlobalFieldType {
   MethodDescriptor root;
   Hashtable<MethodDescriptor, Set<FieldDescriptor>> fields;
   Hashtable<MethodDescriptor, Set<TypeDescriptor>> arrays;
+  Hashtable<MethodDescriptor, Set<FieldDescriptor>> fieldsrd;
+  Hashtable<MethodDescriptor, Set<TypeDescriptor>> arraysrd;
   HashSet<MethodDescriptor> containsAtomic;
   HashSet<MethodDescriptor> containsBarrier;
   
@@ -27,6 +29,8 @@ public class GlobalFieldType {
     this.root=root;
     this.fields=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
     this.arrays=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
+    this.fieldsrd=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
+    this.arraysrd=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
     this.containsAtomic=new HashSet<MethodDescriptor>();
     this.containsBarrier=new HashSet<MethodDescriptor>();
     doAnalysis();
@@ -84,6 +88,10 @@ public class GlobalFieldType {
            changed=true;
          if (arrays.get(md).addAll(arrays.get(md2)))
            changed=true;
+         if (fieldsrd.get(md).addAll(fieldsrd.get(md2)))
+           changed=true;
+         if (arraysrd.get(md).addAll(arraysrd.get(md2)))
+           changed=true;
          if (containsAtomic.contains(md2)) {
            if (containsAtomic.add(md))
              changed=true;
@@ -113,9 +121,83 @@ public class GlobalFieldType {
     return arrays.get(md);
   }
 
+  public Set<FieldDescriptor> getFieldsRd(MethodDescriptor md) {
+    return fieldsrd.get(md);
+  }
+
+  public Set<TypeDescriptor> getArraysRd(MethodDescriptor md) {
+    return arraysrd.get(md);
+  }
+
+  public boolean containsAtomicAll(MethodDescriptor md) {
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (containsAtomic.contains(md2))
+       return true;
+    }
+    return false;
+  }
+
+  public boolean containsBarrierAll(MethodDescriptor md) {
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (containsBarrier.contains(md2))
+       return true;
+    }
+    return false;
+  }
+  
+  public Set<FieldDescriptor> getFieldsAll(MethodDescriptor md) {
+    HashSet<FieldDescriptor> s=new HashSet<FieldDescriptor>();
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (fields.containsKey(md2))
+       s.addAll(fields.get(md2));
+    }
+    return s;
+  }
+
+  public Set<TypeDescriptor> getArraysAll(MethodDescriptor md) {
+    HashSet<TypeDescriptor> s=new HashSet<TypeDescriptor>();
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (arrays.containsKey(md2))
+       s.addAll(arrays.get(md2));
+    }
+    return s;
+  }
+
+  public Set<FieldDescriptor> getFieldsRdAll(MethodDescriptor md) {
+    HashSet<FieldDescriptor> s=new HashSet<FieldDescriptor>();
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (fieldsrd.containsKey(md2))
+       s.addAll(fieldsrd.get(md2));
+    }
+    return s;
+  }
+
+  public Set<TypeDescriptor> getArraysRdAll(MethodDescriptor md) {
+    HashSet<TypeDescriptor> s=new HashSet<TypeDescriptor>();
+    Set methodset=cg.getMethods(md);
+    for(Iterator it=methodset.iterator();it.hasNext();) {
+      MethodDescriptor md2=(MethodDescriptor)it.next();
+      if (arraysrd.containsKey(md2))
+       s.addAll(arraysrd.get(md2));
+    }
+    return s;
+  }
+
   public void analyzeMethod(MethodDescriptor md) {
     fields.put(md, new HashSet<FieldDescriptor>());
     arrays.put(md, new HashSet<TypeDescriptor>());
+    fieldsrd.put(md, new HashSet<FieldDescriptor>());
+    arraysrd.put(md, new HashSet<TypeDescriptor>());
     
     FlatMethod fm=st.getMethodFlat(md);
     for(Iterator it=fm.getNodeSet().iterator();it.hasNext();) {
@@ -123,9 +205,15 @@ public class GlobalFieldType {
       if (fn.kind()==FKind.FlatSetElementNode) {
        FlatSetElementNode fsen=(FlatSetElementNode)fn;
        arrays.get(md).add(fsen.getDst().getType());
+      } else if (fn.kind()==FKind.FlatElementNode) {
+       FlatElementNode fen=(FlatElementNode)fn;
+       arraysrd.get(md).add(fen.getSrc().getType());
       } else if (fn.kind()==FKind.FlatSetFieldNode) {
        FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
        fields.get(md).add(fsfn.getField());
+      } else if (fn.kind()==FKind.FlatFieldNode) {
+       FlatFieldNode ffn=(FlatFieldNode)fn;
+       fieldsrd.get(md).add(ffn.getField());
       } else if (fn.kind()==FKind.FlatAtomicEnterNode) {
        containsAtomic.add(md);
       } else if (fn.kind()==FKind.FlatCall) {