< prev index next >

src/hotspot/share/runtime/sharedRuntime.cpp

Print this page

        

@@ -464,10 +464,14 @@
   // JVMCI's ExceptionHandlerStub expects the thread local exception PC to be clear
   // and other exception handler continuations do not read it
   thread->set_exception_pc(NULL);
 #endif // INCLUDE_JVMCI
 
+  if (Continuation::is_return_barrier_entry(return_address)) {
+    return StubRoutines::cont_returnBarrierExc();
+  }
+  
   // The fastest case first
   CodeBlob* blob = CodeCache::find_blob(return_address);
   CompiledMethod* nm = (blob != NULL) ? blob->as_compiled_method_or_null() : NULL;
   if (nm != NULL) {
     // Set flag if return address is a method handle call site.

@@ -505,10 +509,11 @@
   guarantee(!VtableStubs::contains(return_address), "NULL exceptions in vtables should have been handled already!");
 
 #ifndef PRODUCT
   { ResourceMark rm;
     tty->print_cr("No exception handler found for exception at " INTPTR_FORMAT " - potential problems:", p2i(return_address));
+    os::print_location(tty, (intptr_t)return_address);
     tty->print_cr("a) exception happened in (new?) code stubs/buffers that is not handled here");
     tty->print_cr("b) other problem");
   }
 #endif // PRODUCT
 

@@ -530,11 +535,11 @@
   // Should be an nmethod
   guarantee(cb != NULL && cb->is_compiled(), "safepoint polling: pc must refer to an nmethod");
 
   // Look up the relocation information
   assert(((CompiledMethod*)cb)->is_at_poll_or_poll_return(pc),
-    "safepoint polling: type must be poll");
+      "safepoint polling: type must be poll at pc " INTPTR_FORMAT, p2i(pc));
 
 #ifdef ASSERT
   if (!((NativeInstruction*)pc)->is_safepoint_poll()) {
     tty->print_cr("bad pc: " PTR_FORMAT, p2i(pc));
     Disassembler::decode(cb);

@@ -697,17 +702,18 @@
   }
 #endif
 
   if (t == NULL) {
     ttyLocker ttyl;
-    tty->print_cr("MISSING EXCEPTION HANDLER for pc " INTPTR_FORMAT " and handler bci %d", p2i(ret_pc), handler_bci);
+    tty->print_cr("MISSING EXCEPTION HANDLER for pc " INTPTR_FORMAT " and handler bci %d, catch_pco: %d", p2i(ret_pc), handler_bci, catch_pco);
     tty->print_cr("   Exception:");
     exception->print();
     tty->cr();
     tty->print_cr(" Compiled exception table :");
     table.print();
-    nm->print_code();
+    nm->print();
+    // nm->print_code();
     guarantee(false, "missing exception handler");
     return NULL;
   }
 
   return nm->code_begin() + t->pco();

@@ -2750,11 +2756,11 @@
       ttyLocker ttyl;
       entry->print_adapter_on(tty);
       tty->print_cr("i2c argument handler #%d for: %s %s %s (%d bytes generated)",
                     _adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"),
                     method->signature()->as_C_string(), fingerprint->as_string(), insts_size);
-      tty->print_cr("c2i argument handler starts at %p", entry->get_c2i_entry());
+      tty->print_cr("c2i argument handler starts at " INTPTR_FORMAT, p2i(entry->get_c2i_entry()));
       if (Verbose || PrintStubCode) {
         address first_pc = entry->base_address();
         if (first_pc != NULL) {
           Disassembler::decode(first_pc, first_pc + insts_size);
           tty->cr();

@@ -3050,10 +3056,19 @@
   // results
   *arg_size = cnt;
   return regs;
 }
 
+JRT_LEAF(jlong, SharedRuntime::continuation_getFP(JavaThread* thread) )
+  RegisterMap reg_map2(thread);
+  assert(false, "");
+  frame stubFrame   = thread->last_frame();
+    // Caller-frame is a compiled frame
+  frame callerFrame = stubFrame.sender(&reg_map2);
+  return (jlong) callerFrame.real_fp();
+JRT_END
+
 // OSR Migration Code
 //
 // This code is used convert interpreter frames into compiled frames.  It is
 // called from very start of a compiled OSR nmethod.  A temp array is
 // allocated to hold the interesting bits of the interpreter frame.  All

@@ -3200,11 +3215,15 @@
   CompiledMethod* nm = NULL;
   int count = 1;
 
   assert(fr.is_java_frame(), "Must start on Java frame");
 
-  while (true) {
+  RegisterMap map(JavaThread::current(), false, true); // don't update; walk continuations
+  for (; !fr.is_first_frame(); fr = fr.sender(&map)) {
+    if (!fr.is_java_frame())
+      continue;
+
     Method* method = NULL;
     bool found = false;
     if (fr.is_interpreted_frame()) {
       method = fr.interpreter_frame_method();
       if (method != NULL && method->has_reserved_stack_access()) {

@@ -3234,15 +3253,10 @@
       if (event.should_commit()) {
         event.set_method(method);
         event.commit();
       }
     }
-    if (fr.is_first_java_frame()) {
-      break;
-    } else {
-      fr = fr.java_sender();
-    }
   }
   return activation;
 }
 
 void SharedRuntime::on_slowpath_allocation_exit(JavaThread* thread) {
< prev index next >