/******************************************************************************* * Copyright (c) 2008 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.examples.analysis; import java.io.IOException; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; 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.impl.Everywhere; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; import com.ibm.wala.util.config.AnalysisScopeReader; import com.ibm.wala.util.perf.Stopwatch; import com.ibm.wala.util.ref.ReferenceCleanser; /** * An analysis skeleton that simply constructs IRs for all methods in a class hierarchy. Illustrates the use of * {@link ReferenceCleanser} to improve running time / reduce memory usage. */ public class ConstructAllIRs { /** * Should we periodically clear out soft reference caches in an attempt to help the GC? */ private final static boolean PERIODIC_WIPE_SOFT_CACHES = true; /** * Interval which defines the period to clear soft reference caches */ private final static int WIPE_SOFT_CACHE_INTERVAL = 2500; /** * Counter for wiping soft caches */ private static int wipeCount = 0; /** * First command-line argument should be location of scope file for application to analyze * * @throws IOException * @throws ClassHierarchyException */ public static void main(String[] args) throws IOException, ClassHierarchyException { String scopeFile = args[0]; // measure running time Stopwatch s = new Stopwatch(); s.start(); AnalysisScope scope = AnalysisScopeReader.readJavaScope(scopeFile, null, ConstructAllIRs.class.getClassLoader()); // build a type hierarchy System.out.print("building class hierarchy..."); ClassHierarchy cha = ClassHierarchy.make(scope); System.out.println("done"); // register class hierarchy and AnalysisCache with the reference cleanser, so that their soft references are appropriately wiped ReferenceCleanser.registerClassHierarchy(cha); AnalysisCache cache = new AnalysisCache(); ReferenceCleanser.registerCache(cache); AnalysisOptions options = new AnalysisOptions(); System.out.print("building IRs..."); for (IClass klass : cha) { for (IMethod method : klass.getDeclaredMethods()) { wipeSoftCaches(); // construct an IR; it will be cached cache.getSSACache().findOrCreateIR(method, Everywhere.EVERYWHERE, options.getSSAOptions()); } } System.out.println("done"); s.stop(); System.out.println("RUNNING TIME: " + s.getElapsedMillis()); } private static void wipeSoftCaches() { if (PERIODIC_WIPE_SOFT_CACHES) { wipeCount++; if (wipeCount >= WIPE_SOFT_CACHE_INTERVAL) { wipeCount = 0; ReferenceCleanser.clearSoftCaches(); } } } }