# HG changeset patch # User Thomas Wuerthinger # Date 1432042558 -7200 # Node ID e479ee4aa9aa39dd083bece9dbaf107e9ec38e02 # Parent a9b3d1cfdd42e473fc987a2c97ada5bbb2ebf73e# Parent 178a4927b95c5b26e2b5bc435bd174df6eb79532 Merge. diff -r a9b3d1cfdd42 -r e479ee4aa9aa graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java Tue May 19 15:35:58 2015 +0200 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.sparc; + +import static com.oracle.graal.api.code.ValueUtil.*; +import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.asm.sparc.*; +import com.oracle.graal.lir.*; +import com.oracle.graal.lir.asm.*; +import com.oracle.graal.lir.sparc.*; + +/** + * Jumps to the exception handler specified by {@link #address} and leaves the current window. It + * does not modify the i7 register, as the exception handler stub expects the throwing pc in it. + *

+ * See also: + *

  • Runtime1::generate_handle_exception c1_Runtime1_sparc.cpp + *
  • SharedRuntime::generate_deopt_blob at exception_in_tls_offset (sharedRuntime_sparc.cpp) + */ +@Opcode("JUMP_TO_EXCEPTION_HANDLER") +final class SPARCHotSpotJumpToExceptionHandlerOp extends SPARCLIRInstruction { + public static final LIRInstructionClass TYPE = LIRInstructionClass.create(SPARCHotSpotJumpToExceptionHandlerOp.class); + + @Use(REG) AllocatableValue address; + + SPARCHotSpotJumpToExceptionHandlerOp(AllocatableValue address) { + super(TYPE); + this.address = address; + } + + @Override + public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + Register addrRegister = asLongReg(address); + masm.jmp(addrRegister); + masm.restoreWindow(); + } +} diff -r a9b3d1cfdd42 -r e479ee4aa9aa graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Tue May 19 15:35:47 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Tue May 19 15:35:58 2015 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -125,6 +125,10 @@ append(new SPARCHotSpotPatchReturnAddressOp(gen.load(operand(address)))); } + public void emitJumpToExceptionHandler(ValueNode address) { + append(new SPARCHotSpotJumpToExceptionHandlerOp(gen.load(operand(address)))); + } + @Override public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) { Variable handler = gen.load(operand(handlerInCallerPc)); diff -r a9b3d1cfdd42 -r e479ee4aa9aa graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotNodeLIRBuilder.java Tue May 19 15:35:47 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotNodeLIRBuilder.java Tue May 19 15:35:58 2015 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,10 @@ void emitPatchReturnAddress(ValueNode address); + default void emitJumpToExceptionHandler(ValueNode address) { + emitPatchReturnAddress(address); + } + void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc); void emitPrefetchAllocate(ValueNode address, ValueNode distance); diff -r a9b3d1cfdd42 -r e479ee4aa9aa graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/JumpToExceptionHandlerNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/JumpToExceptionHandlerNode.java Tue May 19 15:35:58 2015 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.nodes; + +import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.stubs.*; +import com.oracle.graal.nodeinfo.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.word.*; + +/** + * Jumps to the exception handler specified by {@link #address}. This node is specific for the + * {@link ExceptionHandlerStub} and should not be used elswhere. + */ +@NodeInfo +public final class JumpToExceptionHandlerNode extends FixedWithNextNode implements LIRLowerable { + + public static final NodeClass TYPE = NodeClass.create(JumpToExceptionHandlerNode.class); + @Input ValueNode address; + + public JumpToExceptionHandlerNode(ValueNode address) { + super(TYPE, StampFactory.forVoid()); + this.address = address; + } + + @Override + public void generate(NodeLIRBuilderTool gen) { + ((HotSpotNodeLIRBuilder) gen).emitJumpToExceptionHandler(address); + } + + @NodeIntrinsic + public static native void jumpToExceptionHandler(Word address); +} diff -r a9b3d1cfdd42 -r e479ee4aa9aa 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 Tue May 19 15:35:47 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/ExceptionHandlerStub.java Tue May 19 15:35:58 2015 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,6 +22,7 @@ */ package com.oracle.graal.hotspot.stubs; +import static com.oracle.graal.hotspot.nodes.JumpToExceptionHandlerNode.*; import static com.oracle.graal.hotspot.nodes.PatchReturnAddressNode.*; import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; import static com.oracle.graal.hotspot.stubs.StubUtil.*; @@ -95,7 +96,7 @@ } // patch the return address so that this stub returns to the exception handler - patchReturnAddress(handlerPc); + jumpToExceptionHandler(handlerPc); } static void checkNoExceptionInThread(Word thread, boolean enabled) { diff -r a9b3d1cfdd42 -r e479ee4aa9aa graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue May 19 15:35:47 2015 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue May 19 15:35:58 2015 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -314,7 +314,6 @@ final Frame parent; public Frame(Iterator blocks, Loop loop, Frame parent) { - super(); this.blocks = blocks; this.loop = loop; this.parent = parent; diff -r a9b3d1cfdd42 -r e479ee4aa9aa src/cpu/sparc/vm/sharedRuntime_sparc.cpp --- a/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue May 19 15:35:47 2015 +0200 +++ b/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue May 19 15:35:58 2015 +0200 @@ -3546,11 +3546,8 @@ #ifdef GRAAL masm->block_comment("BEGIN GRAAL"); int implicit_exception_uncommon_trap_offset = __ offset() - start; - //__ pushptr(Address(G2_thread, in_bytes(JavaThread::graal_implicit_exception_pc_offset()))); __ ld_ptr(G2_thread, in_bytes(JavaThread::graal_implicit_exception_pc_offset()), O7); - //__ add(G0, 0x321, O7); __ add(O7, -8, O7); - //__ st_ptr(I7, SP, I7->sp_offset_in_saved_window()*wordSize + STACK_BIAS); int uncommon_trap_offset = __ offset() - start; @@ -3558,15 +3555,11 @@ masm->block_comment("save_live_regs"); (void) RegisterSaver::save_live_registers(masm, 0, &frame_size_words); masm->block_comment("/save_live_regs"); - //__ ld_ptr(G2_thread, in_bytes(JavaThread::graal_implicit_exception_pc_offset()), O7); - // fetch_unroll_info needs to call last_java_frame() masm->block_comment("set_last_java_frame"); __ set_last_Java_frame(SP, NULL); masm->block_comment("/set_last_java_frame"); - //__ movl(c_rarg1, Address(r15_thread, in_bytes(ThreadShadow::pending_deoptimization_offset()))); __ ld(G2_thread, in_bytes(ThreadShadow::pending_deoptimization_offset()), O1); - //__ movl(Address(r15_thread, in_bytes(ThreadShadow::pending_deoptimization_offset())), -1); __ sub(G0, 1, L1); __ st_ptr(L1, G2_thread, in_bytes(ThreadShadow::pending_deoptimization_offset())); @@ -3613,33 +3606,6 @@ // Restore G2_thread __ get_thread(); -#ifdef GRAAL - // load throwing pc from JavaThread and patch it as the return address - // of the current frame. Then clear the field in JavaThread - __ block_comment("load throwing pc and patch return"); - Address exception_pc(G2_thread, JavaThread::exception_pc_offset()); - Label has_no_pc; - // TODO: Remove this weird check if we should patch the return pc - // This is because when graal decides to deoptimize and the ExceptionHandlerStub.java - // jumps back to this code and the I7 register contains the pc pointing to the begin - // of this code. If this is the case (PC within a certain range) then we need to patch - // the return pc. - // THIS NEEDS REWORK! (sa) - __ rdpc(L0); - __ sub(L0, I7, L0); - __ cmp(L0, 0xFFF); - __ br(Assembler::greater, false, Assembler::pt, has_no_pc); - __ delayed() -> nop(); - __ cmp(L0, -0xFFF); - __ br(Assembler::less, false, Assembler::pt, has_no_pc); - __ delayed() -> nop(); - __ ld_ptr(exception_pc, I7); - __ sub(I7, 8, I7); - __ st_ptr(G0, exception_pc); - __ bind(has_no_pc); - __ block_comment("/load throwing pc and patch return"); -#endif // GAAL - #ifdef ASSERT { // verify that there is really an exception oop in exception_oop