--- old/src/cpu/x86/vm/frame_x86.cpp 2016-10-25 10:40:02.366773023 +0200 +++ new/src/cpu/x86/vm/frame_x86.cpp 2016-10-25 10:40:02.319772991 +0200 @@ -148,6 +148,10 @@ sender_pc = (address) *(sender_sp-1); } + if (SharedRuntime::is_memento_stack_trace_return_handler(sender_pc)) { + sender_pc = thread->memento_original_return_address(); + } + // If the potential sender is the interpreter then we can do some more checking if (Interpreter::contains(sender_pc)) { @@ -165,7 +169,7 @@ // construct the potential sender - frame sender(sender_sp, saved_fp, sender_pc); + frame sender(thread, sender_sp, saved_fp, sender_pc); return sender.is_interpreted_frame_valid(thread); @@ -203,7 +207,7 @@ // construct the potential sender - frame sender(sender_sp, saved_fp, sender_pc); + frame sender(thread, sender_sp, saved_fp, sender_pc); // Validate the JavaCallWrapper an entry frame must have address jcw = (address)sender.entry_frame_call_wrapper(); @@ -274,6 +278,11 @@ tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]", pc_addr, *pc_addr, pc); } + assert(!SharedRuntime::is_memento_stack_trace_return_handler(pc), "new return address must not be memento return handler"); + if (SharedRuntime::is_memento_stack_trace_return_handler(*pc_addr)) { + pc_addr = &(thread->memento_original_return_address()); + assert(*pc_addr != NULL, "memento original return address must be set"); + } // Either the return address is the original one or we are going to // patch in the same address that's already there. assert(_pc == *pc_addr || pc == *pc_addr, "must be"); @@ -373,10 +382,10 @@ map->clear(); assert(map->include_argument_oops(), "should be set by clear"); if (jfa->last_Java_pc() != NULL ) { - frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc()); + frame fr(map->thread(), jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc()); return fr; } - frame fr(jfa->last_Java_sp(), jfa->last_Java_fp()); + frame fr(map->thread(), jfa->last_Java_sp(), jfa->last_Java_fp()); return fr; } @@ -456,7 +465,7 @@ } #endif // COMPILER2 - return frame(sender_sp, unextended_sp, link(), sender_pc()); + return frame(map->thread(), sender_sp, unextended_sp, link(), sender_pc()); } @@ -493,7 +502,7 @@ } assert(sender_sp != sp(), "must have changed"); - return frame(sender_sp, unextended_sp, *saved_fp_addr, sender_pc); + return frame(map->thread(), sender_sp, unextended_sp, *saved_fp_addr, sender_pc); } @@ -513,7 +522,7 @@ } // Must be native-compiled frame, i.e. the marshaling code for native // methods that exists in the core system. - return frame(sender_sp(), link(), sender_pc()); + return frame(map->thread(), sender_sp(), link(), sender_pc()); } @@ -710,7 +719,7 @@ #ifndef PRODUCT // This is a generic constructor which is only used by pns() in debug.cpp. -frame::frame(void* sp, void* fp, void* pc) { - init((intptr_t*)sp, (intptr_t*)fp, (address)pc); +frame::frame(Thread* thread, void* sp, void* fp, void* pc) { + init(thread, (intptr_t*)sp, (intptr_t*)fp, (address)pc); } #endif