/*
* RTLStatement.java - This file is part of the Jakstab project.
* Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, see <http://www.gnu.org/licenses/>.
*/
package org.jakstab.rtl.statements;
import java.util.Set;
import org.jakstab.asm.AbsoluteAddress;
import org.jakstab.cfa.RTLLabel;
import org.jakstab.cfa.StateTransformer;
import org.jakstab.rtl.*;
import org.jakstab.rtl.expressions.RTLMemoryLocation;
import org.jakstab.rtl.expressions.SetOfVariables;
import org.jakstab.ssl.Architecture;
public interface RTLStatement extends Comparable<RTLStatement>, StateTransformer {
public void setNextLabel(RTLLabel nextLabel);
public RTLLabel getNextLabel();
/**
* Generic accept method for an statement visitor to support the
* visitor pattern. Calls the appropriate visit method in visitor
* and passes through its return value of parameterized type T.
*
* @param <T> the return type of the visit method.
* @param visitor the visitor being called.
* @return the return value of the correspoinding visit method.
*/
public <T> T accept(StatementVisitor<T> visitor);
/**
* Returns this statement evaluated in the given context.
* Evaluation may change the type of all substatements and expressions,
* and may reduce or increase the total number of objects. Only statements
* are actually modified, embedded RTLExpressions are copied on change to
* preserve their immutable property.
*
* @param context the evaluation context, used for variable assignments and
* information propagation.
* @return An evaluated copy of this statement
*/
public RTLStatement evaluate(Context context);
/**
* Returns whether this statement has already been instantiated, that is, whether
* it is not a template but a regular statement.
*
* @return true if the statement has been instantiated, false if it is a template.
*/
public boolean isInstantiated();
/**
* Returns the variables defined in this statement. At the current state of
* the implementation, this includes only registers and flags, not memory
* locations.
*
* @return A set containing all defined variables of this statement.
*/
public SetOfVariables getDefinedVariables();
/**
* Returns the variables used by this statement. At the current state of
* the implementation, this includes only registers and flags, not memory
* locations.
*
* @return A set containing all used variables of this statement.
*/
public SetOfVariables getUsedVariables();
/**
* Returns the set of memory locations used in this statement.
*
* @return the set of used memory locations.
*/
public Set<RTLMemoryLocation> getUsedMemoryLocations();
/**
* Returns the label of this statement consisting of its virtual
* address and RTL-index.
*
* @return the label of this statement.
*/
public RTLLabel getLabel();
/**
* Creates a label for this statement based on address and RTL-index.
*
* @param addr the new virtual address of this statement.
* @param rtlId the new RTL index of this statement.
*/
public void setLabel(AbsoluteAddress addr, int rtlId);
/**
* Sets the label of this instruction.
*
* @param label the label for this statement.
*/
public void setLabel(RTLLabel label);
/**
* Returns the virtual address of this statement.
*
* @return This statement's virtual address.
*/
public AbsoluteAddress getAddress();
/**
* Performs type inference on all expressions used in this statement
* which have an unknown bit width.
* @param arch TODO
*
* @throws TypeInferenceException if a bit width conflict is detected.
*/
public void inferTypes(Architecture arch) throws TypeInferenceException;
/**
* Returns a shallow copy this statement. All expressions are immutable,
* so shared expressions in the copy should not be a problem.
*
* @return a copy of this statement.
*/
public RTLStatement copy();
}