changeset 18153:ff694c40bdee

LIRGenerationResult: add buildFrameMap() and getFrameMap().
author Josef Eisl <josef.eisl@jku.at>
date Wed, 22 Oct 2014 16:54:51 +0200
parents 04b54406c292
children 1c4a1a46e891
files graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMapBuilder.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResult.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerationResultBase.java
diffstat 7 files changed, 60 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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();
--- 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);
--- 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;
+    }
 }
--- 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
--- 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();
--- 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;
+    }
+
 }