/hg/icedtea6: Fix PR icedtea/484
gbenson at icedtea.classpath.org
gbenson at icedtea.classpath.org
Fri May 14 05:55:33 PDT 2010
changeset d2cf98636cb7 in /hg/icedtea6
details: http://icedtea.classpath.org/hg/icedtea6?cmd=changeset;node=d2cf98636cb7
author: Gary Benson <gbenson at redhat.com>
date: Fri May 14 13:55:26 2010 +0100
Fix PR icedtea/484
diffstat:
13 files changed, 139 insertions(+), 62 deletions(-)
ChangeLog | 43 +++++++++++++++
ports/hotspot/make/linux/makefiles/zeroshark.make | 3 -
ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp | 38 ++++++++-----
ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp | 8 +-
ports/hotspot/src/cpu/zero/vm/entry_zero.hpp | 30 ++++++----
ports/hotspot/src/share/vm/shark/sharkBuilder.cpp | 6 +-
ports/hotspot/src/share/vm/shark/sharkBuilder.hpp | 1
ports/hotspot/src/share/vm/shark/sharkContext.cpp | 6 +-
ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp | 4 -
ports/hotspot/src/share/vm/shark/sharkRuntime.cpp | 24 ++------
ports/hotspot/src/share/vm/shark/sharkRuntime.hpp | 4 -
ports/hotspot/src/share/vm/shark/sharkStack.cpp | 2
ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp | 32 ++++++++---
diffs (469 lines):
diff -r f50bc2a9120e -r d2cf98636cb7 ChangeLog
--- a/ChangeLog Fri May 14 11:16:36 2010 +0100
+++ b/ChangeLog Fri May 14 13:55:26 2010 +0100
@@ -1,3 +1,46 @@ 2010-05-14 Gary Benson <gbenson at redhat
+2010-05-14 Gary Benson <gbenson at redhat.com>
+
+ PR icedtea/484
+ * ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp
+ (CppInterpreter::normal_entry): Return int instead of void.
+ (CppInterpreter::native_entry): Likewise.
+ (CppInterpreter::accessor_entry): Likewise.
+ (CppInterpreter::empty_entry): Likewise.
+ * ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
+ (CppInterpreter::normal_entry): Return 0.
+ (CppInterpreter::native_entry): Likewise.
+ (CppInterpreter::accessor_entry): Likewise.
+ (CppInterpreter::empty_entry): Likewise.
+ * ports/hotspot/src/cpu/zero/vm/entry_zero.hpp
+ (ZeroEntry::NormalEntryFunc): Return int instead of void.
+ (ZeroEntry::OSREntryFunc): Likewise.
+ (ZeroEntry::invoke): Deoptimize where necessary.
+ (ZeroEntry::invoke_osr): Likewise.
+ (ZeroEntry::maybe_deoptimize): New method.
+ * ports/hotspot/src/share/vm/shark/sharkBuilder.hpp
+ (SharkBuilder::deoptimized_entry_point): New method.
+ * ports/hotspot/src/share/vm/shark/sharkBuilder.hpp
+ (SharkBuilder::uncommon_trap): Return int instead of void.
+ (SharkBuilder::deoptimized_entry_point): New method.
+ * ports/hotspot/src/share/vm/shark/sharkContext.cpp
+ (SharkContext::SharkContext): Updated entry point types.
+ * ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
+ (SharkNativeWrapper::initialize): Make generated wrappers
+ return 0 instead of void.
+ * ports/hotspot/src/share/vm/shark/sharkRuntime.cpp
+ (SharkRuntime::uncommon_trap): Return int instead of void.
+ * ports/hotspot/src/share/vm/shark/sharkRuntime.cpp
+ (SharkRuntime::uncommon_trap): Don't enter the interpreter,
+ just return the number of frames that have been deoptimized.
+ * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
+ (SharkTopLevelBlock::do_trap): Return the number of deoptimized
+ frames instead of void.
+ (SharkTopLevelBlock::handle_return): Return 0 instead of void.
+ (SharkTopLevelBlock::do_call): Deoptimize where necessary.
+
+ * ports/hotspot/make/linux/makefiles/zeroshark.make:
+ Note that ARM interpreter needs updating for this change too.
+
2010-05-14 Gary Benson <gbenson at redhat.com>
* ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/make/linux/makefiles/zeroshark.make
--- a/ports/hotspot/make/linux/makefiles/zeroshark.make Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/make/linux/makefiles/zeroshark.make Fri May 14 13:55:26 2010 +0100
@@ -31,7 +31,8 @@ Obj_Files += cppInterpreter_arm.o
Obj_Files += cppInterpreter_arm.o
Obj_Files += thumb2.o
-#XXX disabled until it has the updated frame anchor code
+#XXX disabled until it has the updated frame anchor code (PR icedtea/323)
+#XXX and the updated calling convention for deopt (PR icedtea/484)
#CFLAGS += -DHOTSPOT_ASM
%.o: %.S
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri May 14 13:55:26 2010 +0100
@@ -37,15 +37,18 @@
thread->reset_last_Java_frame(); \
fixup_after_potential_safepoint()
-void CppInterpreter::normal_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+int CppInterpreter::normal_entry(methodOop method, intptr_t UNUSED, TRAPS) {
JavaThread *thread = (JavaThread *) THREAD;
// Allocate and initialize our frame.
- InterpreterFrame *frame = InterpreterFrame::build(method, CHECK);
+ InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
thread->push_zero_frame(frame);
// Execute those bytecodes!
main_loop(0, THREAD);
+
+ // No deoptimized frames on the stack
+ return 0;
}
void CppInterpreter::main_loop(int recurse, TRAPS) {
@@ -165,7 +168,7 @@ void CppInterpreter::main_loop(int recur
stack->push(result[-i]);
}
-void CppInterpreter::native_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+int CppInterpreter::native_entry(methodOop method, intptr_t UNUSED, TRAPS) {
// Make sure method is native and not abstract
assert(method->is_native() && !method->is_abstract(), "should be");
@@ -173,7 +176,7 @@ void CppInterpreter::native_entry(method
ZeroStack *stack = thread->zero_stack();
// Allocate and initialize our frame
- InterpreterFrame *frame = InterpreterFrame::build(method, CHECK);
+ InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
thread->push_zero_frame(frame);
interpreterState istate = frame->interpreter_state();
intptr_t *locals = istate->locals();
@@ -430,25 +433,26 @@ void CppInterpreter::native_entry(method
ShouldNotReachHere();
}
}
+
+ // No deoptimized frames on the stack
+ return 0;
}
-void CppInterpreter::accessor_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+int CppInterpreter::accessor_entry(methodOop method, intptr_t UNUSED, TRAPS) {
JavaThread *thread = (JavaThread *) THREAD;
ZeroStack *stack = thread->zero_stack();
intptr_t *locals = stack->sp();
// Drop into the slow path if we need a safepoint check
if (SafepointSynchronize::do_call_back()) {
- normal_entry(method, 0, THREAD);
- return;
+ return normal_entry(method, 0, THREAD);
}
// Load the object pointer and drop into the slow path
// if we have a NullPointerException
oop object = LOCALS_OBJECT(0);
if (object == NULL) {
- normal_entry(method, 0, THREAD);
- return;
+ return normal_entry(method, 0, THREAD);
}
// Read the field index from the bytecode, which looks like this:
@@ -470,15 +474,14 @@ void CppInterpreter::accessor_entry(meth
constantPoolCacheOop cache = method->constants()->cache();
ConstantPoolCacheEntry* entry = cache->entry_at(index);
if (!entry->is_resolved(Bytecodes::_getfield)) {
- normal_entry(method, 0, THREAD);
- return;
+ return normal_entry(method, 0, THREAD);
}
// Get the result and push it onto the stack
switch (entry->flag_state()) {
case ltos:
case dtos:
- stack->overflow_check(1, CHECK);
+ stack->overflow_check(1, CHECK_0);
stack->alloc(wordSize);
break;
}
@@ -558,20 +561,25 @@ void CppInterpreter::accessor_entry(meth
ShouldNotReachHere();
}
}
+
+ // No deoptimized frames on the stack
+ return 0;
}
-void CppInterpreter::empty_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+int CppInterpreter::empty_entry(methodOop method, intptr_t UNUSED, TRAPS) {
JavaThread *thread = (JavaThread *) THREAD;
ZeroStack *stack = thread->zero_stack();
// Drop into the slow path if we need a safepoint check
if (SafepointSynchronize::do_call_back()) {
- normal_entry(method, 0, THREAD);
- return;
+ return normal_entry(method, 0, THREAD);
}
// Pop our parameters
stack->set_sp(stack->sp() + method->size_of_parameters());
+
+ // No deoptimized frames on the stack
+ return 0;
}
InterpreterFrame *InterpreterFrame::build(const methodOop method, TRAPS) {
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp Fri May 14 13:55:26 2010 +0100
@@ -29,10 +29,10 @@
public:
// Method entries
- static void normal_entry(methodOop method, intptr_t UNUSED, TRAPS);
- static void native_entry(methodOop method, intptr_t UNUSED, TRAPS);
- static void accessor_entry(methodOop method, intptr_t UNUSED, TRAPS);
- static void empty_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static int normal_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static int native_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static int accessor_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static int empty_entry(methodOop method, intptr_t UNUSED, TRAPS);
public:
// Main loop of normal_entry
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/cpu/zero/vm/entry_zero.hpp
--- a/ports/hotspot/src/cpu/zero/vm/entry_zero.hpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/cpu/zero/vm/entry_zero.hpp Fri May 14 13:55:26 2010 +0100
@@ -1,6 +1,6 @@
/*
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright 2008, 2009 Red Hat, Inc.
+ * Copyright 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,20 +41,30 @@ class ZeroEntry {
}
private:
- typedef void (*NormalEntryFunc)(methodOop method,
- intptr_t base_pc,
- TRAPS);
- typedef void (*OSREntryFunc)(methodOop method,
- address osr_buf,
- intptr_t base_pc,
- TRAPS);
+ typedef int (*NormalEntryFunc)(methodOop method,
+ intptr_t base_pc,
+ TRAPS);
+ typedef int (*OSREntryFunc)(methodOop method,
+ address osr_buf,
+ intptr_t base_pc,
+ TRAPS);
public:
void invoke(methodOop method, TRAPS) const {
- ((NormalEntryFunc) entry_point())(method, (intptr_t) this, THREAD);
+ maybe_deoptimize(
+ ((NormalEntryFunc) entry_point())(method, (intptr_t) this, THREAD),
+ THREAD);
}
void invoke_osr(methodOop method, address osr_buf, TRAPS) const {
- ((OSREntryFunc) entry_point())(method, osr_buf, (intptr_t) this, THREAD);
+ maybe_deoptimize(
+ ((OSREntryFunc) entry_point())(method, osr_buf, (intptr_t) this, THREAD),
+ THREAD);
+ }
+
+ private:
+ static void maybe_deoptimize(int deoptimized_frames, TRAPS) {
+ if (deoptimized_frames)
+ CppInterpreter::main_loop(deoptimized_frames - 1, THREAD);
}
public:
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkBuilder.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp Fri May 14 13:55:26 2010 +0100
@@ -326,7 +326,11 @@ Value* SharkBuilder::throw_StackOverflow
}
Value* SharkBuilder::uncommon_trap() {
- return make_function((address) SharkRuntime::uncommon_trap, "Ti", "v");
+ return make_function((address) SharkRuntime::uncommon_trap, "Ti", "i");
+}
+
+Value* SharkBuilder::deoptimized_entry_point() {
+ return make_function((address) CppInterpreter::main_loop, "iT", "v");
}
// Native-Java transition
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkBuilder.hpp
--- a/ports/hotspot/src/share/vm/shark/sharkBuilder.hpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBuilder.hpp Fri May 14 13:55:26 2010 +0100
@@ -133,6 +133,7 @@ class SharkBuilder : public llvm::IRBuil
public:
llvm::Value* throw_StackOverflowError();
llvm::Value* uncommon_trap();
+ llvm::Value* deoptimized_entry_point();
// Intrinsics and external functions, part 4: Native-Java transition.
// This is a special case in that it is invoked during a thread
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkContext.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkContext.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkContext.cpp Fri May 14 13:55:26 2010 +0100
@@ -1,6 +1,6 @@
/*
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright 2009 Red Hat, Inc.
+ * Copyright 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -76,14 +76,14 @@ SharkContext::SharkContext(const char* n
params.push_back(methodOop_type());
params.push_back(intptr_type());
params.push_back(thread_type());
- _entry_point_type = FunctionType::get(void_type(), params, false);
+ _entry_point_type = FunctionType::get(jint_type(), params, false);
params.clear();
params.push_back(methodOop_type());
params.push_back(PointerType::getUnqual(jbyte_type()));
params.push_back(intptr_type());
params.push_back(thread_type());
- _osr_entry_point_type = FunctionType::get(void_type(), params, false);
+ _osr_entry_point_type = FunctionType::get(jint_type(), params, false);
// Create mappings
for (int i = 0; i < T_CONFLICT; i++) {
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp Fri May 14 13:55:26 2010 +0100
@@ -283,7 +283,7 @@ void SharkNativeWrapper::initialize(cons
builder()->SetInsertPoint(exception);
CreateResetHandleBlock();
stack()->CreatePopFrame(0);
- builder()->CreateRetVoid();
+ builder()->CreateRet(LLVMValue::jint_constant(0));
builder()->SetInsertPoint(no_exception);
@@ -348,5 +348,5 @@ void SharkNativeWrapper::initialize(cons
result_addr,
PointerType::getUnqual(SharkType::to_stackType(result_type))));
}
- builder()->CreateRetVoid();
+ builder()->CreateRet(LLVMValue::jint_constant(0));
}
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkRuntime.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkRuntime.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkRuntime.cpp Fri May 14 13:55:26 2010 +0100
@@ -192,14 +192,14 @@ bool SharkRuntime::is_subtype_of(klassOo
return object_klass->klass_part()->is_subtype_of(check_klass);
}
-void SharkRuntime::uncommon_trap(JavaThread* thread, int trap_request) {
+int SharkRuntime::uncommon_trap(JavaThread* thread, int trap_request) {
+ Thread *THREAD = thread;
+
// In C2, uncommon_trap_blob creates a frame, so all the various
// deoptimization functions expect to find the frame of the method
// being deopted one frame down on the stack. We create a dummy
// frame to mirror this.
- FakeStubFrame *stubframe = FakeStubFrame::build(thread);
- if (thread->has_pending_exception())
- return;
+ FakeStubFrame *stubframe = FakeStubFrame::build(CHECK_0);
thread->push_zero_frame(stubframe);
// Initiate the trap
@@ -216,16 +216,12 @@ void SharkRuntime::uncommon_trap(JavaThr
int number_of_frames = urb->number_of_frames();
for (int i = 0; i < number_of_frames; i++) {
intptr_t size = urb->frame_sizes()[i];
- InterpreterFrame *frame = InterpreterFrame::build(size, thread);
- if (thread->has_pending_exception())
- return;
+ InterpreterFrame *frame = InterpreterFrame::build(size, CHECK_0);
thread->push_zero_frame(frame);
}
// Push another dummy frame
- stubframe = FakeStubFrame::build(thread);
- if (thread->has_pending_exception())
- return;
+ stubframe = FakeStubFrame::build(CHECK_0);
thread->push_zero_frame(stubframe);
// Fill in the skeleton frames
@@ -236,12 +232,8 @@ void SharkRuntime::uncommon_trap(JavaThr
// Pop our dummy frame
thread->pop_zero_frame();
- // Jump into the interpreter
-#ifdef CC_INTERP
- CppInterpreter::main_loop(number_of_frames - 1, thread);
-#else
- Unimplemented();
-#endif // CC_INTERP
+ // Fall back into the interpreter
+ return number_of_frames;
}
FakeStubFrame* FakeStubFrame::build(TRAPS) {
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkRuntime.hpp
--- a/ports/hotspot/src/share/vm/shark/sharkRuntime.hpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkRuntime.hpp Fri May 14 13:55:26 2010 +0100
@@ -1,6 +1,6 @@
/*
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright 2008, 2009 Red Hat, Inc.
+ * Copyright 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -79,5 +79,5 @@ class SharkRuntime : public AllStatic {
public:
static void dump(const char *name, intptr_t value);
static bool is_subtype_of(klassOop check_klass, klassOop object_klass);
- static void uncommon_trap(JavaThread* thread, int trap_request);
+ static int uncommon_trap(JavaThread* thread, int trap_request);
};
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkStack.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkStack.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkStack.cpp Fri May 14 13:55:26 2010 +0100
@@ -135,7 +135,7 @@ void SharkStack::CreateStackOverflowChec
// Handle overflows
builder()->SetInsertPoint(overflow);
builder()->CreateCall(builder()->throw_StackOverflowError(), thread());
- builder()->CreateRetVoid();
+ builder()->CreateRet(LLVMValue::jint_constant(0));
builder()->SetInsertPoint(abi_ok);
}
diff -r f50bc2a9120e -r d2cf98636cb7 ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp Fri May 14 11:16:36 2010 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp Fri May 14 13:55:26 2010 +0100
@@ -594,11 +594,11 @@ bool SharkTopLevelBlock::can_reach_helpe
void SharkTopLevelBlock::do_trap(int trap_request) {
decache_for_trap();
- builder()->CreateCall2(
- builder()->uncommon_trap(),
- thread(),
- LLVMValue::jint_constant(trap_request));
- builder()->CreateRetVoid();
+ builder()->CreateRet(
+ builder()->CreateCall2(
+ builder()->uncommon_trap(),
+ thread(),
+ LLVMValue::jint_constant(trap_request)));
}
void SharkTopLevelBlock::call_register_finalizer(Value *receiver) {
@@ -677,7 +677,7 @@ void SharkTopLevelBlock::handle_return(B
PointerType::getUnqual(SharkType::to_stackType(type))));
}
- builder()->CreateRetVoid();
+ builder()->CreateRet(LLVMValue::jint_constant(0));
}
void SharkTopLevelBlock::do_arraylength() {
@@ -1203,7 +1203,25 @@ void SharkTopLevelBlock::do_call() {
// Make the call
decache_for_Java_call(call_method);
- builder()->CreateCall3(entry_point, callee, base_pc, thread());
+ Value *deoptimized_frames = builder()->CreateCall3(
+ entry_point, callee, base_pc, thread());
+
+ // If the callee got deoptimized then reexecute in the interpreter
+ BasicBlock *reexecute = function()->CreateBlock("reexecute");
+ BasicBlock *call_completed = function()->CreateBlock("call_completed");
+ builder()->CreateCondBr(
+ builder()->CreateICmpNE(deoptimized_frames, LLVMValue::jint_constant(0)),
+ reexecute, call_completed);
+
+ builder()->SetInsertPoint(reexecute);
+ builder()->CreateCall2(
+ builder()->deoptimized_entry_point(),
+ builder()->CreateSub(deoptimized_frames, LLVMValue::jint_constant(1)),
+ thread());
+ builder()->CreateBr(call_completed);
+
+ // Cache after the call
+ builder()->SetInsertPoint(call_completed);
cache_after_Java_call(call_method);
// Check for pending exceptions
More information about the distro-pkg-dev
mailing list