src/share/vm/ci/ciMethodData.cpp

changeset 480
48a3fa21394b
parent 435
a61af66fc99e
child 631
d1605aabd0a1
     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) {

mercurial