3 public class MemoryStall {
4 JavaCallGraph callgraph;
9 public MemoryStall(State state, TypeUtil typeutil, JavaCallGraph callgraph, SESETree sesetree) {
11 this.typeutil=typeutil;
12 this.callgraph=callgraph;
13 this.sesetree=sesetree;
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();
26 HashSet toanalyze=new HashSet();
28 public void doAnalysis() {
29 MethodDescriptor main=typeutil.getMain();
30 toanalyze.addAll(callGraph.getAllMethods(main));
32 while(!toanalyze.isEmpty()) {
33 MethodDescriptor md=(MethodDescriptor)toanalyze.iterator().next();
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>();
46 Hashtable<FlatNode, Set<TempDescriptor>> dirtytemps=new Hashtable<FlatNode, Set<TempDescriptor>>();
48 while(!tovisit.isEmpty()) {
49 FlatNode fn=tovisit.iterator().next();
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)));
58 case FKind.FlatSESEExitNode: {
59 newset=new HashSet<TempDescriptor>();
62 case FKind.FlatElementNode: {
63 FlatElementNode fen=(FlatElementNode) fn;
64 newset.remove(fen.getSrc());
65 newset.remove(fen.getDst());
68 case FKind.FlatFieldNode: {
69 FlatFieldNode ffn=(FlatFieldNode) fn;
70 newset.remove(ffn.getSrc());
71 newset.remove(ffn.getDst());
74 case FKind.FlatSetFieldNode: {
75 FlatSetFieldNode fsfn=(FlatSetFieldNode) fn;
76 newset.remove(fsfn.getSrc());
77 newset.remove(fsfn.getDst());
80 case FKind.FlatSetElementNode: {
81 FlatSetElementNode fsen=(FlatSetElementNode) fn;
82 newset.remove(fsen.getSrc());
83 newset.remove(fsen.getDst());
86 case FKind.FlatLiteralNode: {
87 FlatLiteralNode fln=(FlatLiteralNode) fn;
88 newset.remove(fln.getDst());
91 case FKind.FlatMethodNode: {
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());
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());
113 case FKind.FlatNew: {
114 FlatNew fnew=(FlatNew) fn;
115 newset.remove(fnew.getDst());
118 case FKind.FlatReturnNode: {
119 FlatReturnNode frn=(FlatReturnNode) fn;
123 case FKind.FlatCall: {
124 FlatCall fc=(FlatCall)fn;
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)) {
157 class MethodContext {
158 boolean[] parameters;