Class IR

  • Direct Known Subclasses:
    AstIRFactory.AstIR, SyntheticIR

    public abstract class IR
    extends Object
    An SSA IR. The IR (Intermediate Representation) is the central data structure that represents the instructions of a particular method. The IR represents a method's instructions in a language close to JVM bytecode, but in an SSA-based register transfer language which eliminates the stack abstraction, relying instead on a set of symbolic registers. The IR organizes instructions in a control-flow graph of basic blocks, as typical in compiler textbooks. See http://wala.sourceforge.net/wiki/index.php/UserGuide:IR for more details on the IR API.
    • Method Detail

      • getLocalMap

        protected abstract IR.SSA2LocalMap getLocalMap()
        subclasses must provide a source name mapping, if they want one (or null otherwise)
      • getIndirectionData

        protected abstract <T extends SSAIndirectionData.NameSSAIndirectionData<T> getIndirectionData()
        subclasses must provide information about indirect use of values, if appropriate, and otherwise null
      • setupLocationMap

        protected void setupLocationMap()
        create mappings from call sites, new sites, and PEIs to instruction index
      • instructionPosition

        protected abstract String instructionPosition​(int instructionIndex)
        Returns:
        a String which is a readable representation of the instruction position corresponding to an instruction index
      • getSymbolTable

        public SymbolTable getSymbolTable()
        Returns:
        the SymbolTable managing attributes for values in this method
      • getControlFlowGraph

        public SSACFG getControlFlowGraph()
        Returns:
        the underlying ControlFlowGraph which defines this IR.
      • getParameterValueNumbers

        public int[] getParameterValueNumbers()
        Returns:
        array of value numbers representing parameters to this method
      • getParameter

        public int getParameter​(int i)
        Returns:
        the value number of the ith parameter
      • getParameterType

        public TypeReference getParameterType​(int i)
        Get the TypeReference that describes the ith parameter to this method. By convention, for a non-static method, the 0th parameter is "this".
      • getNumberOfParameters

        public int getNumberOfParameters()
        Returns:
        number of parameters to this method, including "this"
      • getMethod

        public IMethod getMethod()
        Returns:
        the method this IR represents
      • iterateCatchInstructions

        public Iterator<SSAInstruction> iterateCatchInstructions()
        Returns:
        iterator of the catch instructions in this IR
      • visitNormalInstructions

        public void visitNormalInstructions​(SSAInstruction.Visitor v)
        visit each normal (non-phi, non-pi, non-catch) instruction in this IR
      • visitAllInstructions

        public void visitAllInstructions​(SSAInstruction.Visitor v)
        visit each instruction in this IR
      • iterateNormalInstructions

        public Iterator<SSAInstruction> iterateNormalInstructions()
        Returns:
        an Iterator of all "normal" instructions on this IR
      • getExitBlock

        public SSACFG.BasicBlock getExitBlock()
        Returns:
        the exit basic block
      • getCalls

        public SSAAbstractInvokeInstruction[] getCalls​(CallSiteReference site)
        Return the invoke instructions corresponding to a call site Note that Shrike may inline JSRS. This can lead to multiple copies of a single bytecode instruction in a particular IR. So we may have more than one instruction index for a particular call site from bytecode.
      • getCallInstructionIndices

        public IntSet getCallInstructionIndices​(CallSiteReference site)
        Return the instruction indices corresponding to a call site. Note that Shrike may inline JSRS. This can lead to multiple copies of a single bytecode instruction in a particular IR. So we may have more than one instruction index for a particular call site from bytecode.
      • getNewInstructionIndex

        public int getNewInstructionIndex​(NewSiteReference site)
        Return the instruction index corresponding to an allocation site
      • getPEI

        public SSAInstruction getPEI​(ProgramCounter pc)
        Parameters:
        pc - a program counter
        Returns:
        the instruction (a PEI) at this program counter
      • getBasicBlockForInstruction

        public ISSABasicBlock getBasicBlockForInstruction​(SSAInstruction s)
        This is space-inefficient. Use with care. Be very careful; note the strange identity semantics of SSAInstruction, using ==. You can't mix SSAInstructions and IRs freely.
      • isEmptyIR

        public boolean isEmptyIR()
        TODO: why do we need this? We should enforce instructions == null if necessary, I think.
        Returns:
        true iff every instruction is null
      • getLocalNames

        public String[] getLocalNames​(int index,
                                      int vn)
        Parameters:
        index - an index into the IR instruction array
        vn - a value number
        Returns:
        if we know that immediately after the given program counter, v_vn corresponds to one or more locals and local variable names are available, the name of the locals which v_vn represents. Otherwise, null.