return ns;
}
+ /** Given a call to MethodDescriptor, lists the methods which
+ could actually be call by that method. */
+ public Set getMethodCalls(MethodDescriptor md) {
+ HashSet ns=new HashSet();
+ ns.add(md);
+ Set s=(Set)methodmap.get(md);
+ if (s!=null)
+ for(Iterator it=s.iterator();it.hasNext();) {
+ MethodDescriptor md2=(MethodDescriptor)it.next();
+ ns.addAll(getMethodCalls(md2));
+ }
+ return ns;
+ }
+
private void buildGraph() {
Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
while(it.hasNext()) {
package Analysis.Flag;
import IR.State;
+import Analysis.CallGraph.CallGraph;
public class FlagAnalysis {
State state;
-
+ CallGraph cg;
- public FlagAnalysis(State state) {
+ public FlagAnalysis(State state, CallGraph cg) {
this.state=state;
+ this.cg=cg;
}
+ /** Need: Map from tasks -> flag transitions task -> new
+ objects/flags */
+
public void doAnalysis() {
}
FlatNew fn=new FlatNew(td, out_temp);
TempDescriptor[] temps=new TempDescriptor[con.numArgs()];
FlatNode last=fn;
+
+ if (con.getFlagEffects()!=null) {
+ FlatFlagActionNode ffan=new FlatFlagActionNode(false);
+ FlagEffects fes=con.getFlagEffects();
+ TempDescriptor flagtemp=out_temp;
+ for(int j=0;j<fes.numEffects();j++) {
+ FlagEffect fe=fes.getEffect(j);
+ ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
+ }
+ last.addNext(ffan);
+ last=ffan;
+ }
//Build arguments
for(int i=0;i<con.numArgs();i++) {
ExpressionNode en=con.getArg(i);
FlatCall fc=new FlatCall(md, null, out_temp, temps);
last.addNext(fc);
last=fc;
- if (con.getFlagEffects()!=null) {
- FlatFlagActionNode ffan=new FlatFlagActionNode(false);
- FlagEffects fes=con.getFlagEffects();
- TempDescriptor flagtemp=out_temp;
- for(int j=0;j<fes.numEffects();j++) {
- FlagEffect fe=fes.getEffect(j);
- ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
- }
- last.addNext(ffan);
- last=ffan;
- }
return new NodePair(fn,last);
} else {
FlatNode first=null;
Lex/LongLiteral.class Lex/NullLiteral.class Lex/NumericLiteral.class \
Lex/Operator.class Lex/Separator.class Lex/StringLiteral.class \
Lex/Token.class Lex/TraditionalComment.class Lex/WhiteSpace.class \
-Analysis/Flag/FlagState.class Analysis/CallGraph/CallGraph.class
+Analysis/Flag/FlagState.class Analysis/Flag/FlagAnalysis.class \
+Analysis/CallGraph/CallGraph.class
all: Parse/Sym.class Parse/Parser.class $(CLASSFILES)
javac -cp ../cup:.:$(CLASSPATH) $<
clean:
- rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h Analysis/*.class Analysis/Flag/*.class
+ rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class