提交 653ef337 编写于 作者: N never

7043301: assert(locals < caller->fp() || locals > (caller->fp() + 16)) failed: locals in save area

Reviewed-by: kvn
上级 63ceb304
...@@ -811,7 +811,7 @@ intptr_t* frame::interpreter_frame_tos_at(jint offset) const { ...@@ -811,7 +811,7 @@ intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
#ifdef ASSERT #ifdef ASSERT
#define DESCRIBE_FP_OFFSET(name) \ #define DESCRIBE_FP_OFFSET(name) \
values.describe(-1, fp() + frame::name##_offset, #name) values.describe(frame_no, fp() + frame::name##_offset, #name)
void frame::describe_pd(FrameValues& values, int frame_no) { void frame::describe_pd(FrameValues& values, int frame_no) {
for (int w = 0; w < frame::register_save_words; w++) { for (int w = 0; w < frame::register_save_words; w++) {
......
...@@ -1712,7 +1712,10 @@ int AbstractInterpreter::layout_activation(methodOop method, ...@@ -1712,7 +1712,10 @@ int AbstractInterpreter::layout_activation(methodOop method,
// frames so place the locals adjacent to the varargs area. // frames so place the locals adjacent to the varargs area.
locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1; locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1;
if (caller->is_interpreted_frame()) { if (caller->is_interpreted_frame()) {
*interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + rounded_cls) - STACK_BIAS; int parm_words = method->size_of_parameters() * Interpreter::stackElementWords;
int delta = local_words - parm_words;
int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
*interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
} }
} }
if (TraceDeoptimization) { if (TraceDeoptimization) {
......
...@@ -650,7 +650,7 @@ intptr_t* frame::interpreter_frame_tos_at(jint offset) const { ...@@ -650,7 +650,7 @@ intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
#ifdef ASSERT #ifdef ASSERT
#define DESCRIBE_FP_OFFSET(name) \ #define DESCRIBE_FP_OFFSET(name) \
values.describe(-1, fp() + frame::name##_offset, #name) values.describe(frame_no, fp() + frame::name##_offset, #name)
void frame::describe_pd(FrameValues& values, int frame_no) { void frame::describe_pd(FrameValues& values, int frame_no) {
if (is_interpreted_frame()) { if (is_interpreted_frame()) {
......
...@@ -1423,7 +1423,7 @@ void FrameValues::describe(int owner, intptr_t* location, const char* descriptio ...@@ -1423,7 +1423,7 @@ void FrameValues::describe(int owner, intptr_t* location, const char* descriptio
} }
bool FrameValues::validate() { void FrameValues::validate() {
_values.sort(compare); _values.sort(compare);
bool error = false; bool error = false;
FrameValue prev; FrameValue prev;
...@@ -1446,7 +1446,7 @@ bool FrameValues::validate() { ...@@ -1446,7 +1446,7 @@ bool FrameValues::validate() {
prev = fv; prev = fv;
} }
} }
return error; assert(!error, "invalid layout");
} }
......
...@@ -511,7 +511,7 @@ class FrameValues { ...@@ -511,7 +511,7 @@ class FrameValues {
// Used by frame functions to describe locations. // Used by frame functions to describe locations.
void describe(int owner, intptr_t* location, const char* description, int priority = 0); void describe(int owner, intptr_t* location, const char* description, int priority = 0);
bool validate(); void validate();
void print(); void print();
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册