001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.compilers.opt.inlining;
014    
015    import org.jikesrvm.classloader.RVMMethod;
016    import org.jikesrvm.classloader.NormalMethod;
017    import org.jikesrvm.compilers.common.CompiledMethod;
018    import org.jikesrvm.compilers.opt.OptOptions;
019    import org.jikesrvm.compilers.opt.ir.Call;
020    import org.jikesrvm.compilers.opt.ir.Instruction;
021    
022    /**
023     * This class holds miscellaneous information regarding the state of
024     * a compilation
025     */
026    public final class CompilationState {
027    
028      /*
029       * Implementation
030       */
031      private final Instruction call;
032      private final boolean isExtant;
033      private final OptOptions options;
034      private final CompiledMethod cm;
035      private final int realBCI;
036    
037      /*
038       * Interface
039       */
040    
041      /**
042       * @param call the call instruction being considered for inlining.
043       * @param isExtant is the receiver of a virtual call an extant object?
044       * @param options controlling compiler options
045       * @param cm compiled method of the IR object being compiled
046       * @param realBCI the real bytecode index of the call instruction, not adjusted because of OSR
047       */
048      public CompilationState(Instruction call, boolean isExtant, OptOptions options, CompiledMethod cm, int realBCI) {
049        this.call = call;
050        this.isExtant = isExtant;
051        this.options = options;
052        this.cm = cm;
053        this.realBCI = realBCI;
054      }
055    
056      /**
057       * Does this state represent an invokeinterface call?
058       *
059       * @return <code>true</code> if it is an interface call
060       *         or <code>false</code> if it is not.
061       */
062      public boolean isInvokeInterface() {
063        return Call.getMethod(call).isInterface();
064      }
065    
066      /**
067       * Return the depth of inlining so far.
068       */
069      public int getInlineDepth() {
070        return call.position.getInlineDepth();
071      }
072    
073      /**
074       * Return the call instruction being considered for inlining
075       */
076      public Instruction getCallInstruction() {
077        return call;
078      }
079    
080      /**
081       * Obtain the target method from the compilation state.
082       * If a computed target is present, use it.
083       */
084      public RVMMethod obtainTarget() {
085        return Call.getMethod(call).getTarget();
086      }
087    
088      /**
089       * Return the controlling compiler options
090       */
091      public OptOptions getOptions() {
092        return options;
093      }
094    
095      /**
096       * Return whether or not the receiving object is extant
097       */
098      public boolean getIsExtant() {
099        return isExtant;
100      }
101    
102      /**
103       * Return whether or not the target is precise (ie needs no guard)
104       */
105      public boolean getHasPreciseTarget() {
106        return Call.getMethod(call).hasPreciseTarget();
107      }
108    
109      /**
110       * Return the root method of the compilation
111       */
112      public NormalMethod getRootMethod() {
113        return call.position.getRootMethod();
114      }
115    
116      /**
117       * Return the method being compiled
118       */
119      public NormalMethod getMethod() {
120        return call.position.getMethod();
121      }
122    
123      /**
124       * Return the real bytecode index associated with this call
125       */
126      public int getRealBytecodeIndex() {
127        return realBCI;
128      }
129    
130      /**
131       * Return the inlining sequence
132       */
133      public InlineSequence getSequence() {
134        return call.position;
135      }
136    
137      /**
138       * Return the compiled method
139       */
140      public CompiledMethod getCompiledMethod() {
141        return cm;
142      }
143    }