1.1 --- a/src/share/vm/ci/ciMethodData.cpp Tue Mar 11 11:25:13 2008 -0700 1.2 +++ b/src/share/vm/ci/ciMethodData.cpp Tue Mar 11 19:00:38 2008 -0700 1.3 @@ -42,6 +42,8 @@ 1.4 // Set an initial hint. Don't use set_hint_di() because 1.5 // first_di() may be out of bounds if data_size is 0. 1.6 _hint_di = first_di(); 1.7 + // Initialize the escape information (to "don't know."); 1.8 + _eflags = _arg_local = _arg_stack = _arg_returned = 0; 1.9 } 1.10 1.11 // ------------------------------------------------------------------ 1.12 @@ -59,6 +61,8 @@ 1.13 // Set an initial hint. Don't use set_hint_di() because 1.14 // first_di() may be out of bounds if data_size is 0. 1.15 _hint_di = first_di(); 1.16 + // Initialize the escape information (to "don't know."); 1.17 + _eflags = _arg_local = _arg_stack = _arg_returned = 0; 1.18 } 1.19 1.20 void ciMethodData::load_data() { 1.21 @@ -142,6 +146,8 @@ 1.22 return new ciBranchData(data_layout); 1.23 case DataLayout::multi_branch_data_tag: 1.24 return new ciMultiBranchData(data_layout); 1.25 + case DataLayout::arg_info_data_tag: 1.26 + return new ciArgInfoData(data_layout); 1.27 }; 1.28 } 1.29 1.30 @@ -172,6 +178,9 @@ 1.31 _saw_free_extra_data = true; // observed an empty slot (common case) 1.32 return NULL; 1.33 } 1.34 + if (dp->tag() == DataLayout::arg_info_data_tag) { 1.35 + break; // ArgInfoData is at the end of extra data section. 1.36 + } 1.37 if (dp->bci() == bci) { 1.38 assert(dp->tag() == DataLayout::bit_data_tag, "sane"); 1.39 return new ciBitData(dp); 1.40 @@ -217,8 +226,14 @@ 1.41 void ciMethodData::clear_escape_info() { 1.42 VM_ENTRY_MARK; 1.43 methodDataOop mdo = get_methodDataOop(); 1.44 - if (mdo != NULL) 1.45 + if (mdo != NULL) { 1.46 mdo->clear_escape_info(); 1.47 + ArgInfoData *aid = arg_info(); 1.48 + int arg_count = (aid == NULL) ? 0 : aid->number_of_args(); 1.49 + for (int i = 0; i < arg_count; i++) { 1.50 + set_arg_modified(i, 0); 1.51 + } 1.52 + } 1.53 _eflags = _arg_local = _arg_stack = _arg_returned = 0; 1.54 } 1.55 1.56 @@ -231,6 +246,10 @@ 1.57 mdo->set_arg_local(_arg_local); 1.58 mdo->set_arg_stack(_arg_stack); 1.59 mdo->set_arg_returned(_arg_returned); 1.60 + int arg_count = mdo->method()->size_of_parameters(); 1.61 + for (int i = 0; i < arg_count; i++) { 1.62 + mdo->set_arg_modified(i, arg_modified(i)); 1.63 + } 1.64 } 1.65 } 1.66 1.67 @@ -262,6 +281,14 @@ 1.68 set_nth_bit(_arg_returned, i); 1.69 } 1.70 1.71 +void ciMethodData::set_arg_modified(int arg, uint val) { 1.72 + ArgInfoData *aid = arg_info(); 1.73 + if (aid == NULL) 1.74 + return; 1.75 + assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number"); 1.76 + aid->set_arg_modified(arg, val); 1.77 +} 1.78 + 1.79 bool ciMethodData::is_arg_local(int i) const { 1.80 return is_set_nth_bit(_arg_local, i); 1.81 } 1.82 @@ -274,6 +301,14 @@ 1.83 return is_set_nth_bit(_arg_returned, i); 1.84 } 1.85 1.86 +uint ciMethodData::arg_modified(int arg) const { 1.87 + ArgInfoData *aid = arg_info(); 1.88 + if (aid == NULL) 1.89 + return 0; 1.90 + assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number"); 1.91 + return aid->arg_modified(arg); 1.92 +} 1.93 + 1.94 ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) { 1.95 // Get offset within methodDataOop of the data array 1.96 ByteSize data_offset = methodDataOopDesc::data_offset(); 1.97 @@ -287,6 +322,18 @@ 1.98 return in_ByteSize(offset); 1.99 } 1.100 1.101 +ciArgInfoData *ciMethodData::arg_info() const { 1.102 + // Should be last, have to skip all traps. 1.103 + DataLayout* dp = data_layout_at(data_size()); 1.104 + DataLayout* end = data_layout_at(data_size() + extra_data_size()); 1.105 + for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) { 1.106 + if (dp->tag() == DataLayout::arg_info_data_tag) 1.107 + return new ciArgInfoData(dp); 1.108 + } 1.109 + return NULL; 1.110 +} 1.111 + 1.112 + 1.113 // Implementation of the print method. 1.114 void ciMethodData::print_impl(outputStream* st) { 1.115 ciObject::print_impl(st); 1.116 @@ -305,6 +352,22 @@ 1.117 st->fill_to(6); 1.118 data->print_data_on(st); 1.119 } 1.120 + st->print_cr("--- Extra data:"); 1.121 + DataLayout* dp = data_layout_at(data_size()); 1.122 + DataLayout* end = data_layout_at(data_size() + extra_data_size()); 1.123 + for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) { 1.124 + if (dp->tag() == DataLayout::no_tag) continue; 1.125 + if (dp->tag() == DataLayout::bit_data_tag) { 1.126 + data = new BitData(dp); 1.127 + } else { 1.128 + assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo"); 1.129 + data = new ciArgInfoData(dp); 1.130 + dp = end; // ArgInfoData is at the end of extra data section. 1.131 + } 1.132 + st->print("%d", dp_to_di(data->dp())); 1.133 + st->fill_to(6); 1.134 + data->print_data_on(st); 1.135 + } 1.136 } 1.137 1.138 void ciReceiverTypeData::print_receiver_data_on(outputStream* st) {