< prev index next >

src/os_cpu/linux_x86/vm/os_linux_x86.cpp

Print this page




 218   assert(fr->is_java_frame(), "Safety check");
 219   return true;
 220 }
 221 
 222 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 223 // turned off by -fomit-frame-pointer,
 224 frame os::get_sender_for_C_frame(frame* fr) {
 225   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 226 }
 227 
 228 intptr_t* _get_previous_fp() {
 229 #ifdef SPARC_WORKS
 230   register intptr_t **ebp;
 231   __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
 232 #elif defined(__clang__)
 233   intptr_t **ebp;
 234   __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
 235 #else
 236   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 237 #endif
 238   return (intptr_t*) *ebp;   // we want what it points to.








 239 }
 240 
 241 
 242 frame os::current_frame() {
 243   intptr_t* fp = _get_previous_fp();
 244   frame myframe((intptr_t*)os::current_stack_pointer(),
 245                 (intptr_t*)fp,
 246                 CAST_FROM_FN_PTR(address, os::current_frame));
 247   if (os::is_first_C_frame(&myframe)) {
 248     // stack is not walkable
 249     return frame();
 250   } else {
 251     return os::get_sender_for_C_frame(&myframe);
 252   }
 253 }
 254 
 255 // Utility functions
 256 
 257 // From IA32 System Programming Guide
 258 enum {




 218   assert(fr->is_java_frame(), "Safety check");
 219   return true;
 220 }
 221 
 222 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 223 // turned off by -fomit-frame-pointer,
 224 frame os::get_sender_for_C_frame(frame* fr) {
 225   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 226 }
 227 
 228 intptr_t* _get_previous_fp() {
 229 #ifdef SPARC_WORKS
 230   register intptr_t **ebp;
 231   __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
 232 #elif defined(__clang__)
 233   intptr_t **ebp;
 234   __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
 235 #else
 236   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 237 #endif
 238   // ebp is for this frame (_get_previous_fp). We want the ebp for the
 239   // caller of os::current_frame*(), so go up two frames. However, for
 240   // optimized builds, _get_previous_fp() will be inlined, so only go
 241   // up 1 frame in that case.
 242 #ifdef _NMT_NOINLINE_
 243   return **(intptr_t***)ebp;
 244 #else
 245   return *ebp;
 246 #endif
 247 }
 248 
 249 
 250 frame os::current_frame() {
 251   intptr_t* fp = _get_previous_fp();
 252   frame myframe((intptr_t*)os::current_stack_pointer(),
 253                 (intptr_t*)fp,
 254                 CAST_FROM_FN_PTR(address, os::current_frame));
 255   if (os::is_first_C_frame(&myframe)) {
 256     // stack is not walkable
 257     return frame();
 258   } else {
 259     return os::get_sender_for_C_frame(&myframe);
 260   }
 261 }
 262 
 263 // Utility functions
 264 
 265 // From IA32 System Programming Guide
 266 enum {


< prev index next >