# HG changeset patch # User Doug Simon # Date 1367268589 -7200 # Node ID 640d86a6bf4a004d2b989d10a2bff5a88be562fe # Parent 8d3a7fb9eb5f679f419e0ad84313619a9ff66a65 replaced register_finalizer assembler stub with a compiled stub (GRAAL-81) diff -r 8d3a7fb9eb5f -r 640d86a6bf4a 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 Apr 29 22:41:24 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Apr 29 22:49:49 2013 +0200 @@ -356,7 +356,6 @@ public long deoptimizeStub; public long unwindExceptionStub; public long osrMigrationEndStub; - public long registerFinalizerStub; public long createNullPointerExceptionStub; public long createOutOfBoundsExceptionStub; public long javaTimeMillisStub; @@ -381,6 +380,7 @@ public long newInstanceAddress; public long newArrayAddress; public long newMultiArrayAddress; + public long registerFinalizerAddress; public int deoptReasonNullCheck; public int deoptReasonRangeCheck; diff -r 8d3a7fb9eb5f -r 640d86a6bf4a 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 Apr 29 22:41:24 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Apr 29 22:49:49 2013 +0200 @@ -37,6 +37,7 @@ import static com.oracle.graal.hotspot.stubs.NewArrayStub.*; import static com.oracle.graal.hotspot.stubs.NewInstanceStub.*; import static com.oracle.graal.hotspot.stubs.NewMultiArrayStub.*; +import static com.oracle.graal.hotspot.stubs.RegisterFinalizerStub.*; import static com.oracle.graal.java.GraphBuilderPhase.RuntimeCalls.*; import static com.oracle.graal.nodes.java.RegisterFinalizerNode.*; import static com.oracle.graal.replacements.Log.*; @@ -215,10 +216,15 @@ /* ret */ ret(Kind.Void), /* arg0: long */ javaCallingConvention(Kind.Long)); - addRuntimeCall(REGISTER_FINALIZER, config.registerFinalizerStub, + addStubCall(REGISTER_FINALIZER, + /* ret */ ret(Kind.Void), + /* arg0: object */ javaCallingConvention(Kind.Object)); + + addCRuntimeCall(REGISTER_FINALIZER_C, config.registerFinalizerAddress, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: object */ javaCallingConvention(Kind.Object)); + /* arg0: thread */ nativeCallingConvention(word, + /* arg1: object */ Kind.Object)); addStubCall(NEW_ARRAY, /* ret */ ret(Kind.Object), @@ -408,6 +414,7 @@ registerStub(new NewInstanceStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(NEW_INSTANCE))); registerStub(new NewArrayStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(NEW_ARRAY))); registerStub(new NewMultiArrayStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(NEW_MULTI_ARRAY))); + registerStub(new RegisterFinalizerStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(REGISTER_FINALIZER))); } private void registerStub(Stub stub) { diff -r 8d3a7fb9eb5f -r 640d86a6bf4a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/RegisterFinalizerStub.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/RegisterFinalizerStub.java Mon Apr 29 22:49:49 2013 +0200 @@ -0,0 +1,58 @@ +/* + * 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 static com.oracle.graal.hotspot.replacements.HotSpotSnippetUtils.*; + +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.java.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.*; +import com.oracle.graal.word.*; + +/** + * Stub called from {@link RegisterFinalizerNode}. + */ +public class RegisterFinalizerStub extends CRuntimeStub { + + public RegisterFinalizerStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { + super(runtime, replacements, target, linkage); + } + + @Snippet + private static void registerFinalizer(Object object) { + registerFinalizerC(REGISTER_FINALIZER_C, thread(), object); + handlePendingException(false); + } + + public static final Descriptor REGISTER_FINALIZER_C = descriptorFor(RegisterFinalizerStub.class, "registerFinalizerC", false); + + @NodeIntrinsic(CRuntimeCall.class) + public static native void registerFinalizerC(@ConstantNodeParameter Descriptor registerFinalizerC, Word thread, Object object); +} diff -r 8d3a7fb9eb5f -r 640d86a6bf4a src/cpu/x86/vm/graalRuntime_x86.cpp --- a/src/cpu/x86/vm/graalRuntime_x86.cpp Mon Apr 29 22:41:24 2013 +0200 +++ b/src/cpu/x86/vm/graalRuntime_x86.cpp Mon Apr 29 22:49:49 2013 +0200 @@ -811,27 +811,6 @@ OopMapSet* oop_maps = NULL; switch (id) { - case register_finalizer_id: - { - __ set_info("register_finalizer", dont_gc_arguments); - - // This is called via call_runtime so the arguments - // will be place in C abi locations - __ verify_oop(j_rarg0); - __ enter(); - OopMap* oop_map = save_live_registers(sasm, 2 /*num_rt_args */); - int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), j_rarg0); - oop_maps = new OopMapSet(); - oop_maps->add_gc_map(call_offset, oop_map); - - // Now restore all the live registers - restore_live_registers(sasm); - - __ leave(); - __ ret(0); - } - break; - case handle_exception_nofpu_id: { GraalStubFrame f(sasm, "handle_exception", dont_gc_arguments); oop_maps = generate_handle_exception(id, sasm); diff -r 8d3a7fb9eb5f -r 640d86a6bf4a src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Mon Apr 29 22:41:24 2013 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Mon Apr 29 22:49:49 2013 +0200 @@ -762,7 +762,6 @@ set_address("deoptimizeStub", SharedRuntime::deopt_blob()->uncommon_trap()); set_address("unwindExceptionStub", GraalRuntime::entry_for(GraalRuntime::unwind_exception_call_id)); set_address("osrMigrationEndStub", GraalRuntime::entry_for(GraalRuntime::OSR_migration_end_id)); - set_address("registerFinalizerStub", GraalRuntime::entry_for(GraalRuntime::register_finalizer_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)); @@ -784,6 +783,7 @@ set_address("newInstanceAddress", GraalRuntime::new_instance); set_address("newArrayAddress", GraalRuntime::new_array); set_address("newMultiArrayAddress", GraalRuntime::new_multi_array); + set_address("registerFinalizerAddress", SharedRuntime::register_finalizer); set_int("deoptReasonNone", Deoptimization::Reason_none); set_int("deoptReasonNullCheck", Deoptimization::Reason_null_check); diff -r 8d3a7fb9eb5f -r 640d86a6bf4a src/share/vm/graal/graalRuntime.hpp --- a/src/share/vm/graal/graalRuntime.hpp Mon Apr 29 22:41:24 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.hpp Mon Apr 29 22:49:49 2013 +0200 @@ -81,7 +81,6 @@ // runtime routines needed by code code generated // by Graal. #define GRAAL_STUBS(stub, last_entry) \ - stub(register_finalizer) \ stub(handle_exception_nofpu) /* optimized version that does not preserve fpu registers */ \ stub(unwind_exception_call) \ stub(OSR_migration_end) \