package dk.brics.jspointers.flowgraph.analysis; import java.util.Set; import dk.brics.tajs.flowgraph.Function; import dk.brics.tajs.flowgraph.Node; import dk.brics.tajs.optimizer2.Decorator; import dk.brics.tajs.optimizer2.FixpointSolver; /** * Determines the set of relevant live variables before and after each statement. * A variable is <em>relevant live</em> if its value can be <em>read</em> by a statement, * where <em>read</em> is defined by the provided {@link ReadVarsInterface}. */ public class Liveness { private FixpointSolver<Set<LocalVariable>> solver; /** * A liveness analysis using the {@link ReadVarsVisitor} as the definition * of read variables. * @param flowGraph flow graph * @param func function to analyze */ public Liveness(Decorator flowGraph, Function func, Set<String> privateVars) { this(flowGraph, func, privateVars, new ReadVarsVisitor()); } public Liveness(Decorator flowGraph, Function func, Set<String> privateVars, ReadVarsInterface readvars) { solver = new FixpointSolver<Set<LocalVariable>>(new LiveVarsAnalysis(flowGraph, readvars, privateVars), func); solver.solve(); } public boolean isLiveAfter(Node node, int var) { return getLiveSetAfter(node).contains(new LocalTemporaryVariable(var)); } public boolean isLiveAfter(Node node, String varname) { return getLiveSetAfter(node).contains(new LocalProgramVariable(varname)); } public boolean isLiveAfter(Node node, LocalVariable var) { return getLiveSetAfter(node).contains(var); } public boolean isLiveBefore(Node node, int var) { return getLiveSetBefore(node).contains(new LocalTemporaryVariable(var)); } public boolean isLiveBefore(Node node, String varname) { return getLiveSetBefore(node).contains(new LocalProgramVariable(varname)); } public boolean isLiveBefore(Node node, LocalVariable var) { return getLiveSetBefore(node).contains(var); } public Set<LocalVariable> getLiveSetBefore(Node node) { return solver.getLatticePoint(node); } public Set<LocalVariable> getLiveSetAfter(Node node) { return solver.getJoinPoint(node); } }