# HG changeset patch # User Lukas Stadler # Date 1367857551 -7200 # Node ID c84eb4661fe97a7d6ec4ba031bceb5d37e20e916 # Parent c064c48b93878a888b8f61fae0cae4bd060f75ca# Parent ff153f4ae48b6797e6b7f472395366ee83b656a4 Merge diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Mon May 06 18:25:51 2013 +0200 @@ -28,7 +28,6 @@ import static com.oracle.graal.hotspot.nodes.MonitorEnterStubCall.*; import static com.oracle.graal.hotspot.nodes.MonitorExitStubCall.*; import static com.oracle.graal.hotspot.nodes.VMErrorNode.*; -import static com.oracle.graal.hotspot.nodes.VerifyOopStubCall.*; import static com.oracle.graal.hotspot.nodes.WriteBarrierPostStubCall.*; import static com.oracle.graal.hotspot.nodes.WriteBarrierPreStubCall.*; import static com.oracle.graal.hotspot.replacements.AESCryptSubstitutions.DecryptBlockStubCall.*; @@ -101,11 +100,6 @@ /* arg0: object */ javaCallingConvention(Kind.Object, /* arg1: lock */ word)); - addRuntimeCall(VERIFY_OOP, config.verifyOopStub, - /* temps */ null, - /* ret */ ret(Kind.Void), - /* arg0: object */ r13.asValue(Kind.Object)); - addRuntimeCall(VM_ERROR, config.vmErrorStub, /* temps */ null, /* ret */ ret(Kind.Void), diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon May 06 18:25:51 2013 +0200 @@ -240,6 +240,10 @@ */ public int threadIsMethodHandleReturnOffset; + public long verifyOopCounterAddress; + public long verifyOopMask; + public long verifyOopBits; + /** * Offset of the _exception_oop field in Thread (defined in thread.hpp). This field is used to * pass exception objects into and out of the runtime system during exception handling for @@ -370,11 +374,9 @@ public long wbPreCallStub; public long wbPostCallStub; - public long verifyOopStub; public long vmErrorStub; public long uncommonTrapStub; public long unwindExceptionStub; - public long osrMigrationEndStub; public long createNullPointerExceptionStub; public long createOutOfBoundsExceptionStub; public long javaTimeMillisStub; @@ -402,6 +404,7 @@ public long identityHashCodeAddress; public long exceptionHandlerForPcAddress; public long exceptionHandlerForReturnAddressAddress; + public long osrMigrationEndAddress; public int deoptReasonNullCheck; public int deoptReasonRangeCheck; diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon May 06 18:25:51 2013 +0200 @@ -35,6 +35,7 @@ import static com.oracle.graal.hotspot.nodes.NewInstanceStubCall.*; import static com.oracle.graal.hotspot.nodes.NewMultiArrayStubCall.*; import static com.oracle.graal.hotspot.nodes.ThreadIsInterruptedStubCall.*; +import static com.oracle.graal.hotspot.nodes.VerifyOopStubCall.*; import static com.oracle.graal.hotspot.replacements.SystemSubstitutions.*; import static com.oracle.graal.hotspot.stubs.ExceptionHandlerStub.*; import static com.oracle.graal.hotspot.stubs.IdentityHashCodeStub.*; @@ -217,10 +218,17 @@ // @formatter:off - addRuntimeCall(OSR_MIGRATION_END, config.osrMigrationEndStub, - /* temps */ null, + addStubCall(VERIFY_OOP, + /* ret */ ret(Kind.Object), + /* arg0: object */ javaCallingConvention(Kind.Object)); + + addStubCall(OSR_MIGRATION_END, /* ret */ ret(Kind.Void), - /* arg0: long */ javaCallingConvention(Kind.Long)); + /* arg0: buffer */ javaCallingConvention(word)); + + addCRuntimeCall(OSRMigrationEndStub.OSR_MIGRATION_END_C, config.osrMigrationEndAddress, + /* ret */ ret(Kind.Void), + /* arg0: buffer */ nativeCallingConvention(word)); addRuntimeCall(UNCOMMON_TRAP, config.uncommonTrapStub, /* temps */ null, @@ -487,6 +495,8 @@ registerStub(new IdentityHashCodeStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(IDENTITY_HASHCODE))); registerStub(new ExceptionHandlerStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(EXCEPTION_HANDLER))); registerStub(new UnwindExceptionToCallerStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(UNWIND_EXCEPTION_TO_CALLER))); + registerStub(new VerifyOopStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(VERIFY_OOP))); + registerStub(new OSRMigrationEndStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(OSR_MIGRATION_END))); } private void registerStub(Stub stub) { diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VerifyOopStubCall.java Mon May 06 18:25:51 2013 +0200 @@ -26,16 +26,17 @@ import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; +import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; /** - * Node implementing a call to HotSpot's object pointer verification stub. + * Call to {@link VerifyOopStub}. */ public class VerifyOopStubCall extends DeoptimizingStubCall implements LIRGenLowerable { @Input private final ValueNode object; - public static final Descriptor VERIFY_OOP = new Descriptor("verify_oop", false, void.class, Object.class); + public static final Descriptor VERIFY_OOP = new Descriptor("verify_oop", false, Object.class, Object.class); public VerifyOopStubCall(ValueNode object) { super(StampFactory.objectNonNull()); diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ExceptionHandlerStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ExceptionHandlerStub.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ExceptionHandlerStub.java Mon May 06 18:25:51 2013 +0200 @@ -70,7 +70,11 @@ writeExceptionOop(thread(), exception); writeExceptionPc(thread(), exceptionPc); if (logging()) { - printf("handling exception %p at %p\n", Word.fromObject(exception).rawValue(), exceptionPc.rawValue()); + printf("handling exception %p (", Word.fromObject(exception).rawValue()); + decipher(Word.fromObject(exception).rawValue()); + printf(") at %p (", Word.fromObject(exception).rawValue(), exceptionPc.rawValue()); + decipher(exceptionPc.rawValue()); + printf(")\n"); } // patch throwing pc into return address so that deoptimization finds the right debug info @@ -79,7 +83,9 @@ Word handlerPc = exceptionHandlerForPc(EXCEPTION_HANDLER_FOR_PC, thread()); if (logging()) { - printf("handler for exception %p at %p is at %p\n", Word.fromObject(exception).rawValue(), exceptionPc.rawValue(), handlerPc.rawValue()); + printf("handler for exception %p at %p is at %p (", Word.fromObject(exception).rawValue(), exceptionPc.rawValue(), handlerPc.rawValue()); + decipher(handlerPc.rawValue()); + printf(")\n"); } // patch the return address so that this stub returns to the exception handler diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon May 06 18:25:51 2013 +0200 @@ -108,7 +108,7 @@ printf("newArray: allocated new array at %p\n", memory.rawValue()); } formatArray(hub, sizeInBytes, length, headerSize, memory, Word.unsigned(arrayPrototypeMarkWord()), true); - return memory.toObject(); + return verifyObject(memory.toObject()); } } if (logging()) { @@ -124,7 +124,7 @@ getAndClearObjectResult(thread()); DeoptimizeCallerNode.deopt(InvalidateReprofile, RuntimeConstraint); } - return getAndClearObjectResult(thread()); + return verifyObject(getAndClearObjectResult(thread())); } public static final Descriptor NEW_ARRAY_C = descriptorFor(NewArrayStub.class, "newArrayC", false); diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon May 06 18:25:51 2013 +0200 @@ -98,7 +98,7 @@ for (int offset = 2 * wordSize(); offset < sizeInBytes; offset += wordSize()) { memory.writeWord(offset, Word.zero(), ANY_LOCATION); } - return memory.toObject(); + return verifyObject(memory.toObject()); } } } @@ -116,7 +116,7 @@ getAndClearObjectResult(thread()); DeoptimizeCallerNode.deopt(InvalidateReprofile, RuntimeConstraint); } - return getAndClearObjectResult(thread()); + return verifyObject(getAndClearObjectResult(thread())); } /** diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/OSRMigrationEndStub.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/OSRMigrationEndStub.java Mon May 06 18:25:51 2013 +0200 @@ -0,0 +1,55 @@ +/* + * 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.stubs; + +import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; +import com.oracle.graal.api.code.*; +import com.oracle.graal.graph.Node.ConstantNodeParameter; +import com.oracle.graal.graph.Node.NodeIntrinsic; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.*; +import com.oracle.graal.word.*; + +/** + * Stub called from {@link OSRStartNode}. + */ +public class OSRMigrationEndStub extends CRuntimeStub { + + public OSRMigrationEndStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { + super(runtime, replacements, target, linkage); + } + + @Snippet + private static void osrMigrationEnd(Word buffer) { + osrMigrationEndC(OSR_MIGRATION_END_C, buffer); + } + + public static final Descriptor OSR_MIGRATION_END_C = descriptorFor(OSRMigrationEndStub.class, "osrMigrationEndC", false); + + @NodeIntrinsic(CRuntimeCall.class) + public static native void osrMigrationEndC(@ConstantNodeParameter Descriptor osrMigrationEndC, Word buffer); +} diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Mon May 06 18:25:51 2013 +0200 @@ -28,6 +28,7 @@ import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; import static com.oracle.graal.hotspot.nodes.CStringNode.*; import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; +import static com.oracle.graal.word.Word.*; import java.lang.reflect.*; import java.util.*; @@ -54,7 +55,7 @@ import com.oracle.graal.phases.*; import com.oracle.graal.phases.PhasePlan.PhasePosition; import com.oracle.graal.replacements.*; -import com.oracle.graal.replacements.Snippet.ConstantParameter; +import com.oracle.graal.replacements.Snippet.*; import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; import com.oracle.graal.replacements.SnippetTemplate.Arguments; import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; @@ -301,6 +302,13 @@ } /** + * Analyzes a given value and prints information about it to the log stream. + */ + public static void decipher(long value) { + vmMessageC(VM_MESSAGE_C, false, Word.zero(), value, 0L, 0L); + } + + /** * Exits the VM with a given error message. *

* Stubs must use this instead of {@link VMErrorNode#vmError(String, long)} to avoid an @@ -353,4 +361,49 @@ public static void fatal(String format, long v1, long v2, long v3) { vmMessageC(VM_MESSAGE_C, true, cstring(format), v1, v2, v3); } + + /** + * Verifies that a given object value is well formed if {@code -XX:+VerifyOops} is enabled. + */ + public static Object verifyObject(Object object) { + if (verifyOops()) { + // TODO (ds) The counter read is ok but the write causes a segv - find out why + // Word verifyOopCounter = Word.unsigned(verifyOopCounterAddress()); + // verifyOopCounter.writeInt(0, verifyOopCounter.readInt(0) + 1); + + Pointer oop = Word.fromObject(object); + if (object != null) { + // make sure object is 'reasonable' + if (!oop.and(unsigned(verifyOopMask())).equal(unsigned(verifyOopBits()))) { + fatal("oop not in heap: %p", oop.rawValue()); + } + + Word klass = oop.readWord(hubOffset()); + if (klass.equal(Word.zero())) { + fatal("klass for oop %p is null", oop.rawValue()); + } + } + } + return object; + } + + @Fold + private static long verifyOopCounterAddress() { + return config().verifyOopCounterAddress; + } + + @Fold + private static long verifyOopMask() { + return config().verifyOopMask; + } + + @Fold + private static long verifyOopBits() { + return config().verifyOopBits; + } + + @Fold + private static int hubOffset() { + return config().hubOffset; + } } diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UnwindExceptionToCallerStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UnwindExceptionToCallerStub.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UnwindExceptionToCallerStub.java Mon May 06 18:25:51 2013 +0200 @@ -61,16 +61,23 @@ @Snippet private static void unwindExceptionToCaller(Object exception, Word returnAddress) { + Pointer exceptionOop = Word.fromObject(exception); + if (logging()) { + printf("unwinding exception %p (", exceptionOop.rawValue()); + decipher(exceptionOop.rawValue()); + printf(") at %p (", exceptionOop.rawValue(), returnAddress.rawValue()); + decipher(returnAddress.rawValue()); + printf(")\n"); + } checkNoExceptionInThread(assertionsEnabled()); checkExceptionNotNull(assertionsEnabled(), exception); - if (logging()) { - printf("unwinding exception %p at return address %p\n", Word.fromObject(exception).rawValue(), returnAddress.rawValue()); - } Word handlerInCallerPc = exceptionHandlerForReturnAddress(EXCEPTION_HANDLER_FOR_RETURN_ADDRESS, thread(), returnAddress); if (logging()) { - printf("handler for exception %p at return address %p is at %p\n", Word.fromObject(exception).rawValue(), returnAddress.rawValue(), handlerInCallerPc.rawValue()); + printf("handler for exception %p at return address %p is at %p (", exceptionOop.rawValue(), returnAddress.rawValue(), handlerInCallerPc.rawValue()); + decipher(handlerInCallerPc.rawValue()); + printf(")\n"); } jumpToExceptionHandlerInCaller(handlerInCallerPc, exception, returnAddress); diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/VerifyOopStub.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/VerifyOopStub.java Mon May 06 18:25:51 2013 +0200 @@ -0,0 +1,45 @@ +/* + * 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.stubs; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.*; + +/** + * Stub called from {@link VerifyOopStubCall}. + */ +public class VerifyOopStub extends CRuntimeStub { + + public VerifyOopStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { + super(runtime, replacements, target, linkage); + } + + @Snippet + private static Object verifyOop(Object object) { + return verifyObject(object); + } +} diff -r c064c48b9387 -r c84eb4661fe9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Mon May 06 16:58:23 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Mon May 06 18:25:51 2013 +0200 @@ -83,12 +83,13 @@ @Override public boolean push(PiNode parent) { ObjectStamp piStamp = parent.objectStamp(); - ObjectStamp piValueStamp = parent.object().objectStamp(); - if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { - replaceFirstInput(parent, parent.object()); - return true; - } else { - return false; + if (parent.object().kind() == Kind.Object) { + ObjectStamp piValueStamp = parent.object().objectStamp(); + if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { + replaceFirstInput(parent, parent.object()); + return true; + } } + return false; } } diff -r c064c48b9387 -r c84eb4661fe9 src/cpu/x86/vm/graalRuntime_x86.cpp --- a/src/cpu/x86/vm/graalRuntime_x86.cpp Mon May 06 16:58:23 2013 +0200 +++ b/src/cpu/x86/vm/graalRuntime_x86.cpp Mon May 06 18:25:51 2013 +0200 @@ -625,17 +625,6 @@ OopMapSet* oop_maps = NULL; switch (id) { - case OSR_migration_end_id: { - __ enter(); - save_live_registers(sasm, 0); - __ movptr(c_rarg0, j_rarg0); - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_end))); - restore_live_registers(sasm); - __ leave(); - __ ret(0); - break; - } - case create_null_pointer_exception_id: { __ enter(); oop_maps = new OopMapSet(); @@ -708,15 +697,6 @@ break; } - case verify_oop_id: { - // We use enter & leave so that a better stack trace is produced in the hs_err file - __ enter(); - __ verify_oop(r13, "Graal verify oop"); - __ leave(); - __ ret(0); - break; - } - case arithmetic_frem_id: { __ subptr(rsp, 8); __ movflt(Address(rsp, 0), xmm1); diff -r c064c48b9387 -r c84eb4661fe9 src/cpu/x86/vm/graalStubAssembler_x86.cpp --- a/src/cpu/x86/vm/graalStubAssembler_x86.cpp Mon May 06 16:58:23 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright (c) 1999, 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. - * - */ - -#include "precompiled.hpp" -#include "graal/graalRuntime.hpp" -#include "classfile/systemDictionary.hpp" -#include "gc_interface/collectedHeap.hpp" -#include "interpreter/interpreter.hpp" -#include "oops/arrayOop.hpp" -#include "oops/markOop.hpp" -#include "runtime/basicLock.hpp" -#include "runtime/biasedLocking.hpp" -#include "runtime/os.hpp" -#include "runtime/stubRoutines.hpp" - -#ifndef PRODUCT - -void GraalStubAssembler::verify_stack_oop(int stack_offset) { - if (!VerifyOops) return; - verify_oop_addr(Address(rsp, stack_offset)); -} - -void GraalStubAssembler::verify_not_null_oop(Register r) { - if (!VerifyOops) return; - Label not_null; - testptr(r, r); - jcc(Assembler::notZero, not_null); - stop("non-null oop required"); - bind(not_null); - verify_oop(r); -} - -#endif // ifndef PRODUCT diff -r c064c48b9387 -r c84eb4661fe9 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Mon May 06 16:58:23 2013 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Mon May 06 18:25:51 2013 +0200 @@ -741,6 +741,10 @@ set_boolean("tlabStats", TLABStats); set_boolean("inlineContiguousAllocationSupported", !CMSIncrementalMode && Universe::heap()->supports_inline_contig_alloc()); + set_long("verifyOopCounterAddress", (jlong)(address) StubRoutines::verify_oop_count_addr); + set_long("verifyOopMask", Universe::verify_oop_mask()); + set_long("verifyOopBits", Universe::verify_oop_bits()); + set_long("arrayPrototypeMarkWord", (intptr_t)markOopDesc::prototype()); set_int("layoutHelperLog2ElementSizeShift", Klass::_lh_log2_element_size_shift); set_int("layoutHelperLog2ElementSizeMask", Klass::_lh_log2_element_size_mask); @@ -760,9 +764,7 @@ set_address("handleDeoptStub", SharedRuntime::deopt_blob()->unpack()); set_address("monitorEnterStub", GraalRuntime::entry_for(GraalRuntime::monitorenter_id)); set_address("monitorExitStub", GraalRuntime::entry_for(GraalRuntime::monitorexit_id)); - set_address("verifyOopStub", GraalRuntime::entry_for(GraalRuntime::verify_oop_id)); set_address("vmErrorStub", GraalRuntime::entry_for(GraalRuntime::vm_error_id)); - set_address("osrMigrationEndStub", GraalRuntime::entry_for(GraalRuntime::OSR_migration_end_id)); set_address("createNullPointerExceptionStub", GraalRuntime::entry_for(GraalRuntime::create_null_pointer_exception_id)); set_address("createOutOfBoundsExceptionStub", GraalRuntime::entry_for(GraalRuntime::create_out_of_bounds_exception_id)); set_address("javaTimeMillisStub", CAST_FROM_FN_PTR(address, os::javaTimeMillis)); @@ -790,6 +792,7 @@ set_address("identityHashCodeAddress", GraalRuntime::identity_hash_code); set_address("exceptionHandlerForPcAddress", GraalRuntime::exception_handler_for_pc); set_address("exceptionHandlerForReturnAddressAddress", SharedRuntime::exception_handler_for_return_address); + set_address("osrMigrationEndAddress", SharedRuntime::OSR_migration_end); set_int("deoptReasonNone", Deoptimization::Reason_none); set_int("deoptReasonNullCheck", Deoptimization::Reason_null_check); diff -r c064c48b9387 -r c84eb4661fe9 src/share/vm/graal/graalRuntime.cpp --- a/src/share/vm/graal/graalRuntime.cpp Mon May 06 16:58:23 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Mon May 06 18:25:51 2013 +0200 @@ -127,11 +127,6 @@ // Make sure that stubs that need oopmaps have them switch (id) { // These stubs don't need to have an oopmap -#if defined(SPARC) || defined(PPC) - case handle_exception_nofpu_id: // Unused on sparc -#endif - case verify_oop_id: - case OSR_migration_end_id: case arithmetic_frem_id: case arithmetic_drem_id: break; @@ -568,13 +563,43 @@ tty->print(buf, v1, v2, v3); JRT_END +static void decipher(jlong v, bool ignoreZero) { + if (v != 0 || !ignoreZero) { + void* p = (void *)(address) v; + CodeBlob* cb = CodeCache::find_blob(p); + if (cb) { + if (cb->is_nmethod()) { + char buf[O_BUFLEN]; + tty->print("%s [%p+%d]", cb->as_nmethod_or_null()->method()->name_and_sig_as_C_string(buf, O_BUFLEN), cb->code_begin(), (address)v - cb->code_begin()); + return; + } + cb->print_value_on(tty); + return; + } + if (Universe::heap()->is_in(p)) { + oop obj = oop(p); + obj->print_value_on(tty); + return; + } + tty->print("%p [long: %d, double %f, char %c]", v, v, v, v); + } +} + JRT_LEAF(void, GraalRuntime::vm_message(jboolean vmError, jlong format, jlong v1, jlong v2, jlong v3)) ResourceMark rm; char *buf = (char*) (address) format; if (vmError) { - fatal(err_msg(buf, v1, v2, v3)); + if (buf != NULL) { + fatal(err_msg(buf, v1, v2, v3)); + } else { + fatal(""); + } + } else if (buf != NULL) { + tty->print(buf, v1, v2, v3); } else { - tty->print(buf, v1, v2, v3); + assert(v2 == 0, "v2 != 0"); + assert(v3 == 0, "v3 != 0"); + decipher(v1, false); } JRT_END diff -r c064c48b9387 -r c84eb4661fe9 src/share/vm/graal/graalRuntime.hpp --- a/src/share/vm/graal/graalRuntime.hpp Mon May 06 16:58:23 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.hpp Mon May 06 18:25:51 2013 +0200 @@ -62,9 +62,6 @@ int num_rt_args() const { return _num_rt_args; } int stub_id() const { return _stub_id; } - void verify_stack_oop(int offset) PRODUCT_RETURN; - void verify_not_null_oop(Register r) PRODUCT_RETURN; - // runtime calls (return offset of call to be used by GC map) int call_RT(Register oop_result1, Register metadata_result, address entry, int args_size = 0); int call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1); @@ -81,12 +78,10 @@ // runtime routines needed by code code generated // by Graal. #define GRAAL_STUBS(stub, last_entry) \ - stub(OSR_migration_end) \ stub(arithmetic_frem) \ stub(arithmetic_drem) \ stub(monitorenter) \ stub(monitorexit) \ - stub(verify_oop) \ stub(vm_error) \ stub(create_null_pointer_exception) \ stub(create_out_of_bounds_exception) \