1 /*
2  * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "classfile/vmSymbols.hpp"
29 #include "code/codeCache.hpp"
30 #include "code/debugInfoRec.hpp"
31 #include "code/nmethod.hpp"
32 #include "code/pcDesc.hpp"
33 #include "code/scopeDesc.hpp"
34 #include "interpreter/interpreter.hpp"
35 #include "interpreter/oopMapCache.hpp"
36 #include "memory/resourceArea.hpp"
37 #include "oops/instanceKlass.hpp"
38 #include "oops/oop.inline.hpp"
39 #include "runtime/frame.inline.hpp"
40 #include "runtime/handles.inline.hpp"
41 #include "runtime/objectMonitor.hpp"
42 #include "runtime/objectMonitor.inline.hpp"
43 #include "runtime/signature.hpp"
44 #include "runtime/stubRoutines.hpp"
45 #include "runtime/synchronizer.hpp"
46 #include "runtime/thread.inline.hpp"
47 #include "runtime/vframe.inline.hpp"
48 #include "runtime/vframeArray.hpp"
49 #include "runtime/vframe_hp.hpp"
50 
vframe(const frame * fr,const RegisterMap * reg_map,JavaThread * thread)51 vframe::vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
52 : _reg_map(reg_map), _thread(thread) {
53   assert(fr != NULL, "must have frame");
54   _fr = *fr;
55 }
56 
vframe(const frame * fr,JavaThread * thread)57 vframe::vframe(const frame* fr, JavaThread* thread)
58 : _reg_map(thread), _thread(thread) {
59   assert(fr != NULL, "must have frame");
60   _fr = *fr;
61 }
62 
new_vframe(const frame * f,const RegisterMap * reg_map,JavaThread * thread)63 vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThread* thread) {
64   // Interpreter frame
65   if (f->is_interpreted_frame()) {
66     return new interpretedVFrame(f, reg_map, thread);
67   }
68 
69   // Compiled frame
70   CodeBlob* cb = f->cb();
71   if (cb != NULL) {
72     if (cb->is_compiled()) {
73       CompiledMethod* nm = (CompiledMethod*)cb;
74       return new compiledVFrame(f, reg_map, thread, nm);
75     }
76 
77     if (f->is_runtime_frame()) {
78       // Skip this frame and try again.
79       RegisterMap temp_map = *reg_map;
80       frame s = f->sender(&temp_map);
81       return new_vframe(&s, &temp_map, thread);
82     }
83   }
84 
85   // External frame
86   return new externalVFrame(f, reg_map, thread);
87 }
88 
sender() const89 vframe* vframe::sender() const {
90   RegisterMap temp_map = *register_map();
91   assert(is_top(), "just checking");
92   if (_fr.is_entry_frame() && _fr.is_first_frame()) return NULL;
93   frame s = _fr.real_sender(&temp_map);
94   if (s.is_first_frame()) return NULL;
95   return vframe::new_vframe(&s, &temp_map, thread());
96 }
97 
top() const98 vframe* vframe::top() const {
99   vframe* vf = (vframe*) this;
100   while (!vf->is_top()) vf = vf->sender();
101   return vf;
102 }
103 
104 
java_sender() const105 javaVFrame* vframe::java_sender() const {
106   vframe* f = sender();
107   while (f != NULL) {
108     if (f->is_java_frame()) return javaVFrame::cast(f);
109     f = f->sender();
110   }
111   return NULL;
112 }
113 
114 // ------------- javaVFrame --------------
115 
locked_monitors()116 GrowableArray<MonitorInfo*>* javaVFrame::locked_monitors() {
117   assert(SafepointSynchronize::is_at_safepoint() || JavaThread::current() == thread(),
118          "must be at safepoint or it's a java frame of the current thread");
119 
120   GrowableArray<MonitorInfo*>* mons = monitors();
121   GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(mons->length());
122   if (mons->is_empty()) return result;
123 
124   bool found_first_monitor = false;
125   ObjectMonitor *pending_monitor = thread()->current_pending_monitor();
126   ObjectMonitor *waiting_monitor = thread()->current_waiting_monitor();
127   oop pending_obj = (pending_monitor != NULL ? (oop) pending_monitor->object() : (oop) NULL);
128   oop waiting_obj = (waiting_monitor != NULL ? (oop) waiting_monitor->object() : (oop) NULL);
129 
130   for (int index = (mons->length()-1); index >= 0; index--) {
131     MonitorInfo* monitor = mons->at(index);
132     if (monitor->eliminated() && is_compiled_frame()) continue; // skip eliminated monitor
133     oop obj = monitor->owner();
134     if (obj == NULL) continue; // skip unowned monitor
135     //
136     // Skip the monitor that the thread is blocked to enter or waiting on
137     //
138     if (!found_first_monitor && (obj == pending_obj || obj == waiting_obj)) {
139       continue;
140     }
141     found_first_monitor = true;
142     result->append(monitor);
143   }
144   return result;
145 }
146 
print_locked_object_class_name(outputStream * st,Handle obj,const char * lock_state)147 void javaVFrame::print_locked_object_class_name(outputStream* st, Handle obj, const char* lock_state) {
148   if (obj.not_null()) {
149     st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, p2i(obj()));
150     if (obj->klass() == SystemDictionary::Class_klass()) {
151       st->print_cr("(a java.lang.Class for %s)", java_lang_Class::as_external_name(obj()));
152     } else {
153       Klass* k = obj->klass();
154       st->print_cr("(a %s)", k->external_name());
155     }
156   }
157 }
158 
print_lock_info_on(outputStream * st,int frame_count)159 void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) {
160   Thread* THREAD = Thread::current();
161   ResourceMark rm(THREAD);
162 
163   // If this is the first frame and it is java.lang.Object.wait(...)
164   // then print out the receiver. Locals are not always available,
165   // e.g., compiled native frames have no scope so there are no locals.
166   if (frame_count == 0) {
167     if (method()->name() == vmSymbols::wait_name() &&
168         method()->method_holder()->name() == vmSymbols::java_lang_Object()) {
169       const char *wait_state = "waiting on"; // assume we are waiting
170       // If earlier in the output we reported java.lang.Thread.State ==
171       // "WAITING (on object monitor)" and now we report "waiting on", then
172       // we are still waiting for notification or timeout. Otherwise if
173       // we earlier reported java.lang.Thread.State == "BLOCKED (on object
174       // monitor)", then we are actually waiting to re-lock the monitor.
175       StackValueCollection* locs = locals();
176       if (!locs->is_empty()) {
177         StackValue* sv = locs->at(0);
178         if (sv->type() == T_OBJECT) {
179           Handle o = locs->at(0)->get_obj();
180           if (java_lang_Thread::get_thread_status(thread()->threadObj()) ==
181                                 java_lang_Thread::BLOCKED_ON_MONITOR_ENTER) {
182             wait_state = "waiting to re-lock in wait()";
183           }
184           print_locked_object_class_name(st, o, wait_state);
185         }
186       } else {
187         st->print_cr("\t- %s <no object reference available>", wait_state);
188       }
189     } else if (thread()->current_park_blocker() != NULL) {
190       oop obj = thread()->current_park_blocker();
191       Klass* k = obj->klass();
192       st->print_cr("\t- %s <" INTPTR_FORMAT "> (a %s)", "parking to wait for ", p2i(obj), k->external_name());
193     }
194     else if (thread()->osthread()->get_state() == OBJECT_WAIT) {
195       // We are waiting on an Object monitor but Object.wait() isn't the
196       // top-frame, so we should be waiting on a Class initialization monitor.
197       InstanceKlass* k = thread()->class_to_be_initialized();
198       if (k != NULL) {
199         st->print_cr("\t- waiting on the Class initialization monitor for %s", k->external_name());
200       }
201     }
202   }
203 
204   // Print out all monitors that we have locked, or are trying to lock,
205   // including re-locking after being notified or timing out in a wait().
206   GrowableArray<MonitorInfo*>* mons = monitors();
207   if (!mons->is_empty()) {
208     bool found_first_monitor = false;
209     for (int index = (mons->length()-1); index >= 0; index--) {
210       MonitorInfo* monitor = mons->at(index);
211       if (monitor->eliminated() && is_compiled_frame()) { // Eliminated in compiled code
212         if (monitor->owner_is_scalar_replaced()) {
213           Klass* k = java_lang_Class::as_Klass(monitor->owner_klass());
214           st->print("\t- eliminated <owner is scalar replaced> (a %s)", k->external_name());
215         } else {
216           Handle obj(THREAD, monitor->owner());
217           if (obj() != NULL) {
218             print_locked_object_class_name(st, obj, "eliminated");
219           }
220         }
221         continue;
222       }
223       if (monitor->owner() != NULL) {
224         // the monitor is associated with an object, i.e., it is locked
225 
226         const char *lock_state = "locked"; // assume we have the monitor locked
227         if (!found_first_monitor && frame_count == 0) {
228           // If this is the first frame and we haven't found an owned
229           // monitor before, then we need to see if we have completed
230           // the lock or if we are blocked trying to acquire it. Only
231           // an inflated monitor that is first on the monitor list in
232           // the first frame can block us on a monitor enter.
233           markWord mark = monitor->owner()->mark();
234           if (mark.has_monitor() &&
235               ( // we have marked ourself as pending on this monitor
236                 mark.monitor() == thread()->current_pending_monitor() ||
237                 // we are not the owner of this monitor
238                 !mark.monitor()->is_entered(thread())
239               )) {
240             lock_state = "waiting to lock";
241           }
242         }
243         print_locked_object_class_name(st, Handle(THREAD, monitor->owner()), lock_state);
244 
245         found_first_monitor = true;
246       }
247     }
248   }
249 }
250 
251 // ------------- interpretedVFrame --------------
252 
bcp() const253 u_char* interpretedVFrame::bcp() const {
254   return fr().interpreter_frame_bcp();
255 }
256 
set_bcp(u_char * bcp)257 void interpretedVFrame::set_bcp(u_char* bcp) {
258   fr().interpreter_frame_set_bcp(bcp);
259 }
260 
locals_addr_at(int offset) const261 intptr_t* interpretedVFrame::locals_addr_at(int offset) const {
262   assert(fr().is_interpreted_frame(), "frame should be an interpreted frame");
263   return fr().interpreter_frame_local_at(offset);
264 }
265 
266 
monitors() const267 GrowableArray<MonitorInfo*>* interpretedVFrame::monitors() const {
268   GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(5);
269   for (BasicObjectLock* current = (fr().previous_monitor_in_interpreter_frame(fr().interpreter_frame_monitor_begin()));
270        current >= fr().interpreter_frame_monitor_end();
271        current = fr().previous_monitor_in_interpreter_frame(current)) {
272     result->push(new MonitorInfo(current->obj(), current->lock(), false, false));
273   }
274   return result;
275 }
276 
bci() const277 int interpretedVFrame::bci() const {
278   return method()->bci_from(bcp());
279 }
280 
method() const281 Method* interpretedVFrame::method() const {
282   return fr().interpreter_frame_method();
283 }
284 
create_stack_value_from_oop_map(const InterpreterOopMap & oop_mask,int index,const intptr_t * const addr)285 static StackValue* create_stack_value_from_oop_map(const InterpreterOopMap& oop_mask,
286                                                    int index,
287                                                    const intptr_t* const addr) {
288 
289   assert(index >= 0 &&
290          index < oop_mask.number_of_entries(), "invariant");
291 
292   // categorize using oop_mask
293   if (oop_mask.is_oop(index)) {
294     // reference (oop) "r"
295     Handle h(Thread::current(), addr != NULL ? (*(oop*)addr) : (oop)NULL);
296     return new StackValue(h);
297   }
298   // value (integer) "v"
299   return new StackValue(addr != NULL ? *addr : 0);
300 }
301 
is_in_expression_stack(const frame & fr,const intptr_t * const addr)302 static bool is_in_expression_stack(const frame& fr, const intptr_t* const addr) {
303   assert(addr != NULL, "invariant");
304 
305   // Ensure to be 'inside' the expresion stack (i.e., addr >= sp for Intel).
306   // In case of exceptions, the expression stack is invalid and the sp
307   // will be reset to express this condition.
308   if (frame::interpreter_frame_expression_stack_direction() > 0) {
309     return addr <= fr.interpreter_frame_tos_address();
310   }
311 
312   return addr >= fr.interpreter_frame_tos_address();
313 }
314 
stack_locals(StackValueCollection * result,int length,const InterpreterOopMap & oop_mask,const frame & fr)315 static void stack_locals(StackValueCollection* result,
316                          int length,
317                          const InterpreterOopMap& oop_mask,
318                          const frame& fr) {
319 
320   assert(result != NULL, "invariant");
321 
322   for (int i = 0; i < length; ++i) {
323     const intptr_t* const addr = fr.interpreter_frame_local_at(i);
324     assert(addr != NULL, "invariant");
325     assert(addr >= fr.sp(), "must be inside the frame");
326 
327     StackValue* const sv = create_stack_value_from_oop_map(oop_mask, i, addr);
328     assert(sv != NULL, "sanity check");
329 
330     result->add(sv);
331   }
332 }
333 
stack_expressions(StackValueCollection * result,int length,int max_locals,const InterpreterOopMap & oop_mask,const frame & fr)334 static void stack_expressions(StackValueCollection* result,
335                               int length,
336                               int max_locals,
337                               const InterpreterOopMap& oop_mask,
338                               const frame& fr) {
339 
340   assert(result != NULL, "invariant");
341 
342   for (int i = 0; i < length; ++i) {
343     const intptr_t* addr = fr.interpreter_frame_expression_stack_at(i);
344     assert(addr != NULL, "invariant");
345     if (!is_in_expression_stack(fr, addr)) {
346       // Need to ensure no bogus escapes.
347       addr = NULL;
348     }
349 
350     StackValue* const sv = create_stack_value_from_oop_map(oop_mask,
351                                                            i + max_locals,
352                                                            addr);
353     assert(sv != NULL, "sanity check");
354 
355     result->add(sv);
356   }
357 }
358 
locals() const359 StackValueCollection* interpretedVFrame::locals() const {
360   return stack_data(false);
361 }
362 
expressions() const363 StackValueCollection* interpretedVFrame::expressions() const {
364   return stack_data(true);
365 }
366 
367 /*
368  * Worker routine for fetching references and/or values
369  * for a particular bci in the interpretedVFrame.
370  *
371  * Returns data for either "locals" or "expressions",
372  * using bci relative oop_map (oop_mask) information.
373  *
374  * @param expressions  bool switch controlling what data to return
375                        (false == locals / true == expression)
376  *
377  */
stack_data(bool expressions) const378 StackValueCollection* interpretedVFrame::stack_data(bool expressions) const {
379 
380   InterpreterOopMap oop_mask;
381   method()->mask_for(bci(), &oop_mask);
382   const int mask_len = oop_mask.number_of_entries();
383 
384   // If the method is native, method()->max_locals() is not telling the truth.
385   // For our purposes, max locals instead equals the size of parameters.
386   const int max_locals = method()->is_native() ?
387     method()->size_of_parameters() : method()->max_locals();
388 
389   assert(mask_len >= max_locals, "invariant");
390 
391   const int length = expressions ? mask_len - max_locals : max_locals;
392   assert(length >= 0, "invariant");
393 
394   StackValueCollection* const result = new StackValueCollection(length);
395 
396   if (0 == length) {
397     return result;
398   }
399 
400   if (expressions) {
401     stack_expressions(result, length, max_locals, oop_mask, fr());
402   } else {
403     stack_locals(result, length, oop_mask, fr());
404   }
405 
406   assert(length == result->size(), "invariant");
407 
408   return result;
409 }
410 
set_locals(StackValueCollection * values) const411 void interpretedVFrame::set_locals(StackValueCollection* values) const {
412   if (values == NULL || values->size() == 0) return;
413 
414   // If the method is native, max_locals is not telling the truth.
415   // maxlocals then equals the size of parameters
416   const int max_locals = method()->is_native() ?
417     method()->size_of_parameters() : method()->max_locals();
418 
419   assert(max_locals == values->size(), "Mismatch between actual stack format and supplied data");
420 
421   // handle locals
422   for (int i = 0; i < max_locals; i++) {
423     // Find stack location
424     intptr_t *addr = locals_addr_at(i);
425 
426     // Depending on oop/int put it in the right package
427     const StackValue* const sv = values->at(i);
428     assert(sv != NULL, "sanity check");
429     if (sv->type() == T_OBJECT) {
430       *(oop *) addr = (sv->get_obj())();
431     } else {                   // integer
432       *addr = sv->get_int();
433     }
434   }
435 }
436 
437 // ------------- cChunk --------------
438 
entryVFrame(const frame * fr,const RegisterMap * reg_map,JavaThread * thread)439 entryVFrame::entryVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
440 : externalVFrame(fr, reg_map, thread) {}
441 
442 #ifdef ASSERT
found_bad_method_frame() const443 void vframeStreamCommon::found_bad_method_frame() const {
444   // 6379830 Cut point for an assertion that occasionally fires when
445   // we are using the performance analyzer.
446   // Disable this assert when testing the analyzer with fastdebug.
447   // -XX:SuppressErrorAt=vframe.cpp:XXX (XXX=following line number)
448   fatal("invalid bci or invalid scope desc");
449 }
450 #endif
451 
452 // top-frame will be skipped
vframeStream(JavaThread * thread,frame top_frame,bool stop_at_java_call_stub)453 vframeStream::vframeStream(JavaThread* thread, frame top_frame,
454   bool stop_at_java_call_stub) : vframeStreamCommon(thread) {
455   _stop_at_java_call_stub = stop_at_java_call_stub;
456 
457   // skip top frame, as it may not be at safepoint
458   _prev_frame = top_frame;
459   _frame  = top_frame.sender(&_reg_map);
460   while (!fill_from_frame()) {
461     _prev_frame = _frame;
462     _frame = _frame.sender(&_reg_map);
463   }
464 }
465 
466 
467 // Step back n frames, skip any pseudo frames in between.
468 // This function is used in Class.forName, Class.newInstance, Method.Invoke,
469 // AccessController.doPrivileged.
security_get_caller_frame(int depth)470 void vframeStreamCommon::security_get_caller_frame(int depth) {
471   assert(depth >= 0, "invalid depth: %d", depth);
472   for (int n = 0; !at_end(); security_next()) {
473     if (!method()->is_ignored_by_security_stack_walk()) {
474       if (n == depth) {
475         // We have reached the desired depth; return.
476         return;
477       }
478       n++;  // this is a non-skipped frame; count it against the depth
479     }
480   }
481   // NOTE: At this point there were not enough frames on the stack
482   // to walk to depth.  Callers of this method have to check for at_end.
483 }
484 
485 
security_next()486 void vframeStreamCommon::security_next() {
487   if (method()->is_prefixed_native()) {
488     skip_prefixed_method_and_wrappers();  // calls next()
489   } else {
490     next();
491   }
492 }
493 
494 
skip_prefixed_method_and_wrappers()495 void vframeStreamCommon::skip_prefixed_method_and_wrappers() {
496   ResourceMark rm;
497   HandleMark hm;
498 
499   int    method_prefix_count = 0;
500   char** method_prefixes = JvmtiExport::get_all_native_method_prefixes(&method_prefix_count);
501   Klass* prefixed_klass = method()->method_holder();
502   const char* prefixed_name = method()->name()->as_C_string();
503   size_t prefixed_name_len = strlen(prefixed_name);
504   int prefix_index = method_prefix_count-1;
505 
506   while (!at_end()) {
507     next();
508     if (method()->method_holder() != prefixed_klass) {
509       break; // classes don't match, can't be a wrapper
510     }
511     const char* name = method()->name()->as_C_string();
512     size_t name_len = strlen(name);
513     size_t prefix_len = prefixed_name_len - name_len;
514     if (prefix_len <= 0 || strcmp(name, prefixed_name + prefix_len) != 0) {
515       break; // prefixed name isn't prefixed version of method name, can't be a wrapper
516     }
517     for (; prefix_index >= 0; --prefix_index) {
518       const char* possible_prefix = method_prefixes[prefix_index];
519       size_t possible_prefix_len = strlen(possible_prefix);
520       if (possible_prefix_len == prefix_len &&
521           strncmp(possible_prefix, prefixed_name, prefix_len) == 0) {
522         break; // matching prefix found
523       }
524     }
525     if (prefix_index < 0) {
526       break; // didn't find the prefix, can't be a wrapper
527     }
528     prefixed_name = name;
529     prefixed_name_len = name_len;
530   }
531 }
532 
533 
skip_reflection_related_frames()534 void vframeStreamCommon::skip_reflection_related_frames() {
535   while (!at_end() &&
536           (method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) ||
537            method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass()))) {
538     next();
539   }
540 }
541 
asJavaVFrame()542 javaVFrame* vframeStreamCommon::asJavaVFrame() {
543   javaVFrame* result = NULL;
544   if (_mode == compiled_mode) {
545     guarantee(_frame.is_compiled_frame(), "expected compiled Java frame");
546 
547     // lazy update to register map
548     bool update_map = true;
549     RegisterMap map(_thread, update_map);
550     frame f = _prev_frame.sender(&map);
551 
552     guarantee(f.is_compiled_frame(), "expected compiled Java frame");
553 
554     compiledVFrame* cvf = compiledVFrame::cast(vframe::new_vframe(&f, &map, _thread));
555 
556     guarantee(cvf->cb() == cb(), "wrong code blob");
557 
558     // get the same scope as this stream
559     cvf = cvf->at_scope(_decode_offset, _vframe_id);
560 
561     guarantee(cvf->scope()->decode_offset() == _decode_offset, "wrong scope");
562     guarantee(cvf->scope()->sender_decode_offset() == _sender_decode_offset, "wrong scope");
563     guarantee(cvf->vframe_id() == _vframe_id, "wrong vframe");
564 
565     result = cvf;
566   } else {
567     result = javaVFrame::cast(vframe::new_vframe(&_frame, &_reg_map, _thread));
568   }
569   guarantee(result->method() == method(), "wrong method");
570   return result;
571 }
572 
573 
574 #ifndef PRODUCT
print()575 void vframe::print() {
576   if (WizardMode) _fr.print_value_on(tty,NULL);
577 }
578 
579 
print_value() const580 void vframe::print_value() const {
581   ((vframe*)this)->print();
582 }
583 
584 
print_value() const585 void entryVFrame::print_value() const {
586   ((entryVFrame*)this)->print();
587 }
588 
print()589 void entryVFrame::print() {
590   vframe::print();
591   tty->print_cr("C Chunk inbetween Java");
592   tty->print_cr("C     link " INTPTR_FORMAT, p2i(_fr.link()));
593 }
594 
595 
596 // ------------- javaVFrame --------------
597 
print_stack_values(const char * title,StackValueCollection * values)598 static void print_stack_values(const char* title, StackValueCollection* values) {
599   if (values->is_empty()) return;
600   tty->print_cr("\t%s:", title);
601   values->print();
602 }
603 
604 
print()605 void javaVFrame::print() {
606   ResourceMark rm;
607   vframe::print();
608   tty->print("\t");
609   method()->print_value();
610   tty->cr();
611   tty->print_cr("\tbci:    %d", bci());
612 
613   print_stack_values("locals",      locals());
614   print_stack_values("expressions", expressions());
615 
616   GrowableArray<MonitorInfo*>* list = monitors();
617   if (list->is_empty()) return;
618   tty->print_cr("\tmonitor list:");
619   for (int index = (list->length()-1); index >= 0; index--) {
620     MonitorInfo* monitor = list->at(index);
621     tty->print("\t  obj\t");
622     if (monitor->owner_is_scalar_replaced()) {
623       Klass* k = java_lang_Class::as_Klass(monitor->owner_klass());
624       tty->print("( is scalar replaced %s)", k->external_name());
625     } else if (monitor->owner() == NULL) {
626       tty->print("( null )");
627     } else {
628       monitor->owner()->print_value();
629       tty->print("(owner=" INTPTR_FORMAT ")", p2i(monitor->owner()));
630     }
631     if (monitor->eliminated()) {
632       if(is_compiled_frame()) {
633         tty->print(" ( lock is eliminated in compiled frame )");
634       } else {
635         tty->print(" ( lock is eliminated, frame not compiled )");
636       }
637     }
638     tty->cr();
639     tty->print("\t  ");
640     monitor->lock()->print_on(tty);
641     tty->cr();
642   }
643 }
644 
645 
print_value() const646 void javaVFrame::print_value() const {
647   Method*    m = method();
648   InstanceKlass*     k = m->method_holder();
649   tty->print_cr("frame( sp=" INTPTR_FORMAT ", unextended_sp=" INTPTR_FORMAT ", fp=" INTPTR_FORMAT ", pc=" INTPTR_FORMAT ")",
650                 p2i(_fr.sp()),  p2i(_fr.unextended_sp()), p2i(_fr.fp()), p2i(_fr.pc()));
651   tty->print("%s.%s", k->internal_name(), m->name()->as_C_string());
652 
653   if (!m->is_native()) {
654     Symbol*  source_name = k->source_file_name();
655     int        line_number = m->line_number_from_bci(bci());
656     if (source_name != NULL && (line_number != -1)) {
657       tty->print("(%s:%d)", source_name->as_C_string(), line_number);
658     }
659   } else {
660     tty->print("(Native Method)");
661   }
662   // Check frame size and print warning if it looks suspiciously large
663   if (fr().sp() != NULL) {
664     RegisterMap map = *register_map();
665     uint size = fr().frame_size(&map);
666 #ifdef _LP64
667     if (size > 8*K) warning("SUSPICIOUSLY LARGE FRAME (%d)", size);
668 #else
669     if (size > 4*K) warning("SUSPICIOUSLY LARGE FRAME (%d)", size);
670 #endif
671   }
672 }
673 
674 
structural_compare(javaVFrame * other)675 bool javaVFrame::structural_compare(javaVFrame* other) {
676   // Check static part
677   if (method() != other->method()) return false;
678   if (bci()    != other->bci())    return false;
679 
680   // Check locals
681   StackValueCollection *locs = locals();
682   StackValueCollection *other_locs = other->locals();
683   assert(locs->size() == other_locs->size(), "sanity check");
684   int i;
685   for(i = 0; i < locs->size(); i++) {
686     // it might happen the compiler reports a conflict and
687     // the interpreter reports a bogus int.
688     if (       is_compiled_frame() &&       locs->at(i)->type() == T_CONFLICT) continue;
689     if (other->is_compiled_frame() && other_locs->at(i)->type() == T_CONFLICT) continue;
690 
691     if (!locs->at(i)->equal(other_locs->at(i)))
692       return false;
693   }
694 
695   // Check expressions
696   StackValueCollection* exprs = expressions();
697   StackValueCollection* other_exprs = other->expressions();
698   assert(exprs->size() == other_exprs->size(), "sanity check");
699   for(i = 0; i < exprs->size(); i++) {
700     if (!exprs->at(i)->equal(other_exprs->at(i)))
701       return false;
702   }
703 
704   return true;
705 }
706 
707 
print_activation(int index) const708 void javaVFrame::print_activation(int index) const {
709   // frame number and method
710   tty->print("%2d - ", index);
711   ((vframe*)this)->print_value();
712   tty->cr();
713 
714   if (WizardMode) {
715     ((vframe*)this)->print();
716     tty->cr();
717   }
718 }
719 
720 
verify() const721 void javaVFrame::verify() const {
722 }
723 
724 
verify() const725 void interpretedVFrame::verify() const {
726 }
727 
728 
729 // ------------- externalVFrame --------------
730 
print()731 void externalVFrame::print() {
732   _fr.print_value_on(tty,NULL);
733 }
734 
735 
print_value() const736 void externalVFrame::print_value() const {
737   ((vframe*)this)->print();
738 }
739 #endif // PRODUCT
740