Mercurial > hg > graal-compiler
changeset 6378:4df5ec0f8082
Merge.
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 13 Sep 2012 11:29:18 +0200 |
parents | f3dcc071d696 (current diff) e957c9ff0bda (diff) |
children | c61ce6bac1df adf0879a41c1 |
files | |
diffstat | 27 files changed, 877 insertions(+), 428 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/EscapeAnalysisTest.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/EscapeAnalysisTest.java Thu Sep 13 11:29:18 2012 +0200 @@ -94,6 +94,7 @@ return x.intValue(); } + @Test public void testMonitor2() { test("testMonitor2Snippet", Constant.forInt(0)); }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Thu Sep 13 11:29:18 2012 +0200 @@ -163,29 +163,78 @@ Assert.assertEquals(expected, actual); } + protected void testN(int n, final String name, final Object... args) { + final Throwable[] errors = new Throwable[n]; + Thread[] threads = new Thread[n]; + for (int i = 0; i < n; i++) { + final int idx = i; + Thread t = new Thread(i + ":" + name) { + @Override + public void run() { + try { + test(name, args); + } catch (Throwable e) { + errors[idx] = e; + } + } + }; + threads[i] = t; + t.start(); + } + int failed = 0; + for (int i = 0; i < n; i++) { + try { + threads[i].join(); + } catch (InterruptedException e) { + errors[i] = e; + } + if (errors[i] != null) { + errors[i].printStackTrace(); + failed++; + } + } + Assert.assertTrue(failed + " of " + n + " failed", failed == 0); + } + protected void test(String name, Object... args) { Method method = getMethod(name); Object expect = null; + Object receiver = Modifier.isStatic(method.getModifiers()) ? null : this; Throwable exception = null; try { // This gives us both the expected return value as well as ensuring that the method to be compiled is fully resolved - expect = method.invoke(null, args); + expect = method.invoke(this, args); } catch (InvocationTargetException e) { exception = e.getTargetException(); } catch (Exception e) { throw new RuntimeException(e); } + + if (runtime == null) { + return; + } + InstalledCode compiledMethod = getCode(runtime.getResolvedJavaMethod(method), parse(method)); + Object[] executeArgs; + if (receiver == null) { + executeArgs = args; + } else { + executeArgs = new Object[args.length + 1]; + executeArgs[0] = receiver; + for (int i = 0; i < args.length; i++) { + executeArgs[i + 1] = args[i]; + } + } if (exception != null) { try { - compiledMethod.executeVarargs(args); + compiledMethod.executeVarargs(executeArgs); Assert.fail("expected " + exception); } catch (Throwable e) { Assert.assertEquals(exception.getClass(), e.getClass()); } } else { - Object actual = compiledMethod.executeVarargs(args); + Object actual = compiledMethod.executeVarargs(executeArgs); assertEquals(expect, actual); } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Sep 13 11:29:18 2012 +0200 @@ -83,7 +83,8 @@ // set the final fields compilerToVm = toVM; vmToCompiler = toCompiler; - config = compilerToVm.getConfiguration(); + config = new HotSpotVMConfig(); + compilerToVm.initializeConfiguration(config); config.check(); if (Boolean.valueOf(System.getProperty("graal.printconfig"))) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Thu Sep 13 11:29:18 2012 +0200 @@ -22,6 +22,10 @@ */ package com.oracle.graal.hotspot; +import com.oracle.graal.api.code.*; +import com.oracle.max.asm.target.amd64.*; + + /** * Used to communicate configuration details, runtime offsets, etc. to graal upon compileMethod. */ @@ -29,7 +33,7 @@ private static final long serialVersionUID = -4744897993263044184L; - private HotSpotVMConfig() { + HotSpotVMConfig() { } // os information, register layout, code generation, ... @@ -56,6 +60,11 @@ public int hubOffset; /** + * The offset of the _prototype_header field in a Klass. + */ + public int prototypeMarkWordOffset; + + /** * The offset of an the array length in an array's header. */ public int arrayLengthOffset; @@ -102,8 +111,6 @@ public int threadObjectOffset; - public int instanceHeaderPrototypeOffset; - public int threadExceptionOopOffset; public int threadExceptionPcOffset; public int threadMultiNewArrayStorageOffset; @@ -147,6 +154,9 @@ public long fastMonitorExitStub; public long verifyOopStub; + // special registers + public final Register threadRegister = AMD64.r15; + public void check() { assert vmPageSize >= 16; assert codeEntryAlignment > 0;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Thu Sep 13 11:29:18 2012 +0200 @@ -65,7 +65,7 @@ HotSpotCompiledMethod installMethod(HotSpotCompilationResult compResult, boolean makeDefault, HotSpotCodeInfo info); - HotSpotVMConfig getConfiguration(); + void initializeConfiguration(HotSpotVMConfig config); JavaMethod JavaType_resolveMethodImpl(HotSpotResolvedJavaType klass, String name, String signature); @@ -117,5 +117,7 @@ String decodePC(long pc); + long JavaType_prototypeMarkWord(HotSpotResolvedJavaType hotSpotResolvedJavaType); + // Checkstyle: resume }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Thu Sep 13 11:29:18 2012 +0200 @@ -80,7 +80,7 @@ public native HotSpotCompiledMethod installMethod(HotSpotCompilationResult comp, boolean makeDefault, HotSpotCodeInfo info); @Override - public native HotSpotVMConfig getConfiguration(); + public native void initializeConfiguration(HotSpotVMConfig config); @Override public native JavaMethod JavaType_resolveMethodImpl(HotSpotResolvedJavaType klass, String name, String signature); @@ -167,5 +167,8 @@ @Override public native String decodePC(long pc); + @Override + public native long JavaType_prototypeMarkWord(HotSpotResolvedJavaType type); + // Checkstyle: resume }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Thu Sep 13 11:29:18 2012 +0200 @@ -55,11 +55,6 @@ private boolean isInitialized; private ResolvedJavaType arrayOfType; - /** - * Initial value for the mark word in a new object of this type. - */ - private long initialMarkWord; - private HotSpotResolvedJavaType() { throw new GraalInternalError(HotSpotResolvedJavaType.class + " should only be created from C++ code"); } @@ -293,7 +288,7 @@ return superCheckOffset; } - public long initialMarkWord() { - return initialMarkWord; + public long prototypeMarkWord() { + return HotSpotGraalRuntime.getInstance().getCompilerToVM().JavaType_prototypeMarkWord(this); } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentThread.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentThread.java Thu Sep 13 11:29:18 2012 +0200 @@ -22,9 +22,9 @@ */ package com.oracle.graal.hotspot.nodes; -import com.oracle.max.asm.target.amd64.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -39,8 +39,9 @@ } @Override - public void generate(LIRGeneratorTool generator) { - generator.setResult(this, generator.emitLoad(new Address(Kind.Object, AMD64.r15.asValue(generator.target().wordKind), threadObjectOffset), false)); + public void generate(LIRGeneratorTool gen) { + Register thread = HotSpotGraalRuntime.getInstance().getConfig().threadRegister; + gen.setResult(this, gen.emitLoad(new Address(Kind.Object, thread.asValue(gen.target().wordKind), threadObjectOffset), false)); } @SuppressWarnings("unused")
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TLABAllocateNode.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TLABAllocateNode.java Thu Sep 13 11:29:18 2012 +0200 @@ -53,9 +53,6 @@ /** * @return null if allocation fails */ - /** - * @return null if allocation fails - */ @SuppressWarnings("unused") @NodeIntrinsic public static Word allocateVariableSize(int size, @ConstantNodeParameter Kind wordKind) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ArrayCopySnippets.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ArrayCopySnippets.java Thu Sep 13 11:29:18 2012 +0200 @@ -21,6 +21,8 @@ * questions. */ package com.oracle.graal.hotspot.snippets; +import static com.oracle.graal.hotspot.snippets.HotSpotSnippetUtils.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.*; @@ -209,35 +211,4 @@ } } } - - @Fold - static int arrayBaseOffset(Kind elementKind) { - return elementKind.getArrayBaseOffset(); - } - - @Fold - static int arrayIndexScale(Kind elementKind) { - return elementKind.getArrayIndexScale(); - } - - static { - assert arrayIndexScale(Kind.Byte) == 1; - assert arrayIndexScale(Kind.Boolean) == 1; - assert arrayIndexScale(Kind.Char) == 2; - assert arrayIndexScale(Kind.Short) == 2; - assert arrayIndexScale(Kind.Int) == 4; - assert arrayIndexScale(Kind.Long) == 8; - assert arrayIndexScale(Kind.Float) == 4; - assert arrayIndexScale(Kind.Double) == 8; - } - - @Fold - private static int cardTableShift() { - return HotSpotGraalRuntime.getInstance().getConfig().cardtableShift; - } - - @Fold - private static long cardTableStart() { - return HotSpotGraalRuntime.getInstance().getConfig().cardtableStartAddress; - } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Sep 13 11:29:18 2012 +0200 @@ -21,7 +21,7 @@ * questions. */ package com.oracle.graal.hotspot.snippets; -import static com.oracle.graal.hotspot.snippets.ArrayCopySnippets.*; +import static com.oracle.graal.hotspot.snippets.HotSpotSnippetUtils.*; import static com.oracle.graal.snippets.Snippet.Varargs.*; import static com.oracle.graal.snippets.SnippetTemplate.Arguments.*; @@ -37,7 +37,6 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.*; import com.oracle.graal.snippets.Snippet.ConstantParameter; -import com.oracle.graal.snippets.Snippet.Fold; import com.oracle.graal.snippets.Snippet.Parameter; import com.oracle.graal.snippets.Snippet.VarargsParameter; import com.oracle.graal.snippets.SnippetTemplate.AbstractTemplates; @@ -65,7 +64,7 @@ isNull.inc(); return object; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (objectHub != exactHub) { exactMiss.inc(); DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.ClassCastException); @@ -91,7 +90,7 @@ isNull.inc(); return object; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (UnsafeLoadNode.loadObject(objectHub, 0, superCheckOffset, true) != hub) { displayMiss.inc(); DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.ClassCastException); @@ -113,7 +112,7 @@ isNull.inc(); return object; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -143,7 +142,7 @@ isNull.inc(); return object; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -232,26 +231,6 @@ return false; } - @Fold - private static int superCheckOffsetOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().superCheckOffsetOffset; - } - - @Fold - private static int secondarySuperCacheOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().secondarySuperCacheOffset; - } - - @Fold - private static int secondarySupersOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().secondarySupersOffset; - } - - @Fold - private static int hubOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().hubOffset; - } - public static class Templates extends AbstractTemplates<CheckCastSnippets> { private final ResolvedJavaMethod exact;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java Thu Sep 13 11:29:18 2012 +0200 @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2012, 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.snippets; + +import static com.oracle.graal.nodes.extended.UnsafeLoadNode.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.Register.RegisterFlag; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.snippets.Snippet.Fold; +import com.oracle.graal.snippets.*; +import com.oracle.max.asm.target.amd64.*; + +//JaCoCo Exclude + +/** + * A collection of methods used in HotSpot snippets. + */ +public class HotSpotSnippetUtils { + + @Fold + static boolean verifyOops() { + return HotSpotGraalRuntime.getInstance().getConfig().verifyOops; + } + + @Fold + static int threadTlabTopOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().threadTlabTopOffset; + } + + @Fold + static int threadTlabEndOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().threadTlabEndOffset; + } + + @Fold + static Kind wordKind() { + return HotSpotGraalRuntime.getInstance().getTarget().wordKind; + } + + @Fold + static Register threadReg() { + return HotSpotGraalRuntime.getInstance().getConfig().threadRegister; + } + + @Fold + static Register stackPointerReg() { + return AMD64.rsp; + } + + @Fold + static int wordSize() { + return HotSpotGraalRuntime.getInstance().getTarget().wordSize; + } + + @Fold + static int pageSize() { + return HotSpotGraalRuntime.getInstance().getTarget().pageSize; + } + + @Fold + static int prototypeMarkWordOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().prototypeMarkWordOffset; + } + + @Fold + static int markOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().markOffset; + } + + @Fold + static int hubOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().hubOffset; + } + + @Fold + static int arrayLengthOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().arrayLengthOffset; + } + + @Fold + static int arrayBaseOffset(Kind elementKind) { + return elementKind.getArrayBaseOffset(); + } + + @Fold + static int arrayIndexScale(Kind elementKind) { + return elementKind.getArrayIndexScale(); + } + + @Fold + static int cardTableShift() { + return HotSpotGraalRuntime.getInstance().getConfig().cardtableShift; + } + + @Fold + static long cardTableStart() { + return HotSpotGraalRuntime.getInstance().getConfig().cardtableStartAddress; + } + + @Fold + static int superCheckOffsetOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().superCheckOffsetOffset; + } + + @Fold + static int secondarySuperCacheOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().secondarySuperCacheOffset; + } + + @Fold + static int secondarySupersOffset() { + return HotSpotGraalRuntime.getInstance().getConfig().secondarySupersOffset; + } + + /** + * Loads the hub from a object, null checking it first. + */ + static Object loadHub(Object object) { + return UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + } + + + static Object verifyOop(Object object) { + if (verifyOops()) { + VerifyOopStubCall.call(object); + } + return object; + } + + static Word asWord(Object object) { + return Word.fromObject(object); + } + + static Word loadWord(Word address, int offset) { + Object value = loadObject(address, 0, offset, true); + return asWord(value); + } + + static { + assert arrayIndexScale(Kind.Byte) == 1; + assert arrayIndexScale(Kind.Boolean) == 1; + assert arrayIndexScale(Kind.Char) == 2; + assert arrayIndexScale(Kind.Short) == 2; + assert arrayIndexScale(Kind.Int) == 4; + assert arrayIndexScale(Kind.Long) == 8; + assert arrayIndexScale(Kind.Float) == 4; + assert arrayIndexScale(Kind.Double) == 8; + } + + public static Register getStubParameterRegister(int index) { + RegisterConfig regConfig = HotSpotGraalRuntime.getInstance().getRuntime().getGlobalStubRegisterConfig(); + return regConfig.getCallingConventionRegisters(CallingConvention.Type.RuntimeCall, RegisterFlag.CPU)[index]; + } +}
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/InstanceOfSnippets.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/InstanceOfSnippets.java Thu Sep 13 11:29:18 2012 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.hotspot.snippets; import static com.oracle.graal.hotspot.snippets.CheckCastSnippets.*; import static com.oracle.graal.hotspot.snippets.CheckCastSnippets.Templates.*; +import static com.oracle.graal.hotspot.snippets.HotSpotSnippetUtils.*; import static com.oracle.graal.snippets.Snippet.Varargs.*; import static com.oracle.graal.snippets.SnippetTemplate.Arguments.*; import static com.oracle.graal.snippets.nodes.JumpNode.*; @@ -41,7 +42,6 @@ import com.oracle.graal.nodes.util.*; import com.oracle.graal.snippets.*; import com.oracle.graal.snippets.Snippet.ConstantParameter; -import com.oracle.graal.snippets.Snippet.Fold; import com.oracle.graal.snippets.Snippet.Parameter; import com.oracle.graal.snippets.Snippet.VarargsParameter; import com.oracle.graal.snippets.SnippetTemplate.AbstractTemplates; @@ -73,7 +73,7 @@ isNull.inc(); return falseValue; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (objectHub != exactHub) { exactMiss.inc(); return falseValue; @@ -95,7 +95,7 @@ jump(IfNode.FALSE_EDGE); return; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (objectHub != exactHub) { exactMiss.inc(); jump(IfNode.FALSE_EDGE); @@ -120,7 +120,7 @@ isNull.inc(); return falseValue; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (UnsafeLoadNode.loadObject(objectHub, 0, superCheckOffset, true) != hub) { displayMiss.inc(); return falseValue; @@ -143,7 +143,7 @@ jump(IfNode.FALSE_EDGE); return; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); if (UnsafeLoadNode.loadObject(objectHub, 0, superCheckOffset, true) != hub) { displayMiss.inc(); jump(IfNode.FALSE_EDGE); @@ -169,7 +169,7 @@ isNull.inc(); return falseValue; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -199,7 +199,7 @@ jump(IfNode.FALSE_EDGE); return; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -233,7 +233,7 @@ isNull.inc(); return falseValue; } - Object objectHub = UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + Object objectHub = loadHub(object); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -276,22 +276,6 @@ return false; } - @Fold - private static int secondarySuperCacheOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().secondarySuperCacheOffset; - } - - @Fold - private static int secondarySupersOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().secondarySupersOffset; - } - - @Fold - private static int hubOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().hubOffset; - } - - public static class Templates extends AbstractTemplates<InstanceOfSnippets> { private final ResolvedJavaMethod ifExact;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Thu Sep 13 11:29:18 2012 +0200 @@ -24,11 +24,10 @@ import static com.oracle.graal.hotspot.nodes.CastFromHub.*; import static com.oracle.graal.hotspot.nodes.RegisterNode.*; -import static com.oracle.graal.nodes.extended.UnsafeLoadNode.*; +import static com.oracle.graal.hotspot.snippets.HotSpotSnippetUtils.*; import static com.oracle.graal.snippets.SnippetTemplate.Arguments.*; import static com.oracle.graal.snippets.nodes.DirectObjectStoreNode.*; import static com.oracle.graal.snippets.nodes.ExplodeLoopNode.*; -import static com.oracle.max.asm.target.amd64.AMD64.*; import static com.oracle.max.criutils.UnsignedMath.*; import com.oracle.graal.api.code.*; @@ -43,7 +42,6 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.snippets.*; import com.oracle.graal.snippets.Snippet.ConstantParameter; -import com.oracle.graal.snippets.Snippet.Fold; import com.oracle.graal.snippets.Snippet.Parameter; import com.oracle.graal.snippets.SnippetTemplate.AbstractTemplates; import com.oracle.graal.snippets.SnippetTemplate.Arguments; @@ -56,7 +54,7 @@ @Snippet public static Word allocate(@Parameter("size") int size) { - Word thread = asWord(register(r15, wordKind())); + Word thread = asWord(register(threadReg(), wordKind())); Word top = loadWord(thread, threadTlabTopOffset()); Word end = loadWord(thread, threadTlabEndOffset()); Word newTop = top.plus(size); @@ -71,7 +69,7 @@ public static Object initializeObject( @Parameter("memory") Word memory, @Parameter("hub") Object hub, - @Parameter("initialMarkWord") Word initialMarkWord, + @Parameter("prototypeMarkWord") Word prototypeMarkWord, @ConstantParameter("size") int size, @ConstantParameter("fillContents") boolean fillContents) { @@ -79,7 +77,7 @@ new_stub.inc(); return NewInstanceStubCall.call(hub); } - formatObject(hub, size, memory, initialMarkWord, fillContents); + formatObject(hub, size, memory, prototypeMarkWord, fillContents); Object instance = memory.toObject(); return castFromHub(verifyOop(instance), hub); } @@ -90,10 +88,10 @@ @Parameter("hub") Object hub, @Parameter("length") int length, @Parameter("size") int size, - @Parameter("initialMarkWord") Word initialMarkWord, + @Parameter("prototypeMarkWord") Word prototypeMarkWord, @ConstantParameter("headerSize") int headerSize, @ConstantParameter("fillContents") boolean fillContents) { - return initializeArray(memory, hub, length, size, initialMarkWord, headerSize, true, fillContents); + return initializeArray(memory, hub, length, size, prototypeMarkWord, headerSize, true, fillContents); } @Snippet @@ -102,13 +100,13 @@ @Parameter("hub") Object hub, @Parameter("length") int length, @Parameter("size") int size, - @Parameter("initialMarkWord") Word initialMarkWord, + @Parameter("prototypeMarkWord") Word prototypeMarkWord, @ConstantParameter("headerSize") int headerSize, @ConstantParameter("fillContents") boolean fillContents) { - return initializeArray(memory, hub, length, size, initialMarkWord, headerSize, false, fillContents); + return initializeArray(memory, hub, length, size, prototypeMarkWord, headerSize, false, fillContents); } - private static Object initializeArray(Word memory, Object hub, int length, int size, Word initialMarkWord, int headerSize, boolean isObjectArray, boolean fillContents) { + private static Object initializeArray(Word memory, Object hub, int length, int size, Word prototypeMarkWord, int headerSize, boolean isObjectArray, boolean fillContents) { if (memory == Word.zero()) { if (isObjectArray) { anewarray_stub.inc(); @@ -122,7 +120,7 @@ } else { newarray_loopInit.inc(); } - formatArray(hub, size, length, headerSize, memory, initialMarkWord, fillContents); + formatArray(hub, size, length, headerSize, memory, prototypeMarkWord, fillContents); Object instance = memory.toObject(); return castFromHub(verifyOop(instance), hub); } @@ -155,22 +153,6 @@ return size & mask; } - private static Object verifyOop(Object object) { - if (verifyOops()) { - VerifyOopStubCall.call(object); - } - return object; - } - - private static Word asWord(Object object) { - return Word.fromObject(object); - } - - private static Word loadWord(Word address, int offset) { - Object value = loadObject(address, 0, offset, true); - return asWord(value); - } - /** * Maximum size of an object whose body is initialized by a sequence of * zero-stores to its fields. Larger objects have their bodies initialized @@ -179,10 +161,16 @@ private static final int MAX_UNROLLED_OBJECT_ZEROING_SIZE = 10 * wordSize(); /** + * Setting this to false causes (as yet inexplicable) crashes on lusearch. + */ + private static final boolean USE_COMPILE_TIME_PROTOTYPE_MARK_WORD = true; + + /** * Formats some allocated memory with an object header zeroes out the rest. */ - private static void formatObject(Object hub, int size, Word memory, Word headerPrototype, boolean fillContents) { - storeObject(memory, 0, markOffset(), headerPrototype); + private static void formatObject(Object hub, int size, Word memory, Word compileTimePrototypeMarkWord, boolean fillContents) { + Word prototypeMarkWord = USE_COMPILE_TIME_PROTOTYPE_MARK_WORD ? compileTimePrototypeMarkWord : loadWord(asWord(hub), prototypeMarkWordOffset()); + storeObject(memory, 0, markOffset(), prototypeMarkWord); storeObject(memory, 0, hubOffset(), hub); if (fillContents) { if (size <= MAX_UNROLLED_OBJECT_ZEROING_SIZE) { @@ -203,8 +191,8 @@ /** * Formats some allocated memory with an object header zeroes out the rest. */ - private static void formatArray(Object hub, int size, int length, int headerSize, Word memory, Word headerPrototype, boolean fillContents) { - storeObject(memory, 0, markOffset(), headerPrototype); + private static void formatArray(Object hub, int size, int length, int headerSize, Word memory, Word prototypeMarkWord, boolean fillContents) { + storeObject(memory, 0, markOffset(), prototypeMarkWord); storeObject(memory, 0, hubOffset(), hub); storeInt(memory, 0, arrayLengthOffset(), length); if (fillContents) { @@ -326,7 +314,7 @@ assert size >= 0; Key key = new Key(initializeObject).add("size", size).add("fillContents", initializeNode.fillContents()); ValueNode memory = initializeNode.memory(); - Arguments arguments = arguments("memory", memory).add("hub", hub).add("initialMarkWord", type.initialMarkWord()); + Arguments arguments = arguments("memory", memory).add("hub", hub).add("prototypeMarkWord", type.prototypeMarkWord()); SnippetTemplate template = cache.get(key); Debug.log("Lowering initializeObject in %s: node=%s, template=%s, arguments=%s", graph, initializeNode, template, arguments); template.instantiate(runtime, initializeNode, arguments); @@ -343,53 +331,13 @@ final int headerSize = elementKind.getArrayBaseOffset(); Key key = new Key(elementKind.isObject() ? initializeObjectArray : initializePrimitiveArray).add("headerSize", headerSize).add("fillContents", initializeNode.fillContents()); ValueNode memory = initializeNode.memory(); - Arguments arguments = arguments("memory", memory).add("hub", hub).add("initialMarkWord", type.initialMarkWord()).add("size", initializeNode.size()).add("length", initializeNode.length()); + Arguments arguments = arguments("memory", memory).add("hub", hub).add("prototypeMarkWord", type.prototypeMarkWord()).add("size", initializeNode.size()).add("length", initializeNode.length()); SnippetTemplate template = cache.get(key); Debug.log("Lowering initializeObjectArray in %s: node=%s, template=%s, arguments=%s", graph, initializeNode, template, arguments); template.instantiate(runtime, initializeNode, arguments); } } - @Fold - private static boolean verifyOops() { - return HotSpotGraalRuntime.getInstance().getConfig().verifyOops; - } - - @Fold - private static int threadTlabTopOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().threadTlabTopOffset; - } - - @Fold - private static int threadTlabEndOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().threadTlabEndOffset; - } - - @Fold - private static Kind wordKind() { - return HotSpotGraalRuntime.getInstance().getTarget().wordKind; - } - - @Fold - private static int wordSize() { - return HotSpotGraalRuntime.getInstance().getTarget().wordSize; - } - - @Fold - private static int markOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().markOffset; - } - - @Fold - private static int hubOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().hubOffset; - } - - @Fold - private static int arrayLengthOffset() { - return HotSpotGraalRuntime.getInstance().getConfig().arrayLengthOffset; - } - private static final SnippetCounter.Group countersNew = GraalOptions.SnippetCounters ? new SnippetCounter.Group("NewInstance") : null; private static final SnippetCounter new_seqInit = new SnippetCounter(countersNew, "tlabSeqInit", "TLAB alloc with unrolled zeroing"); private static final SnippetCounter new_loopInit = new SnippetCounter(countersNew, "tlabLoopInit", "TLAB alloc with zeroing in a loop");
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64NewArrayStubCallOp.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64NewArrayStubCallOp.java Thu Sep 13 11:29:18 2012 +0200 @@ -37,7 +37,7 @@ * LIR instruction for calling HotSpot's {@code new_[object|type]_array} stub. This stub is declared in c1_Runtime1.hpp * and implemented in Runtime1::generate_code_for() which is located in c1_Runtime1_x86.cpp. */ -@Opcode("NEW_ARRAY") +@Opcode("NEW_ARRAY_STUB") public class AMD64NewArrayStubCallOp extends AMD64LIRInstruction { /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64NewInstanceStubCallOp.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64NewInstanceStubCallOp.java Thu Sep 13 11:29:18 2012 +0200 @@ -37,7 +37,7 @@ * LIR instruction for calling HotSpot's {@code new_instance} stub. This stub is declared in c1_Runtime1.hpp * and implemented in Runtime1::generate_code_for() which is located in c1_Runtime1_x86.cpp. */ -@Opcode("NEW_INSTANCE") +@Opcode("NEW_INSTANCE_STUB") public class AMD64NewInstanceStubCallOp extends AMD64LIRInstruction { /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64VerifyOopStubCallOp.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/AMD64VerifyOopStubCallOp.java Thu Sep 13 11:29:18 2012 +0200 @@ -36,7 +36,7 @@ /** * A call to HotSpot's object pointer verification stub. */ -@Opcode("VERIFY_OOP") +@Opcode("VERIFY_OOP_STUB") public class AMD64VerifyOopStubCallOp extends AMD64LIRInstruction { /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java Thu Sep 13 11:29:18 2012 +0200 @@ -110,7 +110,7 @@ @Override public void visitExceptionObject(ExceptionObjectNode x) { HotSpotVMConfig config = ((HotSpotRuntime) runtime).config; - RegisterValue thread = r15.asValue(); + RegisterValue thread = config.threadRegister.asValue(); Address exceptionAddress = new Address(Kind.Object, thread, config.threadExceptionOopOffset); Address pcAddress = new Address(Kind.Long, thread, config.threadExceptionPcOffset); Value exception = emitLoad(exceptionAddress, false);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotXirGenerator.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotXirGenerator.java Thu Sep 13 11:29:18 2012 +0200 @@ -284,7 +284,7 @@ asm.pload(Kind.Int, temp2i, hub, asm.i(config.klassStateOffset), false); asm.jneq(tlabFull, temp2i, asm.i(config.klassStateFullyInitialized)); - XirOperand thread = asm.createRegisterTemp("thread", target.wordKind, AMD64.r15); + XirOperand thread = asm.createRegisterTemp("thread", target.wordKind, config.threadRegister); asm.pload(target.wordKind, result, thread, asm.i(config.threadTlabTopOffset), false); asm.add(temp1, result, wordConst(asm, size)); asm.pload(target.wordKind, temp2, thread, asm.i(config.threadTlabEndOffset), false); @@ -294,7 +294,7 @@ asm.bindInline(resume); - asm.pload(target.wordKind, temp1, hub, asm.i(config.instanceHeaderPrototypeOffset), false); + asm.pload(target.wordKind, temp1, hub, asm.i(config.prototypeMarkWordOffset), false); asm.pstore(target.wordKind, result, asm.i(config.markOffset), temp1, false); asm.mov(temp1o, hub); // need a temporary register since Intel cannot store 64-bit constants to memory asm.pstore(Kind.Object, result, asm.i(config.hubOffset), temp1o, false); @@ -372,7 +372,7 @@ asm.and(size, size, asm.i((int) mask)); // Try tlab allocation - XirOperand thread = asm.createRegisterTemp("thread", target.wordKind, AMD64.r15); + XirOperand thread = asm.createRegisterTemp("thread", target.wordKind, config.threadRegister); asm.pload(target.wordKind, result, thread, asm.i(config.threadTlabTopOffset), false); asm.add(temp1, result, size); asm.pload(target.wordKind, temp2, thread, asm.i(config.threadTlabEndOffset), false); @@ -380,7 +380,7 @@ asm.pstore(target.wordKind, thread, asm.i(config.threadTlabTopOffset), temp1, false); // Now the new object is in result, store mark word and klass - asm.pload(target.wordKind, temp1, hub, asm.i(config.instanceHeaderPrototypeOffset), false); + asm.pload(target.wordKind, temp1, hub, asm.i(config.prototypeMarkWordOffset), false); asm.pstore(target.wordKind, result, asm.i(config.markOffset), temp1, false); asm.mov(temp1o, hub); // need a temporary register since Intel cannot store 64-bit constants to memory asm.pstore(Kind.Object, result, asm.i(config.hubOffset), temp1o, false); @@ -426,7 +426,7 @@ XirOperand hub = asm.createRegisterTemp("hub", Kind.Object, AMD64.rax); XirOperand rank = asm.createRegisterTemp("rank", Kind.Int, AMD64.rbx); XirOperand sizes = asm.createRegisterTemp("sizes", Kind.Long, AMD64.rcx); - XirOperand thread = asm.createRegisterTemp("thread", Kind.Long, AMD64.r15); + XirOperand thread = asm.createRegisterTemp("thread", Kind.Long, config.threadRegister); asm.add(sizes, thread, asm.l(config.threadMultiNewArrayStorageOffset)); for (int i = 0; i < dimensions; i++) { XirParameter length = asm.createInputParameter("length" + i, Kind.Int, true);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/MonitorTest.java Thu Sep 13 11:29:18 2012 +0200 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2012, 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.snippets; + +import org.junit.*; + +import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.test.*; + +public class MonitorTest extends GraalCompilerTest { + + @Test + public void test0() { + test("lockObjectSimple", new Object(), "test1"); + } + + @Test + public void test0_1() { + test("lockThisSimple", "test1"); + } + + @Test + public void test0_2() { + test("lockObjectSimple", null, "test1"); + } + + @Test + public void test1_1() { + test("lockObject", new Object(), "test1", new String[1]); + } + + @Test + public void test1_2() { + test("lockObject", null, "test1_1", new String[1]); + } + + @Test + public void test2() { + test("lockThis", "test2", new String[1]); + } + + /** + * Tests monitor operations on {@link EscapeAnalysisPhase virtual objects}. + */ + @Test + public void test3() { + test("lockLocalObject", "test3", new String[1]); + } + + /** + * Tests recursive locking of objects which should be biasable. + */ + @Test + public void test4() { + Chars src = new Chars("1234567890".toCharArray()); + Chars dst = new Chars(src.data.length); + test("copyObj", src, dst, 100); + } + + /** + * Tests recursive locking of objects which do not appear to be biasable. + */ + @Test + public void test5() { + char[] src = "1234567890".toCharArray(); + char[] dst = new char[src.length]; + test("copyArr", src, dst, 100); + } + + /** + * Extends {@link #test4()} with contention. + */ + @Test + public void test6() { + Chars src = new Chars("1234567890".toCharArray()); + Chars dst = new Chars(src.data.length); + int n = Runtime.getRuntime().availableProcessors(); + testN(n, "copyObj", src, dst, 100); + } + + /** + * Extends {@link #test5()} with contention. + */ + @Test + public void test7() { + char[] src = "1234567890".toCharArray(); + char[] dst = new char[src.length]; + int n = Runtime.getRuntime().availableProcessors(); + testN(n, "copyArr", src, dst, 100); + } + + private static String setAndGet(String[] box, String value) { + synchronized (box) { + box[0] = null; + } + + // Do a GC while a object is locked (by the caller) + System.gc(); + + synchronized (box) { + box[0] = value; + } + return box[0]; + } + + public static String lockObjectSimple(Object o, String value) { + synchronized (o) { + return value; + } + } + + public String lockThisSimple(String value) { + synchronized (this) { + return value; + } + } + + public static String lockObject(Object o, String value, String[] box) { + synchronized (o) { + return setAndGet(box, value); + } + } + + public String lockThis(String value, String[] box) { + synchronized (this) { + return setAndGet(box, value); + } + } + + public static String lockLocalObject(String value, String[] box) { + Object o = new Object(); + synchronized (o) { + return setAndGet(box, value); + } + } + + static class Chars { + final char[] data; + + public Chars(int size) { + this.data = new char[size]; + } + public Chars(char[] data) { + this.data = data; + } + } + + public static String copyObj(Chars src, Chars dst, int n) { + System.out.println(Thread.currentThread().getName() + " reps=" + n + ", src.length=" + src.data.length); + int total = 0; + for (int j = 0; j < n; j++) { + for (int i = 0; i < src.data.length; i++) { + synchronized (src) { + synchronized (dst) { + synchronized (src) { + synchronized (dst) { + dst.data[i] = src.data[i]; + total++; + } + } + } + } + } + } + System.out.println(Thread.currentThread().getName() + " total " + total); + return new String(dst.data); + } + + public static String copyArr(char[] src, char[] dst, int n) { + System.out.println(Thread.currentThread().getName() + " reps=" + n + ", src.length=" + src.length); + int total = 0; + for (int j = 0; j < n; j++) { + for (int i = 0; i < src.length; i++) { + synchronized (src) { + synchronized (dst) { + synchronized (src) { + synchronized (dst) { + dst[i] = src[i]; + total++; + } + } + } + } + } + } + System.out.println(Thread.currentThread().getName() + " total " + total); + return new String(dst); + } +}
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/NewInstanceTest.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/NewInstanceTest.java Thu Sep 13 11:29:18 2012 +0200 @@ -38,7 +38,16 @@ Assert.assertTrue(expected != null); Assert.assertTrue(actual != null); super.assertEquals(expected.getClass(), actual.getClass()); - if (expected.getClass() != Object.class) { + + if (expected instanceof Object[]) { + Assert.assertTrue(actual instanceof Object[]); + Object[] eArr = (Object[]) expected; + Object[] aArr = (Object[]) actual; + Assert.assertTrue(eArr.length == aArr.length); + for (int i = 0; i < eArr.length; i++) { + assertEquals(eArr[i], aArr[i]); + } + } else if (expected.getClass() != Object.class) { try { expected.getClass().getDeclaredMethod("equals", Object.class); super.assertEquals(expected, actual); @@ -50,18 +59,65 @@ @Test public void test1() { test("newObject"); - test("newBigObject"); - test("newSomeObject"); - test("newEmptyString"); - test("newString", "value"); - test("newHashMap", 31); - test("newRegression", true); + } + + @Test + public void test2() { + test("newObjectTwice"); } public static Object newObject() { return new Object(); } + @Test + public void test3() { + test("newObjectLoop", 100); + } + + @Test + public void test4() { + test("newBigObject"); + } + + @Test + public void test5() { + test("newSomeObject"); + } + + @Test + public void test6() { + test("newEmptyString"); + } + + @Test + public void test7() { + test("newString", "value"); + } + + @Test + public void test8() { + test("newHashMap", 31); + } + + @Test + public void test9() { + test("newRegression", true); + } + + public static Object[] newObjectTwice() { + Object[] res = {new Object(), new Object()}; + return res; + } + + public static Object[] newObjectLoop(int n) { + Object[] res = new Object[n]; + for (int i = 0; i < n; i++) { + res[i] = new Object(); + } + return res; + } + public static BigObject newBigObject() { return new BigObject(); }
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/WordTest.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/WordTest.java Thu Sep 13 11:29:18 2012 +0200 @@ -63,12 +63,38 @@ test("plus_int", word, -addend); test("minus_int", word, addend); test("minus_int", word, -addend); + test("plus_long", word, (long) addend); + test("plus_long", word, (long) -addend); + test("minus_long", word, (long) addend); + test("minus_long", word, (long) -addend); + + test("and_int", word, addend); + test("and_int", word, -addend); + test("or_int", word, addend); + test("or_int", word, -addend); + test("and_long", word, (long) addend); + test("and_long", word, (long) -addend); + test("or_long", word, (long) addend); + test("or_long", word, (long) -addend); } for (long addend : words) { test("plus_int", word, (int) addend); test("minus_int", word, (int) addend); test("plus_int", word, -((int) addend)); test("minus_int", word, -((int) addend)); + test("plus_long", word, addend); + test("minus_long", word, addend); + test("plus_long", word, -addend); + test("minus_long", word, -addend); + + test("and_int", word, (int) addend); + test("or_int", word, (int) addend); + test("and_int", word, -((int) addend)); + test("or_int", word, -((int) addend)); + test("and_long", word, addend); + test("or_long", word, addend); + test("and_long", word, -addend); + test("or_long", word, -addend); } } } @@ -108,10 +134,20 @@ @Snippet public static long minus_int(long word, int addend) { + return Word.fromLong(word).minus(addend).toLong(); + } + + @Snippet + public static long plus_long(long word, long addend) { return Word.fromLong(word).plus(addend).toLong(); } @Snippet + public static long minus_long(long word, long addend) { + return Word.fromLong(word).minus(addend).toLong(); + } + + @Snippet public static boolean aboveOrEqual(long word1, long word2) { return Word.fromLong(word1).aboveOrEqual(Word.fromLong(word2)); } @@ -135,5 +171,24 @@ public static int fromToObject(Object o1, Object o2) { return Word.fromObject(o1).toObject().hashCode() + Word.fromObject(o2).toObject().hashCode(); } + + @Snippet + public static long and_int(long word, int addend) { + return Word.fromLong(word).and(addend).toLong(); + } + + @Snippet + public static long or_int(long word, int addend) { + return Word.fromLong(word).or(addend).toLong(); + } + + @Snippet + public static long and_long(long word, long addend) { + return Word.fromLong(word).and(addend).toLong(); + } + + @Snippet + public static long or_long(long word, long addend) { + return Word.fromLong(word).or(addend).toLong(); + } } -
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Word.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Word.java Thu Sep 13 11:29:18 2012 +0200 @@ -53,6 +53,9 @@ W2I, PLUS, MINUS, + OR, + AND, + XOR, BELOW, BELOW_EQUAL, ABOVE, @@ -177,4 +180,59 @@ assert object == null; return new Word(value - addend.value, null); } + + @Operation(OR) + public Word or(int other) { + assert object == null; + return new Word(value | other, null); + } + + @Operation(OR) + public Word or(long other) { + assert object == null; + return new Word(value | other, null); + } + + @Operation(OR) + public Word or(Word other) { + assert object == null; + return new Word(value | other.value, null); + } + + @Operation(AND) + public Word and(int other) { + assert object == null; + return new Word(value & other, null); + } + + @Operation(AND) + public Word and(long other) { + assert object == null; + return new Word(value & other, null); + } + + @Operation(AND) + public Word and(Word other) { + assert object == null; + return new Word(value & other.value, null); + } + + @Operation(XOR) + public Word xor(int other) { + assert object == null; + return new Word(value | other, null); + } + + @Operation(XOR) + public Word xor(long other) { + assert object == null; + return new Word(value | other, null); + } + + @Operation(XOR) + public Word xor(Word other) { + assert object == null; + return new Word(value | other.value, null); + } + }
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/WordTypeRewriterPhase.java Thu Sep 13 11:27:37 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/WordTypeRewriterPhase.java Thu Sep 13 11:29:18 2012 +0200 @@ -32,6 +32,7 @@ import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.util.*; import com.oracle.graal.snippets.Word.Opcode; import com.oracle.graal.snippets.Word.Operation; @@ -91,38 +92,66 @@ switch (opcode) { case ZERO: { assert arguments.size() == 0; - invoke.intrinsify(wordKind.isLong() ? ConstantNode.forLong(0L, graph) : ConstantNode.forInt(0, graph)); + replace(invoke, wordKind.isLong() ? ConstantNode.forLong(0L, graph) : ConstantNode.forInt(0, graph)); break; } case ABOVE: { assert arguments.size() == 2; - invoke.intrinsify(compare(Condition.AT, graph, arguments.first(), arguments.last())); + replace(invoke, compare(Condition.AT, graph, arguments.first(), arguments.last())); break; } case ABOVE_EQUAL: { assert arguments.size() == 2; - invoke.intrinsify(compare(Condition.AE, graph, arguments.first(), arguments.last())); + replace(invoke, compare(Condition.AE, graph, arguments.first(), arguments.last())); break; } case BELOW: { assert arguments.size() == 2; - invoke.intrinsify(compare(Condition.BT, graph, arguments.first(), arguments.last())); + replace(invoke, compare(Condition.BT, graph, arguments.first(), arguments.last())); break; } case BELOW_EQUAL: { assert arguments.size() == 2; - invoke.intrinsify(compare(Condition.BE, graph, arguments.first(), arguments.last())); + replace(invoke, compare(Condition.BE, graph, arguments.first(), arguments.last())); break; } case PLUS: { ValueNode addend = asWordKind(graph, arguments.last()); IntegerAddNode op = graph.unique(new IntegerAddNode(wordKind, arguments.first(), addend)); - invoke.intrinsify(op); + replace(invoke, op); + break; + } + + case MINUS: { + ValueNode addend = asWordKind(graph, arguments.last()); + IntegerSubNode op = graph.unique(new IntegerSubNode(wordKind, arguments.first(), addend)); + replace(invoke, op); + break; + } + + case AND: { + ValueNode operand = asWordKind(graph, arguments.last()); + AndNode op = graph.unique(new AndNode(wordKind, arguments.first(), operand)); + replace(invoke, op); + break; + } + + case OR: { + ValueNode operand = asWordKind(graph, arguments.last()); + OrNode op = graph.unique(new OrNode(wordKind, arguments.first(), operand)); + replace(invoke, op); + break; + } + + case XOR: { + ValueNode operand = asWordKind(graph, arguments.last()); + XorNode op = graph.unique(new XorNode(wordKind, arguments.first(), operand)); + replace(invoke, op); break; } @@ -131,7 +160,7 @@ ValueNode value = arguments.first(); ResolvedJavaType targetType = (ResolvedJavaType) targetMethod.signature().returnType(targetMethod.holder()); UnsafeCastNode cast = graph.unique(new UnsafeCastNode(value, targetType)); - invoke.intrinsify(cast); + replace(invoke, cast); break; } @@ -139,7 +168,7 @@ assert arguments.size() == 1; ValueNode value = arguments.first(); ValueNode intValue = fromWordKindTo(graph, value, Kind.Int); - invoke.intrinsify(intValue); + replace(invoke, intValue); break; } @@ -147,7 +176,7 @@ assert arguments.size() == 1; ValueNode value = arguments.first(); ValueNode longValue = fromWordKindTo(graph, value, Kind.Long); - invoke.intrinsify(longValue); + replace(invoke, longValue); break; } @@ -156,7 +185,7 @@ ValueNode value = arguments.first(); assert value.kind() == Kind.Object : value + ", " + targetMethod; UnsafeCastNode cast = graph.unique(new UnsafeCastNode(value, wordType)); - invoke.intrinsify(cast); + replace(invoke, cast); break; } @@ -165,7 +194,7 @@ ValueNode value = arguments.first(); assert value.kind() == Kind.Long; ValueNode wordValue = asWordKind(graph, value); - invoke.intrinsify(wordValue); + replace(invoke, wordValue); break; } @@ -173,7 +202,7 @@ assert arguments.size() == 1; ValueNode value = arguments.first(); assert value.kind() == Kind.Int; - invoke.intrinsify(asWordKind(graph, value)); + replace(invoke, asWordKind(graph, value)); break; } @@ -185,6 +214,14 @@ } } + protected void replace(Invoke invoke, ValueNode value) { + FixedNode next = invoke.next(); + invoke.setNext(null); + invoke.node().replaceAtPredecessor(next); + invoke.node().replaceAtUsages(value); + GraphUtil.killCFG(invoke.node()); + } + /** * Creates comparison node for a given condition and two input values. */ @@ -247,6 +284,9 @@ } public static boolean isWord(ValueNode node) { + if (node.stamp() instanceof WordStamp) { + return true; + } if (node.kind().isObject()) { return isWord(node.objectStamp().type()); }
--- a/src/share/vm/graal/graalCompiler.cpp Thu Sep 13 11:27:37 2012 +0200 +++ b/src/share/vm/graal/graalCompiler.cpp Thu Sep 13 11:29:18 2012 +0200 @@ -273,7 +273,6 @@ HotSpotResolvedJavaType::set_accessFlags(obj, klass->access_flags().as_int()); HotSpotResolvedJavaType::set_isInterface(obj, klass->is_interface()); HotSpotResolvedJavaType::set_superCheckOffset(obj, klass->super_check_offset()); - HotSpotResolvedJavaType::set_initialMarkWord(obj, (jlong) klass->prototype_header()); HotSpotResolvedJavaType::set_isInstanceClass(obj, klass->oop_is_instance()); if (klass->oop_is_javaArray()) {
--- a/src/share/vm/graal/graalCompilerToVM.cpp Thu Sep 13 11:27:37 2012 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Thu Sep 13 11:29:18 2012 +0200 @@ -48,9 +48,21 @@ return (methodDataOop)HotSpotMethodData::hotspotMirror(JNIHandles::resolve(hotspot_method_data)); } -// public byte[] JavaMethod_code(HotSpotResolvedMethod method); -JNIEXPORT jbyteArray JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1code(JNIEnv *env, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_code"); +// Entry to native method implementation that transitions current thread to '_thread_in_vm'. +#define C2V_VMENTRY(result_type, name, signature) \ + JNIEXPORT result_type JNICALL name signature { \ + TRACE_graal_3("CompilerToVM::" #name); \ + VM_ENTRY_MARK; \ + +// Entry to native method implementation that calls a JNI function +// and hence cannot transition current thread to '_thread_in_vm'. +#define C2V_ENTRY(result_type, name, signature) \ + JNIEXPORT result_type JNICALL name signature { \ + TRACE_graal_3("CompilerToVM::" #name); \ + +#define C2V_END } + +C2V_ENTRY(jbyteArray, JavaMethod_code, (JNIEnv *env, jobject, jobject hotspot_method)) methodHandle method = getMethodFromHotSpotMethod(hotspot_method); // copy all bytecodes @@ -83,21 +95,15 @@ } return result; -} +C2V_END -// public String JavaMethod_signature(HotSpotResolvedMethod method); -JNIEXPORT jstring JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1signature(JNIEnv *env, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_signature"); - VM_ENTRY_MARK +C2V_VMENTRY(jstring, JavaMethod_signature, (JNIEnv *env, jobject, jobject hotspot_method)) methodOop method = getMethodFromHotSpotMethod(hotspot_method); assert(method != NULL && method->signature() != NULL, "signature required"); return VmIds::toString<jstring>(method->signature(), THREAD); -} +C2V_END -// public ExceptionHandler[] JavaMethod_exceptionHandlers(long vmId); -JNIEXPORT jobjectArray JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1exceptionHandlers(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_exceptionHandlers"); - VM_ENTRY_MARK +C2V_VMENTRY(jobjectArray, JavaMethod_exceptionHandlers, (JNIEnv *, jobject, jobject hotspot_method)) ResourceMark rm; methodHandle method = getMethodFromHotSpotMethod(hotspot_method); int handler_count = method->exception_table_length(); @@ -132,13 +138,9 @@ } return (jobjectArray) JNIHandles::make_local(array()); -} +C2V_END -// public boolean JavaMethod_hasBalancedMonitors(long vmId); -JNIEXPORT jint JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1hasBalancedMonitors(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_hasBalancedMonitors"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jint, JavaMethod_hasBalancedMonitors, (JNIEnv *, jobject, jobject hotspot_method)) // Analyze the method to see if monitors are used properly. methodHandle method(THREAD, getMethodFromHotSpotMethod(hotspot_method)); @@ -160,12 +162,9 @@ method->set_guaranteed_monitor_matching(); } return true; -} +C2V_END -// public JavaMethod getJavaMethod(java.lang.reflect.Method reflectionMethod); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getJavaMethod(JNIEnv *, jobject, jobject reflection_method_handle) { - TRACE_graal_3("CompilerToVM::getJavaMethod"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, getJavaMethod, (JNIEnv *, jobject, jobject reflection_method_handle)) oop reflection_method = JNIHandles::resolve(reflection_method_handle); oop reflection_holder = java_lang_reflect_Method::clazz(reflection_method); int slot = java_lang_reflect_Method::slot(reflection_method); @@ -175,11 +174,7 @@ return JNIHandles::make_local(THREAD, ret()); } -// public boolean JavaMethod_uniqueConcreteMethod(long vmId); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1uniqueConcreteMethod(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_uniqueConcreteMethod"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaMethod_uniqueConcreteMethod, (JNIEnv *, jobject, jobject hotspot_method)) methodHandle method = getMethodFromHotSpotMethod(hotspot_method); KlassHandle holder = method->method_holder(); if (holder->is_interface()) { @@ -204,18 +199,13 @@ Handle method_resolved = GraalCompiler::createHotSpotResolvedJavaMethod(unique_concrete, CHECK_NULL); return JNIHandles::make_local(THREAD, method_resolved()); } -} +C2V_END -// public native int JavaMethod_invocationCount(long vmId); -JNIEXPORT jint JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1invocationCount(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_invocationCount"); +C2V_ENTRY(jint, JavaMethod_invocationCount, (JNIEnv *, jobject, jobject hotspot_method)) return getMethodFromHotSpotMethod(hotspot_method)->invocation_count(); -} +C2V_END -// public native HotSpotMethodData JavaMethod_methodData(HotSpotResolvedJavaMethod method); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1methodData(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_methodData"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaMethod_methodData,(JNIEnv *, jobject, jobject hotspot_method)) methodDataHandle method_data = getMethodFromHotSpotMethod(hotspot_method)->method_data(); if(method_data.is_null()) { @@ -224,7 +214,7 @@ Handle graalMethodData = GraalCompiler::createHotSpotMethodData(method_data, CHECK_NULL); return JNIHandles::make_local(THREAD, graalMethodData()); } -} +C2V_END // ------------------------------------------------------------------ // Adjust a CounterData count to be commensurate with @@ -252,23 +242,16 @@ return count; } -// public native boolean JavaMethod_hasCompiledCode(HotSpotResolvedJavaMethod method); -JNIEXPORT jboolean JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1hasCompiledCode(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_hasCompiledCode"); +C2V_ENTRY(jboolean, JavaMethod_hasCompiledCode, (JNIEnv *, jobject, jobject hotspot_method)) return getMethodFromHotSpotMethod(hotspot_method)->has_compiled_code(); -} +C2V_END -// public native int JavaMethod_getCompiledCodeSize(HotSpotResolvedJavaMethod method); -JNIEXPORT jint JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1getCompiledCodeSize(JNIEnv *env, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_getCompiledCodeSize"); +C2V_ENTRY(jint, JavaMethod_getCompiledCodeSize, (JNIEnv *env, jobject, jobject hotspot_method)) nmethod* code = getMethodFromHotSpotMethod(hotspot_method)->code(); return code == NULL ? 0 : code->insts_size(); -} +C2V_END -// public JavaType Signature_lookupType(String returnType, HotSpotResolvedJavaType accessingClass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_Signature_1lookupType(JNIEnv *env, jobject, jstring jname, jobject accessingClass, jboolean eagerResolve) { - TRACE_graal_3("CompilerToVM::Signature_lookupType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, Signature_lookupType, (JNIEnv *env, jobject, jstring jname, jobject accessingClass, jboolean eagerResolve)) ResourceMark rm; Symbol* nameSymbol = VmIds::toSymbol(jname); @@ -331,12 +314,9 @@ } return JNIHandles::make_local(THREAD, result); -} +C2V_END -// public Object ConstantPool_lookupConstant(HotSpotResolvedJavaType type, int cpi); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_ConstantPool_1lookupConstant(JNIEnv *env, jobject, jobject type, jint index) { - TRACE_graal_3("CompilerToVM::ConstantPool_lookupConstant"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, ConstantPool_lookupConstant, (JNIEnv *env, jobject, jobject type, jint index)) constantPoolOop cp = instanceKlass::cast(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(type)))->constants(); @@ -376,12 +356,9 @@ } return JNIHandles::make_local(THREAD, result); -} +C2V_END -// public JavaMethod ConstantPool_lookupMethod(long vmId, int cpi, byte byteCode); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_ConstantPool_1lookupMethod(JNIEnv *env, jobject, jobject type, jint index, jbyte byteCode) { - TRACE_graal_3("CompilerToVM::ConstantPool_lookupMethod"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, ConstantPool_lookupMethod, (JNIEnv *env, jobject, jobject type, jint index, jbyte byteCode)) index = GraalCompiler::to_cp_index_u2(index); constantPoolHandle cp = instanceKlass::cast(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(type)))->constants(); instanceKlassHandle pool_holder(cp->pool_holder()); @@ -399,23 +376,16 @@ Handle type = GraalCompiler::get_JavaType(cp, holder_index, cp->pool_holder(), CHECK_NULL); return JNIHandles::make_local(THREAD, VMToCompiler::createJavaMethod(name, signature, type, THREAD)); } -} +C2V_END -// public JavaType ConstantPool_lookupType(long vmId, int cpi); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_ConstantPool_1lookupType(JNIEnv *env, jobject, jobject type, jint index) { - TRACE_graal_3("CompilerToVM::ConstantPool_lookupType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, ConstantPool_lookupType, (JNIEnv *env, jobject, jobject type, jint index)) constantPoolOop cp = instanceKlass::cast(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(type)))->constants(); Handle result = GraalCompiler::get_JavaType(cp, index, cp->pool_holder(), CHECK_NULL); return JNIHandles::make_local(THREAD, result()); -} +C2V_END -// public void ConstantPool_loadReferencedType(long vmId, int cpi); -JNIEXPORT void JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_ConstantPool_1loadReferencedType(JNIEnv *env, jobject, jobject type, jint index, jbyte op) { - TRACE_graal_3("CompilerToVM::ConstantPool_loadReferencedType"); - VM_ENTRY_MARK; - +C2V_VMENTRY(void, ConstantPool_loadReferencedType, (JNIEnv *env, jobject, jobject type, jint index, jbyte op)) constantPoolOop cp = instanceKlass::cast(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(type)))->constants(); int byteCode = (op & 0xFF); if (byteCode != Bytecodes::_checkcast && byteCode != Bytecodes::_instanceof && byteCode != Bytecodes::_new && byteCode != Bytecodes::_anewarray @@ -435,12 +405,9 @@ instanceKlass::cast(klass)->initialize(CHECK); } } -} +C2V_END -// public JavaField ConstantPool_lookupField(long vmId, int cpi); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_ConstantPool_1lookupField(JNIEnv *env, jobject, jobject constantPoolHolder, jint index, jbyte byteCode) { - TRACE_graal_3("CompilerToVM::ConstantPool_lookupField"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, ConstantPool_lookupField, (JNIEnv *env, jobject, jobject constantPoolHolder, jint index, jbyte byteCode)) ResourceMark rm; index = GraalCompiler::to_cp_index_u2(index); @@ -479,12 +446,9 @@ Handle field_handle = GraalCompiler::get_JavaField(offset, flags.as_int(), name, holder, type, code, THREAD); return JNIHandles::make_local(THREAD, field_handle()); -} +C2V_END -// public JavaMethod JavaType_resolveMethodImpl(HotSpotResolvedJavaType klass, String name, String signature); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_3resolveMethodImpl(JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature) { - TRACE_graal_3("CompilerToVM::JavaType_resolveMethodImpl"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaType_resolveMethodImpl, (JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature)) assert(JNIHandles::resolve(resolved_type) != NULL, ""); klassOop klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(resolved_type)); @@ -500,13 +464,9 @@ } Handle ret = GraalCompiler::createHotSpotResolvedJavaMethod(method, CHECK_NULL); return JNIHandles::make_local(THREAD, ret()); -} +C2V_END -// public boolean JavaType_isSubtypeOf(HotSpotResolvedJavaType klass, JavaType other); -JNIEXPORT jboolean JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_2isSubtypeOf(JNIEnv *, jobject, jobject klass, jobject jother) { - TRACE_graal_3("CompilerToVM::JavaType_isSubtypeOf"); - VM_ENTRY_MARK; - +C2V_VMENTRY(jboolean, JavaType_isSubtypeOf, (JNIEnv *, jobject, jobject klass, jobject jother)) oop other = JNIHandles::resolve(jother); assert(other->is_a(HotSpotResolvedJavaType::klass()), "resolved hotspot type expected"); assert(JNIHandles::resolve(klass) != NULL, ""); @@ -520,24 +480,18 @@ fatal("unexpected class type"); return false; } -} +C2V_END -// public JavaType JavaType_leastCommonAncestor(HotSpotResolvedJavaType thisType, HotSpotResolvedJavaType otherType); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_2leastCommonAncestor(JNIEnv *, jobject, jobject this_type, jobject other_type) { - TRACE_graal_3("CompilerToVM::JavaType_leastCommonAncestor"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaType_leastCommonAncestor, (JNIEnv *, jobject, jobject this_type, jobject other_type)) Klass* this_klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(this_type))->klass_part(); Klass* other_klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(other_type))->klass_part(); Klass* lca = this_klass->LCA(other_klass); return JNIHandles::make_local(GraalCompiler::get_JavaType(lca, THREAD)()); -} +C2V_END -// public JavaType JavaType_componentType(HotSpotResolvedType klass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1componentType(JNIEnv *, jobject, jobject klass) { - TRACE_graal_3("CompilerToVM::JavaType_componentType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaType_componentType, (JNIEnv *, jobject, jobject klass)) KlassHandle array_klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass)); if(array_klass->oop_is_typeArray()) { BasicType t = typeArrayKlass::cast(array_klass())->element_type(); @@ -548,12 +502,18 @@ klassOop element_type = objArrayKlass::cast(array_klass())->element_klass(); assert(JNIHandles::resolve(klass) != NULL, ""); return JNIHandles::make_local(GraalCompiler::get_JavaType(element_type, THREAD)()); -} +C2V_END -// public JavaType JavaType_superType(HotSpotResolvedType klass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1superType(JNIEnv *, jobject, jobject klass) { - TRACE_graal_3("CompilerToVM::JavaType_superType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jlong, JavaType_prototypeMarkWord, (JNIEnv *, jobject, jobject klass)) + KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass))); + if (klass_handle->oop_is_array()) { + return (int32_t)(intptr_t) markOopDesc::prototype(); + } else { + return (jlong) (intptr_t) klass_handle->prototype_header(); + } +C2V_END + +C2V_VMENTRY(jobject, JavaType_superType, (JNIEnv *, jobject, jobject klass)) KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass))); klassOop k; @@ -569,44 +529,32 @@ } else { return NULL; } -} +C2V_END -// public JavaType JavaType_uniqueConcreteSubtype(HotSpotResolvedType klass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1uniqueConcreteSubtype(JNIEnv *, jobject, jobject klass) { - TRACE_graal_3("CompilerToVM::JavaType_uniqueConcreteSubtype"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaType_uniqueConcreteSubtype, (JNIEnv *, jobject, jobject klass)) KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass))); Klass *up_cast = klass_handle->up_cast_abstract(); if (!up_cast->is_interface() && up_cast->subklass() == NULL) { return JNIHandles::make_local(GraalCompiler::get_JavaType(up_cast, THREAD)()); } return NULL; -} +C2V_END -// public bool JavaType_isInitialized(HotSpotResolvedType klass); -JNIEXPORT jboolean JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1isInitialized(JNIEnv *, jobject, jobject hotspot_klass) { - TRACE_graal_3("CompilerToVM::JavaType_isInitialized"); +C2V_VMENTRY(jboolean, JavaType_isInitialized,(JNIEnv *, jobject, jobject hotspot_klass)) klassOop klass = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(hotspot_klass)); assert(klass != NULL, "method must not be called for primitive types"); return instanceKlass::cast(klass)->is_initialized(); -} +C2V_END -// public JavaType JavaType_arrayOf(HotSpotResolvedJavaType klass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1arrayOf(JNIEnv *, jobject, jobject klass) { - TRACE_graal_3("CompilerToVM::JavaType_arrayOf"); - VM_ENTRY_MARK; - +C2V_VMENTRY(jobject, JavaType_arrayOf, (JNIEnv *, jobject, jobject klass)) KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass))); KlassHandle arr = klass_handle->array_klass(THREAD); Handle name = VmIds::toString<Handle>(arr->name(), CHECK_NULL); assert(arr->oop_is_array(), ""); return JNIHandles::make_local(THREAD, GraalCompiler::createHotSpotResolvedJavaType(arr, name, THREAD)()); -} +C2V_END -// public ResolvedJavaField[] JavaType_fields(HotSpotResolvedJavaType klass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1fields(JNIEnv *, jobject, jobject klass) { - TRACE_graal_3("CompilerToVM::JavaType_fields"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaType_fields, (JNIEnv *, jobject, jobject klass)) ResourceMark rm; instanceKlassHandle k = java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass)); @@ -635,22 +583,16 @@ field_array->obj_at_put(i, closure._field_array.at(i)()); } return JNIHandles::make_local(field_array()); -} +C2V_END -// public JavaType getPrimitiveArrayType(Kind kind); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getPrimitiveArrayType(JNIEnv *env, jobject, jobject kind) { - TRACE_graal_3("CompilerToVM::getPrimitiveArrayType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, getPrimitiveArrayType, (JNIEnv *env, jobject, jobject kind)) BasicType type = GraalCompiler::kindToBasicType(Kind::typeChar(kind)); assert(type != T_OBJECT, "primitive type expecteds"); Handle result = GraalCompiler::get_JavaType(Universe::typeArrayKlassObj(type), CHECK_NULL); return JNIHandles::make_local(THREAD, result()); -} +C2V_END -// public long getMaxCallTargetOffset(RuntimeCall rtcall); -JNIEXPORT jlong JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getMaxCallTargetOffset(JNIEnv *env, jobject, jobject rtcall) { - TRACE_graal_3("CompilerToVM::getMaxCallTargetOffset"); - VM_ENTRY_MARK; +C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv *env, jobject, jobject rtcall)) oop call = JNIHandles::resolve(rtcall); address target_addr = CodeInstaller::runtime_call_target_address(call); if (target_addr != 0x0) { @@ -659,12 +601,9 @@ return MAX2(ABS(off_low), ABS(off_high)); } return -1; -} +C2V_END -// public JavaType getType(Class<?> javaClass); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getType(JNIEnv *env, jobject, jobject javaClass) { - TRACE_graal_3("CompilerToVM::getType"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, getType, (JNIEnv *env, jobject, jobject javaClass)) oop javaClassOop = JNIHandles::resolve(javaClass); if (javaClassOop == NULL) { fatal("argument to CompilerToVM.getType must not be NULL"); @@ -679,7 +618,7 @@ Handle type = GraalCompiler::createHotSpotResolvedJavaType(klass, name, CHECK_NULL); return JNIHandles::make_local(THREAD, type()); } -} +C2V_END // helpers used to set fields in the HotSpotVMConfig object @@ -707,11 +646,10 @@ BasicType basicTypes[] = { T_BOOLEAN, T_BYTE, T_SHORT, T_CHAR, T_INT, T_FLOAT, T_LONG, T_DOUBLE, T_OBJECT }; int basicTypeCount = sizeof(basicTypes) / sizeof(BasicType); -// public HotSpotVMConfig getConfiguration(); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getConfiguration(JNIEnv *env, jobject) { - jclass klass = env->FindClass("com/oracle/graal/hotspot/HotSpotVMConfig"); - assert(klass != NULL, "HotSpot vm config class not found"); - jobject config = env->AllocObject(klass); +C2V_ENTRY(void, initializeConfiguration, (JNIEnv *env, jobject, jobject config)) +if (JavaThread::current()->thread_state() != _thread_in_native) { + tty->print_cr("thread state: %d", JavaThread::current()->thread_state()); +} #ifdef _WIN64 set_boolean(env, config, "windowsOs", true); #else @@ -727,6 +665,7 @@ set_int(env, config, "stackShadowPages", StackShadowPages); set_int(env, config, "hubOffset", oopDesc::klass_offset_in_bytes()); set_int(env, config, "markOffset", oopDesc::mark_offset_in_bytes()); + set_int(env, config, "prototypeMarkWordOffset", in_bytes(Klass::prototype_header_offset())); set_int(env, config, "superCheckOffsetOffset", in_bytes(Klass::super_check_offset_offset())); set_int(env, config, "secondarySuperCacheOffset", in_bytes(Klass::secondary_super_cache_offset())); set_int(env, config, "secondarySupersOffset", in_bytes(Klass::secondary_supers_offset())); @@ -736,7 +675,6 @@ set_int(env, config, "threadTlabTopOffset", in_bytes(JavaThread::tlab_top_offset())); set_int(env, config, "threadTlabEndOffset", in_bytes(JavaThread::tlab_end_offset())); set_int(env, config, "threadObjectOffset", in_bytes(JavaThread::threadObj_offset())); - set_int(env, config, "instanceHeaderPrototypeOffset", in_bytes(Klass::prototype_header_offset())); set_int(env, config, "threadExceptionOopOffset", in_bytes(JavaThread::exception_oop_offset())); set_int(env, config, "threadExceptionPcOffset", in_bytes(JavaThread::exception_pc_offset())); set_int(env, config, "threadMultiNewArrayStorageOffset", in_bytes(JavaThread::graal_multinewarray_storage_offset())); @@ -808,12 +746,9 @@ } set_int(env, config, "arrayClassElementOffset", in_bytes(objArrayKlass::element_klass_offset())); - return config; -} +C2V_END -// public HotSpotCompiledMethod installMethod(HotSpotCompilationResult comp, boolean installCode); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_installMethod(JNIEnv *jniEnv, jobject, jobject compResult, jboolean install_code, jobject info) { - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, installMethod, (JNIEnv *jniEnv, jobject, jobject compResult, jboolean install_code, jobject info)) ResourceMark rm; HandleMark hm; Handle compResultHandle = JNIHandles::resolve(compResult); @@ -841,12 +776,9 @@ } else { return NULL; } -} +C2V_END -// public String disassembleNative(byte[] code, long address); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_disassembleNative(JNIEnv *jniEnv, jobject, jbyteArray code, jlong start_address) { - TRACE_graal_3("CompilerToVM::disassembleNative"); - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, disassembleNative, (JNIEnv *jniEnv, jobject, jbyteArray code, jlong start_address)) ResourceMark rm; HandleMark hm; @@ -859,26 +791,18 @@ Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL); return JNIHandles::make_local(result()); -} +C2V_END -// public StackTraceElement JavaMethod_toStackTraceElement(HotSpotResolvedJavaMethod method, int bci); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_1toStackTraceElement(JNIEnv *env, jobject, jobject hotspot_method, int bci) { - TRACE_graal_3("CompilerToVM::JavaMethod_toStackTraceElement"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, JavaMethod_toStackTraceElement, (JNIEnv *env, jobject, jobject hotspot_method, int bci)) ResourceMark rm; HandleMark hm; methodHandle method = getMethodFromHotSpotMethod(hotspot_method); oop element = java_lang_StackTraceElement::create(method, bci, CHECK_NULL); return JNIHandles::make_local(element); -} +C2V_END -// public Object executeCompiledMethodVarargs(HotSpotCompiledMethod method, Object... args); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_executeCompiledMethodVarargs(JNIEnv *env, jobject, jobject method, jobject args) { - TRACE_graal_3("CompilerToVM::executeCompiledMethod"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, executeCompiledMethodVarargs, (JNIEnv *env, jobject, jobject method, jobject args)) ResourceMark rm; HandleMark hm; @@ -905,13 +829,9 @@ oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL); return JNIHandles::make_local(o); } -} +C2V_END -// public Object executeCompiledMethod(HotSpotCompiledMethod method, Object arg1, Object arg2, Object arg3); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_executeCompiledMethod(JNIEnv *env, jobject, jobject method, jobject arg1, jobject arg2, jobject arg3) { - TRACE_graal_3("CompilerToVM::executeCompiledMethod"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, executeCompiledMethod, (JNIEnv *env, jobject, jobject method, jobject arg1, jobject arg2, jobject arg3)) ResourceMark rm; HandleMark hm; @@ -931,11 +851,9 @@ JavaCalls::call(&result, actualMethod, nm, &args, CHECK_NULL); return JNIHandles::make_local((oop) result.get_jobject()); -} +C2V_END -// public native int JavaMethod_vtableEntryOffset(HotSpotResolvedJavaMethod method); -JNIEXPORT jint JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaMethod_vtableEntryOffset(JNIEnv *, jobject, jobject hotspot_method) { - TRACE_graal_3("CompilerToVM::JavaMethod_vtableEntryOffset"); +C2V_VMENTRY(jint, JavaMethod_vtableEntryOffset, (JNIEnv *, jobject, jobject hotspot_method)) methodOop method = getMethodFromHotSpotMethod(hotspot_method); assert(!instanceKlass::cast(method->method_holder())->is_interface(), "vtableEntryOffset cannot be called for interface methods"); @@ -946,13 +864,9 @@ vtable_entry_offset = vtable_entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); return vtable_entry_offset; -} +C2V_END -// public native long[] getDeoptedLeafGraphIds(); -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_getDeoptedLeafGraphIds(JNIEnv *, jobject) { - TRACE_graal_3("CompilerToVM::getDeoptedLeafGraphIds"); - - VM_ENTRY_MARK; +C2V_VMENTRY(jobject, getDeoptedLeafGraphIds, (JNIEnv *, jobject)) // the contract for this method is as follows: // returning null: no deopted leaf graphs @@ -961,13 +875,9 @@ oop array = GraalCompiler::instance()->dump_deopted_leaf_graphs(CHECK_NULL); return JNIHandles::make_local(array); -} +C2V_END -JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_decodePC(JNIEnv *, jobject, jlong pc) { - TRACE_graal_3("CompilerToVM::decodePC"); - - VM_ENTRY_MARK; - +C2V_VMENTRY(jobject, decodePC, (JNIEnv *, jobject, jlong pc)) stringStream(st); CodeBlob* blob = CodeCache::find_blob_unsafe((void*) pc); if (blob == NULL) { @@ -984,12 +894,11 @@ } Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL); return JNIHandles::make_local(result()); - -} +C2V_END #define CC (char*) /*cast a literal from (const char*)*/ -#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_##f)) +#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(f)) #define PROXY "J" #define TYPE "Lcom/oracle/graal/api/meta/JavaType;" @@ -1017,41 +926,46 @@ #define STACK_TRACE_ELEMENT "Ljava/lang/StackTraceElement;" JNINativeMethod CompilerToVM_methods[] = { - {CC"JavaMethod_code", CC"("RESOLVED_METHOD")[B", FN_PTR(JavaMethod_1code)}, - {CC"JavaMethod_signature", CC"("RESOLVED_METHOD")"STRING, FN_PTR(JavaMethod_1signature)}, - {CC"JavaMethod_exceptionHandlers", CC"("RESOLVED_METHOD")"EXCEPTION_HANDLERS, FN_PTR(JavaMethod_1exceptionHandlers)}, - {CC"JavaMethod_hasBalancedMonitors", CC"("RESOLVED_METHOD")Z", FN_PTR(JavaMethod_1hasBalancedMonitors)}, - {CC"JavaMethod_uniqueConcreteMethod", CC"("RESOLVED_METHOD")"METHOD, FN_PTR(JavaMethod_1uniqueConcreteMethod)}, - {CC"getJavaMethod", CC"("REFLECT_METHOD")"METHOD, FN_PTR(getJavaMethod)}, - {CC"JavaMethod_methodData", CC"("RESOLVED_METHOD")"METHOD_DATA, FN_PTR(JavaMethod_1methodData)}, - {CC"JavaMethod_invocationCount", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_1invocationCount)}, - {CC"JavaMethod_hasCompiledCode", CC"("RESOLVED_METHOD")Z", FN_PTR(JavaMethod_1hasCompiledCode)}, - {CC"JavaMethod_getCompiledCodeSize", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_1getCompiledCodeSize)}, - {CC"Signature_lookupType", CC"("STRING RESOLVED_TYPE"Z)"TYPE, FN_PTR(Signature_1lookupType)}, - {CC"ConstantPool_lookupConstant", CC"("RESOLVED_TYPE"I)"OBJECT, FN_PTR(ConstantPool_1lookupConstant)}, - {CC"ConstantPool_lookupMethod", CC"("RESOLVED_TYPE"IB)"METHOD, FN_PTR(ConstantPool_1lookupMethod)}, - {CC"ConstantPool_lookupType", CC"("RESOLVED_TYPE"I)"TYPE, FN_PTR(ConstantPool_1lookupType)}, - {CC"ConstantPool_loadReferencedType", CC"("RESOLVED_TYPE"IB)V", FN_PTR(ConstantPool_1loadReferencedType)}, - {CC"ConstantPool_lookupField", CC"("RESOLVED_TYPE"IB)"FIELD, FN_PTR(ConstantPool_1lookupField)}, - {CC"JavaType_resolveMethodImpl", CC"("RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(JavaType_3resolveMethodImpl)}, - {CC"JavaType_isSubtypeOf", CC"("RESOLVED_TYPE TYPE")Z", FN_PTR(JavaType_2isSubtypeOf)}, - {CC"JavaType_leastCommonAncestor", CC"("RESOLVED_TYPE RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_2leastCommonAncestor)}, - {CC"JavaType_componentType", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_1componentType)}, - {CC"JavaType_uniqueConcreteSubtype", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_1uniqueConcreteSubtype)}, - {CC"JavaType_superType", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_1superType)}, - {CC"JavaType_arrayOf", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_1arrayOf)}, - {CC"JavaType_fields", CC"("RESOLVED_TYPE")["RESOLVED_FIELD, FN_PTR(JavaType_1fields)}, - {CC"JavaType_isInitialized", CC"("RESOLVED_TYPE")Z", FN_PTR(JavaType_1isInitialized)}, + {CC"JavaMethod_code", CC"("RESOLVED_METHOD")[B", FN_PTR(JavaMethod_code)}, + {CC"JavaMethod_signature", CC"("RESOLVED_METHOD")"STRING, FN_PTR(JavaMethod_signature)}, + {CC"JavaMethod_exceptionHandlers", CC"("RESOLVED_METHOD")"EXCEPTION_HANDLERS, FN_PTR(JavaMethod_exceptionHandlers)}, + {CC"JavaMethod_hasBalancedMonitors", CC"("RESOLVED_METHOD")Z", FN_PTR(JavaMethod_hasBalancedMonitors)}, + {CC"JavaMethod_uniqueConcreteMethod", CC"("RESOLVED_METHOD")"METHOD, FN_PTR(JavaMethod_uniqueConcreteMethod)}, + {CC"JavaMethod_toStackTraceElement", CC"("RESOLVED_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(JavaMethod_toStackTraceElement)}, + {CC"JavaMethod_methodData", CC"("RESOLVED_METHOD")"METHOD_DATA, FN_PTR(JavaMethod_methodData)}, + {CC"JavaMethod_invocationCount", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_invocationCount)}, + {CC"JavaMethod_hasCompiledCode", CC"("RESOLVED_METHOD")Z", FN_PTR(JavaMethod_hasCompiledCode)}, + {CC"JavaMethod_getCompiledCodeSize", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_getCompiledCodeSize)}, + {CC"JavaMethod_vtableEntryOffset", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_vtableEntryOffset)}, + + {CC"Signature_lookupType", CC"("STRING RESOLVED_TYPE"Z)"TYPE, FN_PTR(Signature_lookupType)}, + + {CC"ConstantPool_lookupConstant", CC"("RESOLVED_TYPE"I)"OBJECT, FN_PTR(ConstantPool_lookupConstant)}, + {CC"ConstantPool_lookupMethod", CC"("RESOLVED_TYPE"IB)"METHOD, FN_PTR(ConstantPool_lookupMethod)}, + {CC"ConstantPool_lookupType", CC"("RESOLVED_TYPE"I)"TYPE, FN_PTR(ConstantPool_lookupType)}, + {CC"ConstantPool_loadReferencedType", CC"("RESOLVED_TYPE"IB)V", FN_PTR(ConstantPool_loadReferencedType)}, + {CC"ConstantPool_lookupField", CC"("RESOLVED_TYPE"IB)"FIELD, FN_PTR(ConstantPool_lookupField)}, + + {CC"JavaType_resolveMethodImpl", CC"("RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(JavaType_resolveMethodImpl)}, + {CC"JavaType_isSubtypeOf", CC"("RESOLVED_TYPE TYPE")Z", FN_PTR(JavaType_isSubtypeOf)}, + {CC"JavaType_leastCommonAncestor", CC"("RESOLVED_TYPE RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_leastCommonAncestor)}, + {CC"JavaType_componentType", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_componentType)}, + {CC"JavaType_uniqueConcreteSubtype", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_uniqueConcreteSubtype)}, + {CC"JavaType_superType", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_superType)}, + {CC"JavaType_prototypeMarkWord", CC"("RESOLVED_TYPE")J", FN_PTR(JavaType_prototypeMarkWord)}, + {CC"JavaType_arrayOf", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(JavaType_arrayOf)}, + {CC"JavaType_fields", CC"("RESOLVED_TYPE")["RESOLVED_FIELD, FN_PTR(JavaType_fields)}, + {CC"JavaType_isInitialized", CC"("RESOLVED_TYPE")Z", FN_PTR(JavaType_isInitialized)}, + {CC"getPrimitiveArrayType", CC"("KIND")"TYPE, FN_PTR(getPrimitiveArrayType)}, {CC"getMaxCallTargetOffset", CC"("RUNTIME_CALL")J", FN_PTR(getMaxCallTargetOffset)}, {CC"getType", CC"("CLASS")"TYPE, FN_PTR(getType)}, - {CC"getConfiguration", CC"()"CONFIG, FN_PTR(getConfiguration)}, + {CC"getJavaMethod", CC"("REFLECT_METHOD")"METHOD, FN_PTR(getJavaMethod)}, + {CC"initializeConfiguration", CC"("CONFIG")V", FN_PTR(initializeConfiguration)}, {CC"installMethod", CC"("HS_COMP_RESULT"Z"HS_CODE_INFO")"HS_COMP_METHOD, FN_PTR(installMethod)}, {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)}, - {CC"JavaMethod_toStackTraceElement", CC"("RESOLVED_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(JavaMethod_1toStackTraceElement)}, {CC"executeCompiledMethod", CC"("HS_COMP_METHOD OBJECT OBJECT OBJECT")"OBJECT, FN_PTR(executeCompiledMethod)}, {CC"executeCompiledMethodVarargs", CC"("HS_COMP_METHOD "["OBJECT")"OBJECT, FN_PTR(executeCompiledMethodVarargs)}, - {CC"JavaMethod_vtableEntryOffset", CC"("RESOLVED_METHOD")I", FN_PTR(JavaMethod_vtableEntryOffset)}, {CC"getDeoptedLeafGraphIds", CC"()[J", FN_PTR(getDeoptedLeafGraphIds)}, {CC"decodePC", CC"(J)"STRING, FN_PTR(decodePC)}, };
--- a/src/share/vm/graal/graalJavaAccess.hpp Thu Sep 13 11:27:37 2012 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Thu Sep 13 11:29:18 2012 +0200 @@ -52,7 +52,6 @@ oop_field(HotSpotResolvedJavaType, javaMirror, "Ljava/lang/Class;") \ oop_field(HotSpotResolvedJavaType, simpleName, "Ljava/lang/String;") \ int_field(HotSpotResolvedJavaType, accessFlags) \ - long_field(HotSpotResolvedJavaType, initialMarkWord) \ boolean_field(HotSpotResolvedJavaType, hasFinalizer) \ boolean_field(HotSpotResolvedJavaType, hasFinalizableSubclass) \ int_field(HotSpotResolvedJavaType, superCheckOffset) \