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