/****************************************************************************** * Copyright (c) 2009 - 2015 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *****************************************************************************/ package com.ibm.wala.memsat.frontEnd.engine; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import org.eclipse.jdt.core.dom.CompilationUnit; import com.ibm.wala.cast.java.client.ECJJavaSourceAnalysisEngine; import com.ibm.wala.cast.java.translator.SourceModuleTranslator; import com.ibm.wala.cast.java.translator.jdt.JDTJava2CAstTranslator; import com.ibm.wala.cast.java.translator.jdt.ecj.ECJClassLoaderFactory; import com.ibm.wala.cast.java.translator.jdt.ecj.ECJSourceLoaderImpl; import com.ibm.wala.cast.java.translator.jdt.ecj.ECJSourceModuleTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.cast.tree.impl.RangePosition; import com.ibm.wala.cast.tree.rewrite.AstLoopUnwinder; import com.ibm.wala.classLoader.ClassLoaderFactory; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.classLoader.SourceDirectoryTreeModule; import com.ibm.wala.ipa.callgraph.AnalysisOptions; 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.IClassHierarchy; import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.MonitorUtil.IProgressMonitor; import com.ibm.wala.util.config.SetOfClasses; public class MiniaturECJJavaAnalysisEngine extends ECJJavaSourceAnalysisEngine implements MiniaturAnalysisEngine { // private final static int defaultLoopUnrollDepth = 3; private final int unrollDepth; private List<MethodReference> methods; public MiniaturECJJavaAnalysisEngine(int unrollDepth, List<MethodReference> methods) { super(); this.unrollDepth = unrollDepth; this.methods = methods; } @Override protected ClassLoaderFactory getClassLoaderFactory(SetOfClasses exclusions) { return new ECJClassLoaderFactory(exclusions) { @Override protected ECJSourceLoaderImpl makeSourceLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent) throws IOException { return new ECJSourceLoaderImpl(classLoaderReference, parent, getExclusions(), cha) { @Override protected SourceModuleTranslator getTranslator() { return new ECJSourceModuleTranslator(cha.getScope(), this) { @Override protected JDTJava2CAstTranslator makeCAstTranslator(CompilationUnit astRoot, String fullPath) { return new JDTJava2CAstTranslator<Position>(sourceLoader, astRoot, fullPath, true) { @Override public CAstEntity translateToCAst() { CAstEntity ast = super.translateToCAst(); AstLoopUnwinder unwind = new AstLoopUnwinder(new CAstImpl(), true, unrollDepth); return unwind.translate(ast); } @Override public Position makePosition(int start, int end) { try { return new RangePosition(new URL("file://" + fullPath), this.cu.getLineNumber(start), start, end); } catch (MalformedURLException e) { throw new RuntimeException("bad file: " + fullPath, e); } } }; } }; } }; } }; } public void buildAnalysisScope() throws IOException { super.buildAnalysisScope(); } public CallGraphBuilder buildCallGraph(IClassHierarchy cha, AnalysisOptions options, boolean savePointerAnalysis, IProgressMonitor monitor) throws com.ibm.wala.util.CancelException { return super.buildCallGraph(cha, options, savePointerAnalysis, monitor); } public IClassHierarchy getClassHierarchy() { if (super.getClassHierarchy() == null) { setClassHierarchy( buildClassHierarchy() ); } return super.getClassHierarchy(); } public PointerAnalysis getPointerAnalysis() { return super.getPointerAnalysis(); } public Iterable<Entrypoint> getEntrypoints() { return new MiniaturJavaEntrypoints(methods, getClassHierarchy()); } public void addSourceModule(String relativeName) { String testSourceDirName = System.getProperty("user.dir") + File.separator + relativeName; File srcFile = new File(testSourceDirName); assert srcFile.exists() : "cannot find " + srcFile; addSourceModule(new SourceDirectoryTreeModule( srcFile )); } }