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 {
|