ciMethodData.cpp revision 5776:de6a9e811145
1/*
2 * Copyright (c) 2001, 2013, 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 "ci/ciMetadata.hpp"
27#include "ci/ciMethodData.hpp"
28#include "ci/ciReplay.hpp"
29#include "ci/ciUtilities.hpp"
30#include "memory/allocation.inline.hpp"
31#include "memory/resourceArea.hpp"
32#include "runtime/deoptimization.hpp"
33#include "utilities/copy.hpp"
34
35// ciMethodData
36
37// ------------------------------------------------------------------
38// ciMethodData::ciMethodData
39//
40ciMethodData::ciMethodData(MethodData* md) : ciMetadata(md) {
41  assert(md != NULL, "no null method data");
42  Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
43  _data = NULL;
44  _data_size = 0;
45  _extra_data_size = 0;
46  _current_mileage = 0;
47  _invocation_counter = 0;
48  _backedge_counter = 0;
49  _state = empty_state;
50  _saw_free_extra_data = false;
51  // Set an initial hint. Don't use set_hint_di() because
52  // first_di() may be out of bounds if data_size is 0.
53  _hint_di = first_di();
54  // Initialize the escape information (to "don't know.");
55  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
56  _parameters = NULL;
57}
58
59// ------------------------------------------------------------------
60// ciMethodData::ciMethodData
61//
62// No MethodData*.
63ciMethodData::ciMethodData() : ciMetadata(NULL) {
64  Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
65  _data = NULL;
66  _data_size = 0;
67  _extra_data_size = 0;
68  _current_mileage = 0;
69  _invocation_counter = 0;
70  _backedge_counter = 0;
71  _state = empty_state;
72  _saw_free_extra_data = false;
73  // Set an initial hint. Don't use set_hint_di() because
74  // first_di() may be out of bounds if data_size is 0.
75  _hint_di = first_di();
76  // Initialize the escape information (to "don't know.");
77  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
78  _parameters = NULL;
79}
80
81void ciMethodData::load_data() {
82  MethodData* mdo = get_MethodData();
83  if (mdo == NULL) {
84    return;
85  }
86
87  // To do: don't copy the data if it is not "ripe" -- require a minimum #
88  // of invocations.
89
90  // Snapshot the data -- actually, take an approximate snapshot of
91  // the data.  Any concurrently executing threads may be changing the
92  // data as we copy it.
93  Copy::disjoint_words((HeapWord*) mdo,
94                       (HeapWord*) &_orig,
95                       sizeof(_orig) / HeapWordSize);
96  Arena* arena = CURRENT_ENV->arena();
97  _data_size = mdo->data_size();
98  _extra_data_size = mdo->extra_data_size();
99  int total_size = _data_size + _extra_data_size;
100  _data = (intptr_t *) arena->Amalloc(total_size);
101  Copy::disjoint_words((HeapWord*) mdo->data_base(), (HeapWord*) _data, total_size / HeapWordSize);
102
103  // Traverse the profile data, translating any oops into their
104  // ci equivalents.
105  ResourceMark rm;
106  ciProfileData* ci_data = first_data();
107  ProfileData* data = mdo->first_data();
108  while (is_valid(ci_data)) {
109    ci_data->translate_from(data);
110    ci_data = next_data(ci_data);
111    data = mdo->next_data(data);
112  }
113  if (mdo->parameters_type_data() != NULL) {
114    _parameters = data_layout_at(mdo->parameters_type_data_di());
115    ciParametersTypeData* parameters = new ciParametersTypeData(_parameters);
116    parameters->translate_from(mdo->parameters_type_data());
117  }
118
119  // Note:  Extra data are all BitData, and do not need translation.
120  _current_mileage = MethodData::mileage_of(mdo->method());
121  _invocation_counter = mdo->invocation_count();
122  _backedge_counter = mdo->backedge_count();
123  _state = mdo->is_mature()? mature_state: immature_state;
124
125  _eflags = mdo->eflags();
126  _arg_local = mdo->arg_local();
127  _arg_stack = mdo->arg_stack();
128  _arg_returned  = mdo->arg_returned();
129#ifndef PRODUCT
130  if (ReplayCompiles) {
131    ciReplay::initialize(this);
132  }
133#endif
134}
135
136void ciReceiverTypeData::translate_receiver_data_from(const ProfileData* data) {
137  for (uint row = 0; row < row_limit(); row++) {
138    Klass* k = data->as_ReceiverTypeData()->receiver(row);
139    if (k != NULL) {
140      ciKlass* klass = CURRENT_ENV->get_klass(k);
141      set_receiver(row, klass);
142    }
143  }
144}
145
146
147void ciTypeStackSlotEntries::translate_type_data_from(const TypeStackSlotEntries* entries) {
148  for (int i = 0; i < _number_of_entries; i++) {
149    intptr_t k = entries->type(i);
150    TypeStackSlotEntries::set_type(i, translate_klass(k));
151  }
152}
153
154void ciReturnTypeEntry::translate_type_data_from(const ReturnTypeEntry* ret) {
155  intptr_t k = ret->type();
156  set_type(translate_klass(k));
157}
158
159// Get the data at an arbitrary (sort of) data index.
160ciProfileData* ciMethodData::data_at(int data_index) {
161  if (out_of_bounds(data_index)) {
162    return NULL;
163  }
164  DataLayout* data_layout = data_layout_at(data_index);
165
166  switch (data_layout->tag()) {
167  case DataLayout::no_tag:
168  default:
169    ShouldNotReachHere();
170    return NULL;
171  case DataLayout::bit_data_tag:
172    return new ciBitData(data_layout);
173  case DataLayout::counter_data_tag:
174    return new ciCounterData(data_layout);
175  case DataLayout::jump_data_tag:
176    return new ciJumpData(data_layout);
177  case DataLayout::receiver_type_data_tag:
178    return new ciReceiverTypeData(data_layout);
179  case DataLayout::virtual_call_data_tag:
180    return new ciVirtualCallData(data_layout);
181  case DataLayout::ret_data_tag:
182    return new ciRetData(data_layout);
183  case DataLayout::branch_data_tag:
184    return new ciBranchData(data_layout);
185  case DataLayout::multi_branch_data_tag:
186    return new ciMultiBranchData(data_layout);
187  case DataLayout::arg_info_data_tag:
188    return new ciArgInfoData(data_layout);
189  case DataLayout::call_type_data_tag:
190    return new ciCallTypeData(data_layout);
191  case DataLayout::virtual_call_type_data_tag:
192    return new ciVirtualCallTypeData(data_layout);
193  case DataLayout::parameters_type_data_tag:
194    return new ciParametersTypeData(data_layout);
195  };
196}
197
198// Iteration over data.
199ciProfileData* ciMethodData::next_data(ciProfileData* current) {
200  int current_index = dp_to_di(current->dp());
201  int next_index = current_index + current->size_in_bytes();
202  ciProfileData* next = data_at(next_index);
203  return next;
204}
205
206// Translate a bci to its corresponding data, or NULL.
207ciProfileData* ciMethodData::bci_to_data(int bci) {
208  ciProfileData* data = data_before(bci);
209  for ( ; is_valid(data); data = next_data(data)) {
210    if (data->bci() == bci) {
211      set_hint_di(dp_to_di(data->dp()));
212      return data;
213    } else if (data->bci() > bci) {
214      break;
215    }
216  }
217  // bci_to_extra_data(bci) ...
218  DataLayout* dp  = data_layout_at(data_size());
219  DataLayout* end = data_layout_at(data_size() + extra_data_size());
220  for (; dp < end; dp = MethodData::next_extra(dp)) {
221    if (dp->tag() == DataLayout::no_tag) {
222      _saw_free_extra_data = true;  // observed an empty slot (common case)
223      return NULL;
224    }
225    if (dp->tag() == DataLayout::arg_info_data_tag) {
226      break; // ArgInfoData is at the end of extra data section.
227    }
228    if (dp->bci() == bci) {
229      assert(dp->tag() == DataLayout::bit_data_tag, "sane");
230      return new ciBitData(dp);
231    }
232  }
233  return NULL;
234}
235
236// Conservatively decode the trap_state of a ciProfileData.
237int ciMethodData::has_trap_at(ciProfileData* data, int reason) {
238  typedef Deoptimization::DeoptReason DR_t;
239  int per_bc_reason
240    = Deoptimization::reason_recorded_per_bytecode_if_any((DR_t) reason);
241  if (trap_count(reason) == 0) {
242    // Impossible for this trap to have occurred, regardless of trap_state.
243    // Note:  This happens if the MDO is empty.
244    return 0;
245  } else if (per_bc_reason == Deoptimization::Reason_none) {
246    // We cannot conclude anything; a trap happened somewhere, maybe here.
247    return -1;
248  } else if (data == NULL) {
249    // No profile here, not even an extra_data record allocated on the fly.
250    // If there are empty extra_data records, and there had been a trap,
251    // there would have been a non-null data pointer.  If there are no
252    // free extra_data records, we must return a conservative -1.
253    if (_saw_free_extra_data)
254      return 0;                 // Q.E.D.
255    else
256      return -1;                // bail with a conservative answer
257  } else {
258    return Deoptimization::trap_state_has_reason(data->trap_state(), per_bc_reason);
259  }
260}
261
262int ciMethodData::trap_recompiled_at(ciProfileData* data) {
263  if (data == NULL) {
264    return (_saw_free_extra_data? 0: -1);  // (see previous method)
265  } else {
266    return Deoptimization::trap_state_is_recompiled(data->trap_state())? 1: 0;
267  }
268}
269
270void ciMethodData::clear_escape_info() {
271  VM_ENTRY_MARK;
272  MethodData* mdo = get_MethodData();
273  if (mdo != NULL) {
274    mdo->clear_escape_info();
275    ArgInfoData *aid = arg_info();
276    int arg_count = (aid == NULL) ? 0 : aid->number_of_args();
277    for (int i = 0; i < arg_count; i++) {
278      set_arg_modified(i, 0);
279    }
280  }
281  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
282}
283
284// copy our escape info to the MethodData* if it exists
285void ciMethodData::update_escape_info() {
286  VM_ENTRY_MARK;
287  MethodData* mdo = get_MethodData();
288  if ( mdo != NULL) {
289    mdo->set_eflags(_eflags);
290    mdo->set_arg_local(_arg_local);
291    mdo->set_arg_stack(_arg_stack);
292    mdo->set_arg_returned(_arg_returned);
293    int arg_count = mdo->method()->size_of_parameters();
294    for (int i = 0; i < arg_count; i++) {
295      mdo->set_arg_modified(i, arg_modified(i));
296    }
297  }
298}
299
300void ciMethodData::set_compilation_stats(short loops, short blocks) {
301  VM_ENTRY_MARK;
302  MethodData* mdo = get_MethodData();
303  if (mdo != NULL) {
304    mdo->set_num_loops(loops);
305    mdo->set_num_blocks(blocks);
306  }
307}
308
309void ciMethodData::set_would_profile(bool p) {
310  VM_ENTRY_MARK;
311  MethodData* mdo = get_MethodData();
312  if (mdo != NULL) {
313    mdo->set_would_profile(p);
314  }
315}
316
317void ciMethodData::set_argument_type(int bci, int i, ciKlass* k) {
318  VM_ENTRY_MARK;
319  MethodData* mdo = get_MethodData();
320  if (mdo != NULL) {
321    ProfileData* data = mdo->bci_to_data(bci);
322    if (data->is_CallTypeData()) {
323      data->as_CallTypeData()->set_argument_type(i, k->get_Klass());
324    } else {
325      assert(data->is_VirtualCallTypeData(), "no arguments!");
326      data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass());
327    }
328  }
329}
330
331void ciMethodData::set_parameter_type(int i, ciKlass* k) {
332  VM_ENTRY_MARK;
333  MethodData* mdo = get_MethodData();
334  if (mdo != NULL) {
335    mdo->parameters_type_data()->set_type(i, k->get_Klass());
336  }
337}
338
339void ciMethodData::set_return_type(int bci, ciKlass* k) {
340  VM_ENTRY_MARK;
341  MethodData* mdo = get_MethodData();
342  if (mdo != NULL) {
343    ProfileData* data = mdo->bci_to_data(bci);
344    if (data->is_CallTypeData()) {
345      data->as_CallTypeData()->set_return_type(k->get_Klass());
346    } else {
347      assert(data->is_VirtualCallTypeData(), "no arguments!");
348      data->as_VirtualCallTypeData()->set_return_type(k->get_Klass());
349    }
350  }
351}
352
353bool ciMethodData::has_escape_info() {
354  return eflag_set(MethodData::estimated);
355}
356
357void ciMethodData::set_eflag(MethodData::EscapeFlag f) {
358  set_bits(_eflags, f);
359}
360
361void ciMethodData::clear_eflag(MethodData::EscapeFlag f) {
362  clear_bits(_eflags, f);
363}
364
365bool ciMethodData::eflag_set(MethodData::EscapeFlag f) const {
366  return mask_bits(_eflags, f) != 0;
367}
368
369void ciMethodData::set_arg_local(int i) {
370  set_nth_bit(_arg_local, i);
371}
372
373void ciMethodData::set_arg_stack(int i) {
374  set_nth_bit(_arg_stack, i);
375}
376
377void ciMethodData::set_arg_returned(int i) {
378  set_nth_bit(_arg_returned, i);
379}
380
381void ciMethodData::set_arg_modified(int arg, uint val) {
382  ArgInfoData *aid = arg_info();
383  if (aid == NULL)
384    return;
385  assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
386  aid->set_arg_modified(arg, val);
387}
388
389bool ciMethodData::is_arg_local(int i) const {
390  return is_set_nth_bit(_arg_local, i);
391}
392
393bool ciMethodData::is_arg_stack(int i) const {
394  return is_set_nth_bit(_arg_stack, i);
395}
396
397bool ciMethodData::is_arg_returned(int i) const {
398  return is_set_nth_bit(_arg_returned, i);
399}
400
401uint ciMethodData::arg_modified(int arg) const {
402  ArgInfoData *aid = arg_info();
403  if (aid == NULL)
404    return 0;
405  assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
406  return aid->arg_modified(arg);
407}
408
409ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) {
410  // Get offset within MethodData* of the data array
411  ByteSize data_offset = MethodData::data_offset();
412
413  // Get cell offset of the ProfileData within data array
414  int cell_offset = dp_to_di(data->dp());
415
416  // Add in counter_offset, the # of bytes into the ProfileData of counter or flag
417  int offset = in_bytes(data_offset) + cell_offset + in_bytes(slot_offset_in_data);
418
419  return in_ByteSize(offset);
420}
421
422ciArgInfoData *ciMethodData::arg_info() const {
423  // Should be last, have to skip all traps.
424  DataLayout* dp  = data_layout_at(data_size());
425  DataLayout* end = data_layout_at(data_size() + extra_data_size());
426  for (; dp < end; dp = MethodData::next_extra(dp)) {
427    if (dp->tag() == DataLayout::arg_info_data_tag)
428      return new ciArgInfoData(dp);
429  }
430  return NULL;
431}
432
433
434// Implementation of the print method.
435void ciMethodData::print_impl(outputStream* st) {
436  ciMetadata::print_impl(st);
437}
438
439void ciMethodData::dump_replay_data(outputStream* out) {
440  ResourceMark rm;
441  MethodData* mdo = get_MethodData();
442  Method* method = mdo->method();
443  Klass* holder = method->method_holder();
444  out->print("ciMethodData %s %s %s %d %d",
445             holder->name()->as_quoted_ascii(),
446             method->name()->as_quoted_ascii(),
447             method->signature()->as_quoted_ascii(),
448             _state,
449             current_mileage());
450
451  // dump the contents of the MDO header as raw data
452  unsigned char* orig = (unsigned char*)&_orig;
453  int length = sizeof(_orig);
454  out->print(" orig %d", length);
455  for (int i = 0; i < length; i++) {
456    out->print(" %d", orig[i]);
457  }
458
459  // dump the MDO data as raw data
460  int elements = data_size() / sizeof(intptr_t);
461  out->print(" data %d", elements);
462  for (int i = 0; i < elements; i++) {
463    // We could use INTPTR_FORMAT here but that's a zero justified
464    // which makes comparing it with the SA version of this output
465    // harder.
466#ifdef _LP64
467    out->print(" 0x%" FORMAT64_MODIFIER "x", data()[i]);
468#else
469    out->print(" 0x%x", data()[i]);
470#endif
471  }
472
473  // The MDO contained oop references as ciObjects, so scan for those
474  // and emit pairs of offset and klass name so that they can be
475  // reconstructed at runtime.  The first round counts the number of
476  // oop references and the second actually emits them.
477  int count = 0;
478  for (int round = 0; round < 2; round++) {
479    if (round == 1) out->print(" oops %d", count);
480    ProfileData* pdata = first_data();
481    for ( ; is_valid(pdata); pdata = next_data(pdata)) {
482      if (pdata->is_ReceiverTypeData()) {
483        ciReceiverTypeData* vdata = (ciReceiverTypeData*)pdata;
484        for (uint i = 0; i < vdata->row_limit(); i++) {
485          ciKlass* k = vdata->receiver(i);
486          if (k != NULL) {
487            if (round == 0) {
488              count++;
489            } else {
490              out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii());
491            }
492          }
493        }
494      } else if (pdata->is_VirtualCallData()) {
495        ciVirtualCallData* vdata = (ciVirtualCallData*)pdata;
496        for (uint i = 0; i < vdata->row_limit(); i++) {
497          ciKlass* k = vdata->receiver(i);
498          if (k != NULL) {
499            if (round == 0) {
500              count++;
501            } else {
502              out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii());
503            }
504          }
505        }
506      }
507    }
508  }
509  out->cr();
510}
511
512#ifndef PRODUCT
513void ciMethodData::print() {
514  print_data_on(tty);
515}
516
517void ciMethodData::print_data_on(outputStream* st) {
518  ResourceMark rm;
519  ciProfileData* data;
520  for (data = first_data(); is_valid(data); data = next_data(data)) {
521    st->print("%d", dp_to_di(data->dp()));
522    st->fill_to(6);
523    data->print_data_on(st);
524  }
525  st->print_cr("--- Extra data:");
526  DataLayout* dp  = data_layout_at(data_size());
527  DataLayout* end = data_layout_at(data_size() + extra_data_size());
528  for (; dp < end; dp = MethodData::next_extra(dp)) {
529    if (dp->tag() == DataLayout::no_tag)  continue;
530    if (dp->tag() == DataLayout::bit_data_tag) {
531      data = new BitData(dp);
532    } else {
533      assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo");
534      data = new ciArgInfoData(dp);
535      dp = end; // ArgInfoData is at the end of extra data section.
536    }
537    st->print("%d", dp_to_di(data->dp()));
538    st->fill_to(6);
539    data->print_data_on(st);
540  }
541}
542
543void ciTypeEntries::print_ciklass(outputStream* st, intptr_t k) {
544  if (TypeEntries::is_type_none(k)) {
545    st->print("none");
546  } else if (TypeEntries::is_type_unknown(k)) {
547    st->print("unknown");
548  } else {
549    valid_ciklass(k)->print_name_on(st);
550  }
551  if (TypeEntries::was_null_seen(k)) {
552    st->print(" (null seen)");
553  }
554}
555
556void ciTypeStackSlotEntries::print_data_on(outputStream* st) const {
557  for (int i = 0; i < _number_of_entries; i++) {
558    _pd->tab(st);
559    st->print("%d: stack (%u) ", i, stack_slot(i));
560    print_ciklass(st, type(i));
561    st->cr();
562  }
563}
564
565void ciReturnTypeEntry::print_data_on(outputStream* st) const {
566  _pd->tab(st);
567  st->print("ret ");
568  print_ciklass(st, type());
569  st->cr();
570}
571
572void ciCallTypeData::print_data_on(outputStream* st) const {
573  print_shared(st, "ciCallTypeData");
574  if (has_arguments()) {
575    tab(st, true);
576    st->print("argument types");
577    args()->print_data_on(st);
578  }
579  if (has_return()) {
580    tab(st, true);
581    st->print("return type");
582    ret()->print_data_on(st);
583  }
584}
585
586void ciReceiverTypeData::print_receiver_data_on(outputStream* st) const {
587  uint row;
588  int entries = 0;
589  for (row = 0; row < row_limit(); row++) {
590    if (receiver(row) != NULL)  entries++;
591  }
592  st->print_cr("count(%u) entries(%u)", count(), entries);
593  for (row = 0; row < row_limit(); row++) {
594    if (receiver(row) != NULL) {
595      tab(st);
596      receiver(row)->print_name_on(st);
597      st->print_cr("(%u)", receiver_count(row));
598    }
599  }
600}
601
602void ciReceiverTypeData::print_data_on(outputStream* st) const {
603  print_shared(st, "ciReceiverTypeData");
604  print_receiver_data_on(st);
605}
606
607void ciVirtualCallData::print_data_on(outputStream* st) const {
608  print_shared(st, "ciVirtualCallData");
609  rtd_super()->print_receiver_data_on(st);
610}
611
612void ciVirtualCallTypeData::print_data_on(outputStream* st) const {
613  print_shared(st, "ciVirtualCallTypeData");
614  rtd_super()->print_receiver_data_on(st);
615  if (has_arguments()) {
616    tab(st, true);
617    st->print("argument types");
618    args()->print_data_on(st);
619  }
620  if (has_return()) {
621    tab(st, true);
622    st->print("return type");
623    ret()->print_data_on(st);
624  }
625}
626
627void ciParametersTypeData::print_data_on(outputStream* st) const {
628  st->print_cr("Parametertypes");
629  parameters()->print_data_on(st);
630}
631#endif
632