< prev index next >

src/os_cpu/windows_x86/vm/thread_windows_x86.cpp

Print this page


  56   // At this point, we don't have a last_Java_frame, so
  57   // we try to glean some information out of the CONTEXT
  58   // if we were running Java code when SIGPROF came in.
  59   if (isInJava) {
  60     CONTEXT* uc = (CONTEXT*)ucontext;
  61 
  62 #ifdef AMD64
  63     intptr_t* ret_fp = (intptr_t*) uc->Rbp;
  64     intptr_t* ret_sp = (intptr_t*) uc->Rsp;
  65     ExtendedPC addr = ExtendedPC((address)uc->Rip);
  66 #else
  67     intptr_t* ret_fp = (intptr_t*) uc->Ebp;
  68     intptr_t* ret_sp = (intptr_t*) uc->Esp;
  69     ExtendedPC addr = ExtendedPC((address)uc->Eip);
  70 #endif // AMD64
  71     if (addr.pc() == NULL || ret_sp == NULL ) {
  72       // CONTEXT wasn't useful
  73       return false;
  74     }
  75 
  76 #if INCLUDE_CDS
  77     if (UseSharedSpaces && MetaspaceShared::is_in_shared_region(addr.pc(), MetaspaceShared::md)) {
  78       // In the middle of a trampoline call. Bail out for safety.
  79       // This happens rarely so shouldn't affect profiling.
  80       return false;
  81     }
  82 #endif
  83 
  84     frame ret_frame(ret_sp, ret_fp, addr.pc());
  85     if (!ret_frame.safe_for_sender(jt)) {
  86 #if defined(COMPILER2) || INCLUDE_JVMCI
  87       // C2 and JVMCI use ebp as a general register see if NULL fp helps
  88       frame ret_frame2(ret_sp, NULL, addr.pc());
  89       if (!ret_frame2.safe_for_sender(jt)) {
  90         // nothing else to try if the frame isn't good
  91         return false;
  92       }
  93       ret_frame = ret_frame2;
  94 #else
  95       // nothing else to try if the frame isn't good
  96       return false;
  97 #endif /* COMPILER2 || INCLUDE_JVMCI */
  98     }
  99     *fr_addr = ret_frame;
 100     return true;
 101   }
 102 


  56   // At this point, we don't have a last_Java_frame, so
  57   // we try to glean some information out of the CONTEXT
  58   // if we were running Java code when SIGPROF came in.
  59   if (isInJava) {
  60     CONTEXT* uc = (CONTEXT*)ucontext;
  61 
  62 #ifdef AMD64
  63     intptr_t* ret_fp = (intptr_t*) uc->Rbp;
  64     intptr_t* ret_sp = (intptr_t*) uc->Rsp;
  65     ExtendedPC addr = ExtendedPC((address)uc->Rip);
  66 #else
  67     intptr_t* ret_fp = (intptr_t*) uc->Ebp;
  68     intptr_t* ret_sp = (intptr_t*) uc->Esp;
  69     ExtendedPC addr = ExtendedPC((address)uc->Eip);
  70 #endif // AMD64
  71     if (addr.pc() == NULL || ret_sp == NULL ) {
  72       // CONTEXT wasn't useful
  73       return false;
  74     }
  75 
  76     if (MetaspaceShared::is_in_trampoline_frame(addr.pc())) {

  77       // In the middle of a trampoline call. Bail out for safety.
  78       // This happens rarely so shouldn't affect profiling.
  79       return false;
  80     }

  81 
  82     frame ret_frame(ret_sp, ret_fp, addr.pc());
  83     if (!ret_frame.safe_for_sender(jt)) {
  84 #if defined(COMPILER2) || INCLUDE_JVMCI
  85       // C2 and JVMCI use ebp as a general register see if NULL fp helps
  86       frame ret_frame2(ret_sp, NULL, addr.pc());
  87       if (!ret_frame2.safe_for_sender(jt)) {
  88         // nothing else to try if the frame isn't good
  89         return false;
  90       }
  91       ret_frame = ret_frame2;
  92 #else
  93       // nothing else to try if the frame isn't good
  94       return false;
  95 #endif /* COMPILER2 || INCLUDE_JVMCI */
  96     }
  97     *fr_addr = ret_frame;
  98     return true;
  99   }
 100 
< prev index next >