WALA/com.ibm.wala.ide/src/com/ibm/wala/ide/ui/IFDSExplorer.java

116 lines
3.7 KiB
Java

/*******************************************************************************
* Copyright (c) 2002 - 2006 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.ide.ui;
import java.io.File;
import java.util.Collection;
import java.util.Properties;
import com.ibm.wala.dataflow.IFDS.TabulationResult;
import com.ibm.wala.properties.WalaProperties;
import com.ibm.wala.util.WalaException;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.graph.Graph;
import com.ibm.wala.util.graph.InferGraphRoots;
import com.ibm.wala.viz.DotUtil;
import com.ibm.wala.viz.NodeDecorator;
/**
* Explore the result of an IFDS problem with an SWT viewer and ghostview.
*/
public class IFDSExplorer {
/**
* absolute path name to invoke dot
*/
protected static String dotExe = null;
/**
* Absolute path name to invoke viewer
*/
protected static String viewerExe = null;
private static final boolean PRINT_DOMAIN = true;
public static void setDotExe(String newDotExe) {
dotExe = newDotExe;
}
public static void setGvExe(String newGvExe) {
viewerExe = newGvExe;
}
public static <T, P, F> void viewIFDS(TabulationResult<T, P, F> r, Collection<? extends P> roots) throws WalaException {
viewIFDS(r, roots, null);
}
public static <T, P, F> void viewIFDS(TabulationResult<T, P, F> r, Collection<? extends P> roots, NodeDecorator<T> labels)
throws WalaException {
Properties p = null;
try {
p = WalaProperties.loadProperties();
} catch (WalaException e) {
e.printStackTrace();
Assertions.UNREACHABLE();
}
String scratch = p.getProperty(WalaProperties.OUTPUT_DIR);
viewIFDS(r, roots, labels, scratch);
}
public static <T, P, F> void viewIFDS(TabulationResult<T, P, F> r, Collection<? extends P> roots, NodeDecorator<T> labels,
String scratchDirectory) throws WalaException {
if (r == null) {
throw new IllegalArgumentException("r is null");
}
assert dotExe != null;
// dump the domain to stderr
if (PRINT_DOMAIN) {
System.err.println("Domain:\n" + r.getProblem().getDomain().toString());
}
String irFileName = "ir." + DotUtil.getOutputType().suffix;
String outputFile = scratchDirectory + File.separatorChar + irFileName;
String dotFile = scratchDirectory + File.separatorChar + "ir.dt";
final SWTTreeViewer v = new SWTTreeViewer();
Graph<? extends P> g = r.getProblem().getSupergraph().getProcedureGraph();
v.setGraphInput(g);
v.setBlockInput(true);
v.setRootsInput(roots);
ViewIFDSLocalAction<T, P, F> action = (labels == null ? new ViewIFDSLocalAction<>(v, r, outputFile, dotFile, dotExe,
viewerExe) : new ViewIFDSLocalAction<>(v, r, outputFile, dotFile, dotExe, viewerExe, labels));
v.getPopUpActions().add(action);
v.run();
}
/**
* Calls {@link #viewIFDS(TabulationResult)} with roots computed by {@link InferGraphRoots}.
*/
public static <T, P, F> void viewIFDS(TabulationResult<T, P, F> r) throws WalaException {
if (r == null) {
throw new IllegalArgumentException("null r");
}
Collection<? extends P> roots = InferGraphRoots.inferRoots(r.getProblem().getSupergraph().getProcedureGraph());
viewIFDS(r, roots);
}
public static String getDotExe() {
return dotExe;
}
public static String getGvExe() {
return viewerExe;
}
}