package x10.wala.client;
import java.io.IOException;
import x10.wala.client.impl.X10ZeroXCFABuilderFactory;
import x10.wala.ipa.callgraph.X10SourceAnalysisScope;
import x10.wala.ipa.cha.X10ClassHierarchy;
import com.ibm.wala.cast.ir.ssa.AstIRFactory;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.ssa.SSAOptions;
import com.ibm.wala.ssa.SymbolTable;
import com.ibm.wala.util.CancelException;
public class X10SourceAnalysisEngine {
/**
* Governing class hierarchy
*/
protected X10ClassHierarchy cha;
public X10ClassHierarchy getClassHierarchy() {
return cha;
}
public X10SourceAnalysisEngine() {
try {
cha = X10ClassHierarchy.make(new X10SourceAnalysisScope());
} catch (ClassHierarchyException e) {
System.err.println("Class Hierarchy construction failed");
}
}
public CallGraph buildCallGraph(Iterable<Entrypoint> eps) throws IllegalArgumentException, CancelException, IOException {
AnalysisCache cache = new AnalysisCache(AstIRFactory.makeDefaultFactory());
AnalysisOptions options = new AnalysisOptions(cha.getScope(), eps);
SSAOptions ssaOptions = new SSAOptions();
ssaOptions.setDefaultValues(new SSAOptions.DefaultValues() {
public int getDefaultValue(SymbolTable symtab, int valueNumber) {
return symtab.getDefaultValue(valueNumber);
}
});
options.setSSAOptions(ssaOptions);
return new X10ZeroXCFABuilderFactory().make(options, cache, cha).makeCallGraph(options, null);
}
public void buildClassHierarchy() {
try {
cha.consolidate();
} catch (ClassHierarchyException e) {
System.err.println("Class Hierarchy construction failed");
}
}
}