package x10.wala.ipa.callgraph; import x10.wala.analysis.typeInference.AstX10TypeInference; import x10.wala.ssa.AstX10InstructionVisitor; import x10.wala.ssa.AtStmtInstruction; import x10.wala.ssa.AtomicInstruction; import x10.wala.ssa.FinishInstruction; import x10.wala.ssa.HereInstruction; import x10.wala.ssa.NextInstruction; import x10.wala.ssa.IterHasNextInstruction; import x10.wala.ssa.IterInitInstruction; import x10.wala.ssa.IterNextInstruction; import x10.wala.ssa.TupleInstruction; import com.ibm.wala.analysis.typeInference.TypeInference; import com.ibm.wala.cast.ipa.callgraph.AstSSAPropagationCallGraphBuilder; import com.ibm.wala.cast.java.ipa.callgraph.AstJavaSSAPropagationCallGraphBuilder; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.impl.ExplicitCallGraph; import com.ibm.wala.ipa.callgraph.propagation.PointerKeyFactory; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IR; import com.ibm.wala.util.debug.Assertions; public class AstX10SSAPropagationCallGraphBuilder extends AstJavaSSAPropagationCallGraphBuilder { protected AstX10SSAPropagationCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache, PointerKeyFactory pointerKeyFactory) { super(cha, options, cache, pointerKeyFactory); } protected TypeInference makeTypeInference(IR ir, IClassHierarchy cha) { TypeInference ti= new AstX10TypeInference(ir, cha, true); ti.solve(); if (DEBUG_TYPE_INFERENCE) { System.err.println("IR of " + ir.getMethod()); System.err.println(ir); System.err.println("TypeInference of " + ir.getMethod()); for(int i= 0; i < ir.getSymbolTable().getMaxValueNumber(); i++) { if (ti.isUndefined(i)) { System.err.println(" value " + i + " is undefined"); } else { System.err.println(" value " + i + " has type " + ti.getType(i)); } } } return ti; } protected class AstX10InterestingVisitor extends AstJavaInterestingVisitor implements AstX10InstructionVisitor { protected AstX10InterestingVisitor(int vn) { super(vn); } public void visitAtomic(AtomicInstruction instruction) { Assertions.UNREACHABLE("Query of interestingness of value number for Atomic???"); } public void visitFinish(FinishInstruction instruction) { Assertions.UNREACHABLE("Query of interestingness of value number for Finish???"); } public void visitNext(NextInstruction instruction) { Assertions.UNREACHABLE("Query of interestingness of value number for Finish???"); } public void visitIterInit(IterInitInstruction instruction) { Assertions.productionAssertion(instruction.getUse(0) == vn, "regionIterInit instruction has bogus use/def info?"); bingo= true; } public void visitIterHasNext(IterHasNextInstruction instruction) { } public void visitIterNext(IterNextInstruction instruction) { Assertions.productionAssertion(instruction.getUse(0) == vn, "regionIterNext instruction has bogus use/def info?"); bingo= true; } public void visitHere(HereInstruction instruction) { Assertions.UNREACHABLE("Query of interestingness of value number for Here???"); } public void visitTuple(TupleInstruction instruction) { Assertions.productionAssertion(instruction.getUse(0) == vn, "newTuple instruction has bogus use/def info?"); bingo= true; } public void visitAtStmt(final AtStmtInstruction atStmtInstruction) { // Do nothing. } } @Override protected InterestingVisitor makeInterestingVisitor(CGNode node, int vn) { return new AstX10InterestingVisitor(vn); } protected static class AstX10ConstraintVisitor extends AstJavaConstraintVisitor implements AstX10InstructionVisitor { public AstX10ConstraintVisitor(AstSSAPropagationCallGraphBuilder builder, ExplicitCallGraph.ExplicitNode node) { super(builder, node); } public void visitAtomic(AtomicInstruction instruction) { // NOOP } public void visitFinish(FinishInstruction instruction) { // NOOP } public void visitNext(NextInstruction instruction) { // NOOP } public void visitIterInit(IterInitInstruction instruction) { // TODO model data flow for future/force } public void visitIterHasNext(IterHasNextInstruction instruction) { // NOOP: no flow through this kind of instruction } public void visitIterNext(IterNextInstruction instruction) { // TODO model data flow for future/force } public void visitHere(HereInstruction instruction) { // TODO model data flow for here } public void visitTuple(TupleInstruction tupleInstruction) { // TODO model data flow for newTuple } public void visitAtStmt(final AtStmtInstruction atStmtInstruction) { // Do nothing. } } protected ConstraintVisitor makeVisitor(ExplicitCallGraph.ExplicitNode node) { return new AstX10ConstraintVisitor(this, node); } }