Mercurial > hg > graal-compiler
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; }