package net.sf.orcc.backends.c.dal; import java.util.Collection; import java.util.HashSet; import java.util.Set; import net.sf.orcc.OrccRuntimeException; import net.sf.orcc.ir.Arg; import net.sf.orcc.ir.ArgByRef; import net.sf.orcc.ir.ArgByVal; import net.sf.orcc.ir.ExprBinary; import net.sf.orcc.ir.ExprBool; import net.sf.orcc.ir.ExprInt; import net.sf.orcc.ir.ExprString; import net.sf.orcc.ir.ExprUnary; import net.sf.orcc.ir.ExprVar; import net.sf.orcc.ir.Expression; import net.sf.orcc.ir.InstAssign; import net.sf.orcc.ir.InstCall; import net.sf.orcc.ir.InstLoad; import net.sf.orcc.ir.Var; import net.sf.orcc.ir.util.AbstractIrVisitor; /** * Get a collection of the uses of vars in an expression tree * * @author James Guthrie * */ public class GetVars extends AbstractIrVisitor<Collection<Var>> { private Set<Var> vars; public GetVars() { super(true); vars = new HashSet<Var>(); } @Override public Collection<Var> caseExpression(Expression expr) { throw new OrccRuntimeException("Unhandled expression type: " + expr.getClass()); } @Override public Collection<Var> caseExprInt(ExprInt exprInt) { return new HashSet<Var>(); } @Override public Collection<Var> caseExprString(ExprString exprString) { return new HashSet<Var>(); } @Override public Collection<Var> caseExprBinary(ExprBinary exprBinary) { vars.addAll(doSwitch(exprBinary.getE1())); vars.addAll(doSwitch(exprBinary.getE2())); return new HashSet<Var>(vars); } @Override public Collection<Var> caseExprBool(ExprBool exprBool) { return new HashSet<Var>(); } @Override public Collection<Var> caseExprUnary(ExprUnary exprUnary) { vars.addAll(doSwitch(exprUnary.getExpr())); return new HashSet<Var>(vars); } @Override public Collection<Var> caseArgByVal(ArgByVal arg) { return doSwitch(arg.getValue()); } @Override public Collection<Var> caseArgByRef(ArgByRef arg) { vars.add(arg.getUse().getVariable()); return new HashSet<Var>(vars); } @Override public Collection<Var> caseInstAssign(InstAssign instAssign) { vars.addAll(doSwitch(instAssign.getValue())); return new HashSet<Var>(vars); } @Override public Collection<Var> caseInstLoad(InstLoad instLoad) { for (Expression e : instLoad.getIndexes()) { vars.addAll(doSwitch(e)); } return new HashSet<Var>(vars); } @Override public Collection<Var> caseInstCall(InstCall instCall) { for (Arg a : instCall.getArguments()) { vars.addAll(doSwitch(a)); } return new HashSet<Var>(vars); } @Override public Collection<Var> caseExprVar(ExprVar exprVar) { vars.add(exprVar.getUse().getVariable()); return new HashSet<Var>(vars); } }