changeset 23087:d95078df25d0

8144083 [JVMCI] CompilationResult should be finalized by JVMCI compiler and made effectively final
author Doug Simon <doug.simon@oracle.com>
date Thu, 26 Nov 2015 01:10:48 +0100
parents 089d48dfe8ce
children af27bea6a8f1
files graal/com.oracle.graal.asm.test/src/com/oracle/graal/asm/test/AssemblerTest.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/JVMCIErrorTest.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalCompiler.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilationResultBuilderFactory.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompiler.java
diffstat 8 files changed, 121 insertions(+), 224 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.test/src/com/oracle/graal/asm/test/AssemblerTest.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.asm.test/src/com/oracle/graal/asm/test/AssemblerTest.java	Thu Nov 26 01:10:48 2015 +0100
@@ -75,6 +75,7 @@
             byte[] targetCode = test.generateCode(compResult, codeCache.getTarget(), registerConfig, cc);
             compResult.setTargetCode(targetCode, targetCode.length);
             compResult.setTotalFrameSize(0);
+            compResult.close();
 
             InstalledCode code = codeCache.addCode(method, compResult, null, null);
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java	Thu Nov 26 01:10:48 2015 +0100
@@ -345,7 +345,6 @@
             FrameMap frameMap = lirGenRes.getFrameMap();
             CompilationResultBuilder crb = backend.newCompilationResultBuilder(lirGenRes, frameMap, compilationResult, factory);
             backend.emitCode(crb, lirGenRes.getLIR(), installedCodeOwner);
-            crb.finish();
             if (assumptions != null && !assumptions.isEmpty()) {
                 compilationResult.setAssumptions(assumptions.toArray());
             }
@@ -353,7 +352,7 @@
                 compilationResult.setMethods(rootMethod, inlinedMethods);
                 compilationResult.setBytecodeSize(bytecodeSize);
             }
-
+            crb.finish();
             if (Debug.isMeterEnabled()) {
                 List<DataPatch> ldp = compilationResult.getDataPatches();
                 JavaKind[] kindValues = JavaKind.values();
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java	Thu Nov 26 01:10:48 2015 +0100
@@ -324,11 +324,9 @@
         RegisterConfig regConfig = frameMap.getRegisterConfig();
         HotSpotVMConfig config = config();
         Label unverifiedStub = installedCodeOwner == null || installedCodeOwner.isStatic() ? null : new Label();
-        boolean hasUnsafeAccess = crb.compilationResult.hasUnsafeAccess();
-        int i = 0;
-        do {
+        for (int i = 0; i < 2; i++) {
             if (i > 0) {
-                crb.reset();
+                crb.resetForEmittingCode();
                 lir.resetLabels();
                 resetDelayedControlTransfers(lir);
             }
@@ -358,9 +356,7 @@
 
             // Emit code for the LIR
             crb.emit(lir);
-        } while (i++ < 1);
-        // Restore the unsafeAccess flag
-        crb.compilationResult.setHasUnsafeAccess(hasUnsafeAccess);
+        }
         profileInstructions(lir, crb);
 
         HotSpotFrameContext frameContext = (HotSpotFrameContext) crb.frameContext;
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/JVMCIErrorTest.java	Thu Nov 26 00:55:12 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * 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, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.graal.hotspot.test;
-
-import java.util.function.Consumer;
-
-import jdk.vm.ci.code.CompilationResult;
-import jdk.vm.ci.code.CompilationResult.ConstantReference;
-import jdk.vm.ci.code.CompilationResult.DataPatch;
-import jdk.vm.ci.code.CompilationResult.DataSectionReference;
-import jdk.vm.ci.code.CompilationResult.Infopoint;
-import jdk.vm.ci.code.CompilationResult.Reference;
-import jdk.vm.ci.code.DataSection.Data;
-import jdk.vm.ci.code.DataSection.DataBuilder;
-import jdk.vm.ci.code.InfopointReason;
-import jdk.vm.ci.common.JVMCIError;
-import jdk.vm.ci.hotspot.HotSpotConstant;
-import jdk.vm.ci.meta.Assumptions.Assumption;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.VMConstant;
-
-import org.junit.Test;
-
-import com.oracle.graal.compiler.test.GraalCompilerTest;
-
-public class JVMCIErrorTest extends GraalCompilerTest {
-
-    public static void testMethod() {
-    }
-
-    private void test(Consumer<CompilationResult> modify) {
-        ResolvedJavaMethod method = getResolvedJavaMethod("testMethod");
-        CompilationResult compResult = compile(method, null);
-
-        modify.accept(compResult);
-
-        getCodeCache().addCode(method, compResult, null, null);
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidAssumption() {
-        test(r -> r.setAssumptions(new Assumption[]{new InvalidAssumption()}));
-    }
-
-    private static class InvalidAssumption extends Assumption {
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidAlignment() {
-        test(r -> r.getDataSection().insertData(new Data(7, 1, DataBuilder.zero(1))));
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidDataSectionReference() {
-        test(r -> {
-            DataSectionReference ref = r.getDataSection().insertData(new Data(1, 1, DataBuilder.zero(1)));
-            Data data = new Data(1, 1, (buffer, patch) -> {
-                patch.accept(new DataPatch(buffer.position(), ref));
-                buffer.put((byte) 0);
-            });
-            r.getDataSection().insertData(data);
-        });
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidNarrowMethodInDataSection() {
-        test(r -> {
-            ResolvedJavaMethod method = getResolvedJavaMethod("testMethod");
-            HotSpotConstant c = (HotSpotConstant) method.getEncoding();
-            Data data = new Data(4, 4, (buffer, patch) -> {
-                patch.accept(new DataPatch(buffer.position(), new ConstantReference((VMConstant) c.compress())));
-                buffer.putInt(0);
-            });
-            r.getDataSection().insertData(data);
-        });
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidConstantInDataSection() {
-        test(r -> {
-            Data data = new Data(1, 1, (buffer, patch) -> {
-                patch.accept(new DataPatch(buffer.position(), new ConstantReference(new InvalidVMConstant())));
-            });
-            r.getDataSection().insertData(data);
-        });
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidConstantInCode() {
-        test(r -> r.recordDataPatch(0, new ConstantReference(new InvalidVMConstant())));
-    }
-
-    private static class InvalidVMConstant implements VMConstant {
-
-        public boolean isDefaultForKind() {
-            return false;
-        }
-
-        public String toValueString() {
-            return null;
-        }
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidReference() {
-        test(r -> r.recordDataPatch(0, new InvalidReference()));
-    }
-
-    private static class InvalidReference extends Reference {
-
-        @Override
-        public int hashCode() {
-            return 0;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            return false;
-        }
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testOutOfBoundsDataSectionReference() {
-        test(r -> {
-            DataSectionReference ref = new DataSectionReference();
-            ref.setOffset(0x1000);
-            r.recordDataPatch(0, ref);
-        });
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidMark() {
-        test(r -> r.recordMark(0, new Object()));
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInvalidMarkInt() {
-        test(r -> r.recordMark(0, -1));
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testUnknownInfopointReason() {
-        test(r -> r.addInfopoint(new Infopoint(0, null, InfopointReason.UNKNOWN)));
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testInfopointMissingDebugInfo() {
-        test(r -> r.addInfopoint(new Infopoint(0, null, InfopointReason.METHOD_START)));
-    }
-
-    @Test(expected = JVMCIError.class)
-    public void testSafepointMissingDebugInfo() {
-        test(r -> r.addInfopoint(new Infopoint(0, null, InfopointReason.SAFEPOINT)));
-    }
-}
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalCompiler.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalCompiler.java	Thu Nov 26 01:10:48 2015 +0100
@@ -137,10 +137,10 @@
             // all code after the OSR loop is never executed.
             optimisticOpts.remove(Optimization.RemoveNeverExecutedCode);
         }
-        CompilationResult result = GraalCompiler.compileGraph(graph, cc, method, providers, backend, getGraphBuilderSuite(providers, isOSR), optimisticOpts, profilingInfo, suites, lirSuites,
-                        new CompilationResult(), CompilationResultBuilderFactory.Default);
-
+        CompilationResult result = new CompilationResult();
         result.setEntryBCI(entryBCI);
+        GraalCompiler.compileGraph(graph, cc, method, providers, backend, getGraphBuilderSuite(providers, isOSR), optimisticOpts, profilingInfo, suites, lirSuites, result,
+                        CompilationResultBuilderFactory.Default);
 
         if (!isOSR) {
             ProfilingInfo profile = method.getProfilingInfo();
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Thu Nov 26 01:10:48 2015 +0100
@@ -147,7 +147,7 @@
     /**
      * Sets the {@linkplain CompilationResult#setTargetCode(byte[], int) code} and
      * {@linkplain CompilationResult#recordExceptionHandler(int, int) exception handler} fields of
-     * the compilation result.
+     * the compilation result and then {@linkplain #closeCompilationResult() closes} it.
      */
     public void finish() {
         int position = asm.position();
@@ -160,6 +160,14 @@
                 compilationResult.recordExceptionHandler(codeOffset, ei.exceptionEdge.label().position());
             }
         }
+        closeCompilationResult();
+    }
+
+    /**
+     * Calls {@link CompilationResult#close()} on {@link #compilationResult}.
+     */
+    protected void closeCompilationResult() {
+        compilationResult.close();
     }
 
     public void recordExceptionHandlers(int pcOffset, LIRFrameState info) {
@@ -417,9 +425,9 @@
         }
     }
 
-    public void reset() {
+    public void resetForEmittingCode() {
         asm.reset();
-        compilationResult.reset();
+        compilationResult.resetForEmittingCode();
         if (exceptionInfoList != null) {
             exceptionInfoList.clear();
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilationResultBuilderFactory.java	Thu Nov 26 01:10:48 2015 +0100
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.truffle;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import jdk.vm.ci.code.CodeCacheProvider;
+import jdk.vm.ci.code.CompilationResult;
+import jdk.vm.ci.meta.Assumptions.Assumption;
+
+import com.oracle.graal.asm.Assembler;
+import com.oracle.graal.compiler.common.spi.ForeignCallsProvider;
+import com.oracle.graal.lir.asm.CompilationResultBuilder;
+import com.oracle.graal.lir.asm.CompilationResultBuilderFactory;
+import com.oracle.graal.lir.asm.FrameContext;
+import com.oracle.graal.lir.framemap.FrameMap;
+import com.oracle.graal.nodes.StructuredGraph;
+import com.oracle.graal.truffle.nodes.AssumptionValidAssumption;
+
+/**
+ * A mechanism for Truffle to update a {@link CompilationResult} before it is
+ * {@linkplain CompilationResult#close() closed} by the Graal compiler.
+ */
+class TruffleCompilationResultBuilderFactory implements CompilationResultBuilderFactory {
+
+    /**
+     * The graph being compiled.
+     */
+    private final StructuredGraph graph;
+
+    /**
+     * List into which {@link AssumptionValidAssumption}s are added.
+     */
+    private final List<AssumptionValidAssumption> validAssumptions;
+
+    public TruffleCompilationResultBuilderFactory(StructuredGraph graph, List<AssumptionValidAssumption> validAssumptions) {
+        this.graph = graph;
+        this.validAssumptions = validAssumptions;
+    }
+
+    public CompilationResultBuilder createBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext,
+                    CompilationResult compilationResult) {
+        return new CompilationResultBuilder(codeCache, foreignCalls, frameMap, asm, frameContext, compilationResult) {
+            @Override
+            protected void closeCompilationResult() {
+                CompilationResult result = this.compilationResult;
+                result.setMethods(graph.method(), graph.getInlinedMethods());
+                result.setBytecodeSize(graph.getBytecodeSize());
+
+                Set<Assumption> newAssumptions = new HashSet<>();
+                for (Assumption assumption : graph.getAssumptions()) {
+                    TruffleCompilationResultBuilderFactory.processAssumption(newAssumptions, assumption, validAssumptions);
+                }
+
+                if (result.getAssumptions() != null) {
+                    for (Assumption assumption : result.getAssumptions()) {
+                        TruffleCompilationResultBuilderFactory.processAssumption(newAssumptions, assumption, validAssumptions);
+                    }
+                }
+
+                result.setAssumptions(newAssumptions.toArray(new Assumption[newAssumptions.size()]));
+                super.closeCompilationResult();
+            }
+        };
+    }
+
+    static void processAssumption(Set<Assumption> newAssumptions, Assumption assumption, List<AssumptionValidAssumption> manual) {
+        if (assumption != null) {
+            if (assumption instanceof AssumptionValidAssumption) {
+                AssumptionValidAssumption assumptionValidAssumption = (AssumptionValidAssumption) assumption;
+                manual.add(assumptionValidAssumption);
+            } else {
+                newAssumptions.add(assumption);
+            }
+        }
+    }
+}
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompiler.java	Thu Nov 26 00:55:12 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompiler.java	Thu Nov 26 01:10:48 2015 +0100
@@ -27,16 +27,13 @@
 import static jdk.vm.ci.code.CodeUtil.getCallingConvention;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import jdk.vm.ci.code.CallingConvention;
 import jdk.vm.ci.code.CallingConvention.Type;
 import jdk.vm.ci.code.CodeCacheProvider;
 import jdk.vm.ci.code.CompilationResult;
 import jdk.vm.ci.code.InstalledCode;
-import jdk.vm.ci.meta.Assumptions.Assumption;
 import jdk.vm.ci.meta.ConstantReflectionProvider;
 import jdk.vm.ci.meta.MetaAccessProvider;
 import jdk.vm.ci.meta.ResolvedJavaType;
@@ -50,7 +47,6 @@
 import com.oracle.graal.debug.DebugEnvironment;
 import com.oracle.graal.debug.DebugMemUseTracker;
 import com.oracle.graal.debug.DebugTimer;
-import com.oracle.graal.lir.asm.CompilationResultBuilderFactory;
 import com.oracle.graal.lir.phases.LIRSuites;
 import com.oracle.graal.nodes.StructuredGraph;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
@@ -178,6 +174,8 @@
         }
 
         CompilationResult result = null;
+        List<AssumptionValidAssumption> validAssumptions = new ArrayList<>();
+        TruffleCompilationResultBuilderFactory factory = new TruffleCompilationResultBuilderFactory(graph, validAssumptions);
         try (DebugCloseable a = CompilationTime.start(); Scope s = Debug.scope("TruffleGraal.GraalCompiler", graph, providers.getCodeCache()); DebugCloseable c = CompilationMemUse.start()) {
             SpeculationLog speculationLog = graph.getSpeculationLog();
             if (speculationLog != null) {
@@ -187,31 +185,13 @@
             CodeCacheProvider codeCache = providers.getCodeCache();
             CallingConvention cc = getCallingConvention(codeCache, Type.JavaCallee, graph.method(), false);
             CompilationResult compilationResult = new CompilationResult(name);
-            result = compileGraph(graph, cc, graph.method(), providers, backend, graphBuilderSuite, Optimizations, getProfilingInfo(graph), suites, lirSuites, compilationResult,
-                            CompilationResultBuilderFactory.Default);
+            result = compileGraph(graph, cc, graph.method(), providers, backend, graphBuilderSuite, Optimizations, getProfilingInfo(graph), suites, lirSuites, compilationResult, factory);
         } catch (Throwable e) {
             throw Debug.handle(e);
         }
 
         compilationNotify.notifyCompilationGraalTierFinished((OptimizedCallTarget) predefinedInstalledCode, graph);
 
-        result.setMethods(graph.method(), graph.getInlinedMethods());
-        result.setBytecodeSize(graph.getBytecodeSize());
-
-        List<AssumptionValidAssumption> validAssumptions = new ArrayList<>();
-        Set<Assumption> newAssumptions = new HashSet<>();
-        for (Assumption assumption : graph.getAssumptions()) {
-            processAssumption(newAssumptions, assumption, validAssumptions);
-        }
-
-        if (result.getAssumptions() != null) {
-            for (Assumption assumption : result.getAssumptions()) {
-                processAssumption(newAssumptions, assumption, validAssumptions);
-            }
-        }
-
-        result.setAssumptions(newAssumptions.toArray(new Assumption[newAssumptions.size()]));
-
         InstalledCode installedCode;
         try (Scope s = Debug.scope("CodeInstall", providers.getCodeCache()); DebugCloseable a = CodeInstallationTime.start(); DebugCloseable c = CodeInstallationMemUse.start()) {
             installedCode = providers.getCodeCache().addCode(graph.method(), result, graph.getSpeculationLog(), predefinedInstalledCode);
@@ -228,17 +208,6 @@
 
     protected abstract PhaseSuite<HighTierContext> createGraphBuilderSuite();
 
-    public void processAssumption(Set<Assumption> newAssumptions, Assumption assumption, List<AssumptionValidAssumption> manual) {
-        if (assumption != null) {
-            if (assumption instanceof AssumptionValidAssumption) {
-                AssumptionValidAssumption assumptionValidAssumption = (AssumptionValidAssumption) assumption;
-                manual.add(assumptionValidAssumption);
-            } else {
-                newAssumptions.add(assumption);
-            }
-        }
-    }
-
     public PartialEvaluator getPartialEvaluator() {
         return partialEvaluator;
     }