1 package Analysis.Disjoint;
8 import Analysis.OoOJava.*;
12 //////////////////////////////////////////////
14 // BuildStateMachines builds a state machine
15 // for every task/stall site and variable pair
17 // StateMachineForEffects describes an intial
18 // state and the effect transtions a DFJ
19 // traverser should make from the current state
20 // when searching for possible runtime conflicts.
22 //////////////////////////////////////////////
24 public class BuildStateMachines {
26 // map a task or stall site (both a FlatNode) to a variable
27 // and then finally to a state machine
28 protected Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects>> fn2var2smfe;
30 // remember all the FlatNode/TempDescriptor pairs that have a state machines
31 // for easy retrieval of all machines
32 protected Set<Pair<FlatNode, TempDescriptor>> allMachineNamePairs;
35 public BuildStateMachines() {
36 fn2var2smfe = new Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >();
37 allMachineNamePairs = new HashSet<Pair<FlatNode, TempDescriptor>>();
40 public StateMachineForEffects getStateMachine(Pair<FlatNode, TempDescriptor> fnpair) {
41 return getStateMachine(fnpair.getFirst(), fnpair.getSecond());
44 public StateMachineForEffects getStateMachine(FlatNode fn, TempDescriptor var) {
45 Hashtable<TempDescriptor, StateMachineForEffects> var2smfe = fn2var2smfe.get(fn);
46 if( var2smfe == null ) {
47 var2smfe = new Hashtable<TempDescriptor, StateMachineForEffects>();
48 fn2var2smfe.put(fn, var2smfe);
51 StateMachineForEffects smfe = var2smfe.get(var);
53 smfe = new StateMachineForEffects(fn);
54 var2smfe.put(var, smfe);
55 allMachineNamePairs.add(new Pair<FlatNode, TempDescriptor>(fn, var) );
62 public Set<Pair<FlatNode, TempDescriptor>> getAllMachineNames() {
63 return allMachineNamePairs;
67 public void addToStateMachine(Taint t,
69 FlatNode currentProgramPoint) {
70 FlatNode taskOrStallSite;
71 if( t.isStallSiteTaint() ) {
72 taskOrStallSite = t.getStallSite();
74 taskOrStallSite = t.getSESE();
77 TempDescriptor var = t.getVar();
79 StateMachineForEffects smfe = getStateMachine(taskOrStallSite, var);
81 FlatNode whereDefined = t.getWhereDefined();
83 smfe.addEffect(whereDefined, e);
85 // reads of pointers make a transition
86 if( e.getType() == Effect.read &&
87 ((e.getField()!=null && e.getField().getType().isPtr())
88 ||(e.getField()==null && e.getAffectedAllocSite().getFlatNew().getType().dereference().isPtr()))) {
90 smfe.addTransition(whereDefined,
97 public void writeStateMachines() {
98 writeStateMachines("");
101 public void writeStateMachines(String prefix) {
103 Iterator<FlatNode> fnItr = fn2var2smfe.keySet().iterator();
104 while( fnItr.hasNext() ) {
105 FlatNode fn = fnItr.next();
107 Hashtable<TempDescriptor, StateMachineForEffects>
108 var2smfe = fn2var2smfe.get(fn);
110 Iterator<TempDescriptor> varItr = var2smfe.keySet().iterator();
111 while( varItr.hasNext() ) {
112 TempDescriptor var = varItr.next();
114 StateMachineForEffects smfe = var2smfe.get(var);
116 smfe.writeAsDOT(prefix+"statemachine_"+fn.toString()+var.toString() );
120 //TODO JIM! Give me the REAALL number here.
121 public int getTotalNumOfWeakGroups() {
122 // TODO Auto-generated method stub