# HG changeset patch # User Josef Eisl # Date 1413989691 -7200 # Node ID ff694c40bdee7f0aba1ae05393cf53de8d78c9e1 # Parent 04b54406c2928422c88766db737c888030e553ee LIRGenerationResult: add buildFrameMap() and getFrameMap(). diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Wed Oct 22 16:54:51 2014 +0200 @@ -158,7 +158,7 @@ try (Scope s = Debug.scope("Allocator")) { if (backend.shouldAllocateRegisters()) { - LinearScan.allocate(target, lir, frameMap); + LinearScan.allocate(target, lirGenRes); } } catch (Throwable e) { throw Debug.handle(e); diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Oct 22 16:54:51 2014 +0200 @@ -269,7 +269,7 @@ try (Scope s = Debug.scope("Allocator", nodeLirGen)) { if (backend.shouldAllocateRegisters()) { - LinearScan.allocate(target, lir, frameMapBuilder); + LinearScan.allocate(target, lirGenRes); } } catch (Throwable e) { throw Debug.handle(e); @@ -295,7 +295,7 @@ public static void emitCode(Backend backend, Assumptions assumptions, LIRGenerationResult lirGenRes, CompilationResult compilationResult, ResolvedJavaMethod installedCodeOwner, CompilationResultBuilderFactory factory) { - FrameMap frameMap = (FrameMap) lirGenRes.getFrameMapBuilder(); + FrameMap frameMap = lirGenRes.getFrameMap(); CompilationResultBuilder crb = backend.newCompilationResultBuilder(lirGenRes, frameMap, compilationResult, factory); backend.emitCode(crb, lirGenRes.getLIR(), installedCodeOwner); crb.finish(); diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Oct 22 16:54:51 2014 +0200 @@ -45,6 +45,7 @@ import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; import com.oracle.graal.lir.StandardOp.MoveOp; +import com.oracle.graal.lir.gen.*; import com.oracle.graal.nodes.*; import com.oracle.graal.options.*; import com.oracle.graal.phases.util.*; @@ -58,6 +59,7 @@ public final class LinearScan { final TargetDescription target; + final LIRGenerationResult res; final LIR ir; final FrameMapBuilder frameMapBuilder; final RegisterAttributes[] registerAttributes; @@ -159,10 +161,11 @@ */ private final int firstVariableNumber; - public LinearScan(TargetDescription target, LIR ir, FrameMapBuilder frameMapBuilder) { + public LinearScan(TargetDescription target, LIRGenerationResult res) { this.target = target; - this.ir = ir; - this.frameMapBuilder = frameMapBuilder; + this.res = res; + this.ir = res.getLIR(); + this.frameMapBuilder = res.getFrameMapBuilder(); this.sortedBlocks = ir.linearScanOrder(); this.registerAttributes = frameMapBuilder.getRegisterConfig().getAttributesMap(); @@ -1730,7 +1733,7 @@ } private void computeDebugInfo(IntervalWalker iw, final LIRInstruction op, LIRFrameState info) { - FrameMap frameMap = (FrameMap) frameMapBuilder; + FrameMap frameMap = res.getFrameMap(); info.initDebugInfo(frameMap, !op.destroysCallerSavedRegisters() || !callKillsRegisters); markFrameLocations(iw, op, info, frameMap); @@ -1801,8 +1804,8 @@ } } - public static void allocate(TargetDescription target, LIR lir, FrameMapBuilder frameMapBuilder) { - new LinearScan(target, lir, frameMapBuilder).allocate(); + public static void allocate(TargetDescription target, LIRGenerationResult res) { + new LinearScan(target, res).allocate(); } private void allocate() { @@ -1845,7 +1848,8 @@ } try (Scope s = Debug.scope("DebugInfo")) { - frameMapBuilder.finish(); + // build frame map + res.buildFrameMap(); printIntervals("After register allocation"); printLir("After register allocation", true); diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java Wed Oct 22 16:54:51 2014 +0200 @@ -378,4 +378,10 @@ assert isConstant(location); } } + + @Override + public FrameMap buildFrameMap() { + finish(); + return this; + } } diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMapBuilder.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMapBuilder.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMapBuilder.java Wed Oct 22 16:54:51 2014 +0200 @@ -30,13 +30,6 @@ public interface FrameMapBuilder { /** - * Computes the final size of this frame. After this method has been called, methods that change - * the frame size cannot be called anymore, e.g., no more spill slots or outgoing arguments can - * be requested. - */ - void finish(); - - /** * Reserves a spill slot in the frame of the method being compiled. The returned slot is aligned * on its natural alignment, i.e., an 8-byte spill slot is aligned at an 8-byte boundary, unless * overridden by a subclass. @@ -76,4 +69,10 @@ * @param cc The calling convention for the called method. */ void callsMethod(CallingConvention cc); + + /** + * Creates a {@linkplain FrameMap} based on the information collected by this + * {@linkplain FrameMapBuilder}. + */ + FrameMap buildFrameMap(); } \ No newline at end of file diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResult.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResult.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResult.java Wed Oct 22 16:54:51 2014 +0200 @@ -25,8 +25,30 @@ import com.oracle.graal.lir.*; public interface LIRGenerationResult { + + /** + * Returns the {@link FrameMapBuilder} for collecting the information to build a + * {@link FrameMap}. + * + * This method can only be used prior calling {@link #buildFrameMap()}. + */ FrameMapBuilder getFrameMapBuilder(); + /** + * Creates a {@link FrameMap} out of the {@link FrameMapBuilder}. This method should only be + * called once. After calling it, {@link #getFrameMapBuilder()} can no longer be used. + * + * @see FrameMapBuilder#buildFrameMap() + */ + void buildFrameMap(); + + /** + * Returns the {@link FrameMap} associated with this {@link LIRGenerationResult}. + * + * This method can only be called after {@link #buildFrameMap()}. + */ + FrameMap getFrameMap(); + LIR getLIR(); boolean hasForeignCall(); diff -r 04b54406c292 -r ff694c40bdee graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResultBase.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResultBase.java Wed Oct 22 10:00:19 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResultBase.java Wed Oct 22 16:54:51 2014 +0200 @@ -27,6 +27,7 @@ public class LIRGenerationResultBase implements LIRGenerationResult { private final LIR lir; private final FrameMapBuilder frameMapBuilder; + private FrameMap frameMap; /** * Records whether the code being generated makes at least one foreign call. */ @@ -53,7 +54,18 @@ } public final FrameMapBuilder getFrameMapBuilder() { + assert frameMap == null : "getFrameMapBuilder() can only be used before calling buildFrameMap()!"; return frameMapBuilder; } + public void buildFrameMap() { + assert frameMap == null : "buildFrameMap() can only be called once!"; + frameMap = frameMapBuilder.buildFrameMap(); + } + + public FrameMap getFrameMap() { + assert frameMap != null : "getFrameMap() can only be used after calling buildFrameMap()!"; + return frameMap; + } + }