Added framework for ownership analysis.
[IRC.git] / Robust / src / IR / State.java
1 package IR;
2 import IR.Tree.*;
3 import IR.Flat.*;
4 import IR.*;
5 import java.util.*;
6 import Analysis.TaskStateAnalysis.*;
7
8 public class State {
9     public State() {
10         this.classes=new SymbolTable();
11         this.tasks=new SymbolTable();
12         this.treemethodmap=new Hashtable();
13         this.flatmethodmap=new Hashtable();
14         this.parsetrees=new HashSet();
15         this.arraytypes=new HashSet();
16         this.arraytonumber=new Hashtable();
17         this.tagmap=new Hashtable();
18         this.selfloops=new HashSet();
19     }
20
21     public void addParseNode(ParseNode parsetree) {
22         parsetrees.add(parsetree);
23     }
24
25     public void storeAnalysisResult(Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> analysisresults) {
26         this.analysisresults=analysisresults;
27     }
28
29     public Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> getAnalysisResult() {
30         return analysisresults;
31     }
32
33
34     public void storeOptionalTaskDescriptors(Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> optionaltaskdescriptors){
35         this.optionaltaskdescriptors=optionaltaskdescriptors;
36     }
37
38     public Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> getOptionalTaskDescriptors(){
39         return optionaltaskdescriptors;
40     }
41
42     /** Boolean flag which indicates whether compiler is compiling a task-based
43      * program. */
44     public boolean WEBINTERFACE=false;
45     public boolean TASK=false;
46     public boolean DSM=false;
47     public boolean PREFETCH=false;
48     public boolean TASKSTATE=false;
49     public boolean FLATIRGRAPH=false;
50     public boolean FLATIRGRAPHTASKS=false;
51     public boolean FLATIRGRAPHUSERMETHODS=false;
52     public boolean FLATIRGRAPHLIBMETHODS=false;
53     public boolean OWNERSHIP=false;
54     public boolean OPTIONAL=false;
55     public boolean THREAD=false;
56     public boolean CONSCHECK=false;
57     public boolean INSTRUCTIONFAILURE=false;
58     public String structfile;
59     public String main;
60
61     public HashSet selfloops;
62     public SymbolTable classes;
63     public SymbolTable tasks;
64     public Set parsetrees;
65     public Hashtable treemethodmap;
66     public Hashtable flatmethodmap;
67     private HashSet arraytypes;
68     public Hashtable arraytonumber;
69     private int numclasses=0;
70     private int numtasks=0;
71     private int arraycount=0;
72
73
74     private Hashtable<ClassDescriptor, Hashtable<OptionalTaskDescriptor, OptionalTaskDescriptor>> optionaltaskdescriptors;
75     private Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> analysisresults;
76
77     private Hashtable tagmap;
78     private int numtags=0;
79
80     public void addArrayType(TypeDescriptor td) {
81         if (!arraytypes.contains(td)) {
82             arraytypes.add(td);
83             arraytonumber.put(td,new Integer(arraycount++));
84         }
85     }
86
87     public Iterator getArrayIterator() {
88         return arraytypes.iterator();
89     }
90
91     public int getTagId(TagDescriptor tag) {
92         if (tagmap.containsKey(tag)) {
93             return ((Integer) tagmap.get(tag)).intValue();
94         } else {
95             tagmap.put(tag, new Integer(numtags));
96             return numtags++;
97         }
98     }
99
100     public int getArrayNumber(TypeDescriptor td) {
101         return ((Integer)arraytonumber.get(td)).intValue();
102     }
103
104     public int numArrays() {
105         return arraytypes.size();
106     }
107
108     public static TypeDescriptor getTypeDescriptor(int t) {
109         TypeDescriptor td=new TypeDescriptor(t);
110         return td;
111     }
112
113     public static TypeDescriptor getTypeDescriptor(NameDescriptor n) {
114         TypeDescriptor td=new TypeDescriptor(n);
115         return td;
116     }
117
118     public void addClass(ClassDescriptor tdn) {
119         if (classes.contains(tdn.getSymbol()))
120             throw new Error("Class "+tdn.getSymbol()+" defined twice");
121         classes.add(tdn);
122         numclasses++;
123     }
124
125     public int numClasses() {
126         return numclasses;
127     }
128
129     public BlockNode getMethodBody(MethodDescriptor md) {
130         return (BlockNode)treemethodmap.get(md);
131     }
132
133     public BlockNode getMethodBody(TaskDescriptor td) {
134         return (BlockNode)treemethodmap.get(td);
135     }
136
137     public SymbolTable getClassSymbolTable() {
138         return classes;
139     }
140
141     public SymbolTable getTaskSymbolTable() {
142         return tasks;
143     }
144
145     /** Returns Flat IR representation of MethodDescriptor md. */
146
147     public FlatMethod getMethodFlat(MethodDescriptor md) {
148         return (FlatMethod)flatmethodmap.get(md);
149     }
150
151     /** Returns Flat IR representation of TaskDescriptor td. */
152
153     public FlatMethod getMethodFlat(TaskDescriptor td) {
154         return (FlatMethod)flatmethodmap.get(td);
155     }
156
157     public void addTreeCode(MethodDescriptor md, BlockNode bn) {
158         treemethodmap.put(md,bn);
159     }
160
161     public void addTreeCode(TaskDescriptor td, BlockNode bn) {
162         treemethodmap.put(td,bn);
163     }
164
165     public void addFlatCode(MethodDescriptor md, FlatMethod bn) {
166         flatmethodmap.put(md,bn);
167     }
168
169     public void addFlatCode(TaskDescriptor td, FlatMethod bn) {
170         flatmethodmap.put(td,bn);
171     }
172
173     public void addTask(TaskDescriptor td) {
174         if (tasks.contains(td.getSymbol()))
175             throw new Error("Task "+td.getSymbol()+" defined twice");
176         tasks.add(td);
177         numtasks++;
178     }
179 }