More pieces for new version of analysis
[IRC.git] / Robust / src / Analysis / MLP / MemoryStall.java
1 package Analysis.MLP;
2
3 public class MemoryStall {
4   JavaCallGraph callgraph;
5   State state;
6   TypeUtil typeutil;
7   SESETree sesetree;
8
9   public MemoryStall(State state, TypeUtil typeutil, JavaCallGraph callgraph, SESETree sesetree) {
10     this.state=state;
11     this.typeutil=typeutil;
12     this.callgraph=callgraph;
13     this.sesetree=sesetree;
14   }
15
16   private boolean isOnlyLeaf(MethodDescriptor md) {
17     Set<SESENode> seseset=sesetree.getSESE(md);
18     for(Iterator<SESENode> seseit=seseset.iterator();seseit.hasNext();) {
19       SESENode sese=seseit.next();
20       if (!sese.isLeaf())
21         return false;
22     }
23     return true;
24   }
25
26   HashSet toanalyze=new HashSet();
27
28   public void doAnalysis() {
29     MethodDescriptor main=typeutil.getMain();
30     toanalyze.addAll(callGraph.getAllMethods(main));
31
32     while(!toanalyze.isEmpty()) {
33       MethodDescriptor md=(MethodDescriptor)toanalyze.iterator().next();
34       toanalyze.remove(md);
35       if (isOnlyLeaf(md))
36         continue;
37       analyzeMethod(md);
38     }
39   }
40   
41   private void analyzeMethod(MethodDescriptor md) {
42     FlatMethod fm=state.getMethodFlat(md);
43     Hashtable<FlatNode, Stack<SESENode>> nodetosese=sesetree.analyzeMethod(md);
44     HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
45     tovisit.add(fm);
46     Hashtable<FlatNode, Set<TempDescriptor>> dirtytemps=new Hashtable<FlatNode, Set<TempDescriptor>>();
47
48     while(!tovisit.isEmpty()) {
49       FlatNode fn=tovisit.iterator().next();
50       tovisit.remove(fn);
51       HashSet<TempDescriptor> newset=new HashSet<TempDescriptor>();
52       for(int i=0;i<fn.numPrev();i++) {
53         if (dirtytemps.containsKey(fn.getPrev(i)))
54           newset.addAll(dirtytemps.get(fn.getPrev(i)));
55       }
56       
57       switch(fn.kind()) {
58       case FKind.FlatSESEExitNode: {
59         newset=new HashSet<TempDescriptor>();
60         break;
61       }
62       case FKind.FlatElementNode: {
63         FlatElementNode fen=(FlatElementNode) fn;
64         newset.remove(fen.getSrc());
65         newset.remove(fen.getDst());
66         break;
67       }
68       case FKind.FlatFieldNode: {
69         FlatFieldNode ffn=(FlatFieldNode) fn;
70         newset.remove(ffn.getSrc());
71         newset.remove(ffn.getDst());
72         break;
73       }
74       case FKind.FlatSetFieldNode: {
75         FlatSetFieldNode fsfn=(FlatSetFieldNode) fn;
76         newset.remove(fsfn.getSrc());
77         newset.remove(fsfn.getDst());
78         break;
79       }
80       case FKind.FlatSetElementNode: {
81         FlatSetElementNode fsen=(FlatSetElementNode) fn;
82         newset.remove(fsen.getSrc());
83         newset.remove(fsen.getDst());
84         break;
85       }
86       case FKind.FlatLiteralNode: {
87         FlatLiteralNode fln=(FlatLiteralNode) fn;
88         newset.remove(fln.getDst());
89         break;
90       }
91       case FKind.FlatMethodNode: {
92         
93         break;
94       }
95       case FKind.FlatOpNode: {
96         FlatOpNode fon=(FlatOpNode)fn;
97         if (fon.getOp().getOp()==Operation.ASSIGN) {
98           if (newset.contains(getLeft()))
99             newset.add(getDest());
100           else if (!newset.contains(getLeft()))
101             newset.remove(getDest());
102           break;
103         }
104       }
105       case FKind.FlatCastNode: {
106         FlatCastNode fcn=(FlatOpNode)fn;
107         if (newset.contains(getSrc()))
108           newset.add(getDst());
109         else if (!newset.contains(getSrc()))
110           newset.remove(getDst());
111         break;
112       }
113       case FKind.FlatNew: {
114         FlatNew fnew=(FlatNew) fn;
115         newset.remove(fnew.getDst());
116         break;
117       }
118       case FKind.FlatReturnNode: {
119         FlatReturnNode frn=(FlatReturnNode) fn;
120         
121         break;
122       }
123       case FKind.FlatCall: {
124         FlatCall fc=(FlatCall)fn;
125         
126         break;
127       }
128       }
129       
130     }
131
132     
133     
134   }
135
136   private MethodDescriptor getBase(MethodDescriptor md) {
137     ClassDescriptor cd=md.getClassDesc();
138     while (cd.getSuperDesc()!=null) {
139       cd=cd.getSuperDesc();
140       Set methodset=cd.getMethodTable().getSet(md.getSymbol());
141       MethodDescriptor mdtemp=null;
142       for(Iterator mdit=methodset.iterator();mdit.hasNext();) {
143         MethodDescriptor mdsuper=(MethodDescriptor) mdit.next();
144         if (mdsuper.matches(md)) {
145           mdtemp=mdsuper;
146           break;
147         }
148       }
149       if (mdtemp!=null)
150         md=mdtemp;
151       else
152         return md;
153     }
154     return md;
155   }
156
157   class MethodContext {
158     boolean[] parameters;
159     boolean dirtytemp;
160   }
161   
162 }