1 package Analysis.Disjoint;
9 //////////////////////////////////////////////
11 // BuildStateMachines builds a state machine
12 // for every task/stall site and variable pair
14 // StateMachineForEffects describes an intial
15 // state and the effect transtions a DFJ
16 // traverser should make from the current state
17 // when searching for possible runtime conflicts.
19 //////////////////////////////////////////////
21 public class BuildStateMachines {
23 // map a task or stall site (both a FlatNode) to a variable
24 // and then finally to a state machine
26 Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >
29 public BuildStateMachines() {
31 Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >();
34 protected StateMachineForEffects getStateMachine( FlatNode fn,
35 TempDescriptor var ) {
37 Hashtable<TempDescriptor, StateMachineForEffects> var2smfe = fn2var2smfe.get( fn );
38 if( var2smfe == null ) {
39 var2smfe = new Hashtable<TempDescriptor, StateMachineForEffects>();
40 fn2var2smfe.put( fn, var2smfe );
43 StateMachineForEffects smfe = var2smfe.get( var );
45 smfe = new StateMachineForEffects( fn );
46 var2smfe.put( var, smfe );
54 public void addToStateMachine( Taint t,
56 FlatNode currentProgramPoint ) {
58 FlatNode taskOrStallSite;
59 if( t.isStallSiteTaint() ) {
60 taskOrStallSite = t.getStallSite();
62 taskOrStallSite = t.getSESE();
65 TempDescriptor var = t.getVar();
67 StateMachineForEffects smfe = getStateMachine( taskOrStallSite, var );
69 FlatNode whereDefined = t.getWhereDefined();
71 smfe.addEffect( whereDefined, e );
73 // reads of pointers make a transition
74 if( e.getType() == Effect.read &&
75 e.getField().getType().isPtr() ) {
77 smfe.addTransition( whereDefined,
84 public void writeStateMachines() {
86 Iterator<FlatNode> fnItr = fn2var2smfe.keySet().iterator();
87 while( fnItr.hasNext() ) {
88 FlatNode fn = fnItr.next();
90 Hashtable<TempDescriptor, StateMachineForEffects>
91 var2smfe = fn2var2smfe.get( fn );
93 Iterator<TempDescriptor> varItr = var2smfe.keySet().iterator();
94 while( varItr.hasNext() ) {
95 TempDescriptor var = varItr.next();
97 StateMachineForEffects smfe = var2smfe.get( var );
99 smfe.writeAsDOT( "statemachine_"+fn.toString()+var.toString() );