hotspot/src/share/vm/ci/ciMethodData.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13728 882756847a04
child 15471 41f75023e6a6
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
     2
 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 670
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 670
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 670
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    25
#include "precompiled.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    26
#include "ci/ciMetadata.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
#include "ci/ciMethodData.hpp"
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    28
#include "ci/ciReplay.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "ci/ciUtilities.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    32
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "utilities/copy.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// ciMethodData
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// ciMethodData::ciMethodData
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    40
ciMethodData::ciMethodData(MethodData* md) : ciMetadata(md) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    41
  assert(md != NULL, "no null method data");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  _data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  _data_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  _extra_data_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  _current_mileage = 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
    47
  _invocation_counter = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
    48
  _backedge_counter = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  _state = empty_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  _saw_free_extra_data = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  // Set an initial hint. Don't use set_hint_di() because
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // first_di() may be out of bounds if data_size is 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  _hint_di = first_di();
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
    54
  // Initialize the escape information (to "don't know.");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
    55
  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// ciMethodData::ciMethodData
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    61
// No MethodData*.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    62
ciMethodData::ciMethodData() : ciMetadata(NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  _data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  _data_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  _extra_data_size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  _current_mileage = 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
    68
  _invocation_counter = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
    69
  _backedge_counter = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  _state = empty_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  _saw_free_extra_data = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  // Set an initial hint. Don't use set_hint_di() because
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // first_di() may be out of bounds if data_size is 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  _hint_di = first_di();
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
    75
  // Initialize the escape information (to "don't know.");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
    76
  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
void ciMethodData::load_data() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    80
  MethodData* mdo = get_MethodData();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  if (mdo == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // To do: don't copy the data if it is not "ripe" -- require a minimum #
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // of invocations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // Snapshot the data -- actually, take an approximate snapshot of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // the data.  Any concurrently executing threads may be changing the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // data as we copy it.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    89
  Copy::disjoint_words((HeapWord*) mdo,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    90
                       (HeapWord*) &_orig,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    91
                       sizeof(_orig) / HeapWordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  _data_size = mdo->data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  _extra_data_size = mdo->extra_data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  int total_size = _data_size + _extra_data_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  _data = (intptr_t *) arena->Amalloc(total_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  Copy::disjoint_words((HeapWord*) mdo->data_base(), (HeapWord*) _data, total_size / HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // Traverse the profile data, translating any oops into their
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // ci equivalents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  ciProfileData* ci_data = first_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  ProfileData* data = mdo->first_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  while (is_valid(ci_data)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    ci_data->translate_from(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    ci_data = next_data(ci_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    data = mdo->next_data(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Note:  Extra data are all BitData, and do not need translation.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   110
  _current_mileage = MethodData::mileage_of(mdo->method());
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   111
  _invocation_counter = mdo->invocation_count();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   112
  _backedge_counter = mdo->backedge_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  _state = mdo->is_mature()? mature_state: immature_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  _eflags = mdo->eflags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  _arg_local = mdo->arg_local();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  _arg_stack = mdo->arg_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  _arg_returned  = mdo->arg_returned();
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   119
#ifndef PRODUCT
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   120
  if (ReplayCompiles) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   121
    ciReplay::initialize(this);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   122
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   123
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  for (uint row = 0; row < row_limit(); row++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   128
    Klass* k = data->as_ReceiverTypeData()->receiver(row);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    if (k != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   130
      ciKlass* klass = CURRENT_ENV->get_klass(k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
      set_receiver(row, klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
// Get the data at an arbitrary (sort of) data index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
ciProfileData* ciMethodData::data_at(int data_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  if (out_of_bounds(data_index)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  DataLayout* data_layout = data_layout_at(data_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  switch (data_layout->tag()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  case DataLayout::no_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  case DataLayout::bit_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    return new ciBitData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  case DataLayout::counter_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    return new ciCounterData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  case DataLayout::jump_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    return new ciJumpData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  case DataLayout::receiver_type_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    return new ciReceiverTypeData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  case DataLayout::virtual_call_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    return new ciVirtualCallData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  case DataLayout::ret_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    return new ciRetData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  case DataLayout::branch_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    return new ciBranchData(data_layout);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  case DataLayout::multi_branch_data_tag:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    return new ciMultiBranchData(data_layout);
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   165
  case DataLayout::arg_info_data_tag:
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   166
    return new ciArgInfoData(data_layout);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
// Iteration over data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
ciProfileData* ciMethodData::next_data(ciProfileData* current) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  int current_index = dp_to_di(current->dp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  int next_index = current_index + current->size_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  ciProfileData* next = data_at(next_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  return next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
// Translate a bci to its corresponding data, or NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
ciProfileData* ciMethodData::bci_to_data(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  ciProfileData* data = data_before(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  for ( ; is_valid(data); data = next_data(data)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    if (data->bci() == bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
      set_hint_di(dp_to_di(data->dp()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
      return data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    } else if (data->bci() > bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // bci_to_extra_data(bci) ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  DataLayout* dp  = data_layout_at(data_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  DataLayout* end = data_layout_at(data_size() + extra_data_size());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   192
  for (; dp < end; dp = MethodData::next_extra(dp)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    if (dp->tag() == DataLayout::no_tag) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
      _saw_free_extra_data = true;  // observed an empty slot (common case)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    }
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   197
    if (dp->tag() == DataLayout::arg_info_data_tag) {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   198
      break; // ArgInfoData is at the end of extra data section.
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   199
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    if (dp->bci() == bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
      assert(dp->tag() == DataLayout::bit_data_tag, "sane");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
      return new ciBitData(dp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// Conservatively decode the trap_state of a ciProfileData.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
int ciMethodData::has_trap_at(ciProfileData* data, int reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  typedef Deoptimization::DeoptReason DR_t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  int per_bc_reason
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    = Deoptimization::reason_recorded_per_bytecode_if_any((DR_t) reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  if (trap_count(reason) == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    // Impossible for this trap to have occurred, regardless of trap_state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    // Note:  This happens if the MDO is empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  } else if (per_bc_reason == Deoptimization::Reason_none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    // We cannot conclude anything; a trap happened somewhere, maybe here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  } else if (data == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    // No profile here, not even an extra_data record allocated on the fly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    // If there are empty extra_data records, and there had been a trap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    // there would have been a non-null data pointer.  If there are no
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    // free extra_data records, we must return a conservative -1.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    if (_saw_free_extra_data)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
      return 0;                 // Q.E.D.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
      return -1;                // bail with a conservative answer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    return Deoptimization::trap_state_has_reason(data->trap_state(), per_bc_reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
int ciMethodData::trap_recompiled_at(ciProfileData* data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  if (data == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    return (_saw_free_extra_data? 0: -1);  // (see previous method)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    return Deoptimization::trap_state_is_recompiled(data->trap_state())? 1: 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
void ciMethodData::clear_escape_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   244
  MethodData* mdo = get_MethodData();
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   245
  if (mdo != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    mdo->clear_escape_info();
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   247
    ArgInfoData *aid = arg_info();
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   248
    int arg_count = (aid == NULL) ? 0 : aid->number_of_args();
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   249
    for (int i = 0; i < arg_count; i++) {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   250
      set_arg_modified(i, 0);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   251
    }
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   252
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  _eflags = _arg_local = _arg_stack = _arg_returned = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   256
// copy our escape info to the MethodData* if it exists
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
void ciMethodData::update_escape_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   259
  MethodData* mdo = get_MethodData();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  if ( mdo != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    mdo->set_eflags(_eflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    mdo->set_arg_local(_arg_local);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    mdo->set_arg_stack(_arg_stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    mdo->set_arg_returned(_arg_returned);
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   265
    int arg_count = mdo->method()->size_of_parameters();
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   266
    for (int i = 0; i < arg_count; i++) {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   267
      mdo->set_arg_modified(i, arg_modified(i));
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   268
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   272
void ciMethodData::set_compilation_stats(short loops, short blocks) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   273
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   274
  MethodData* mdo = get_MethodData();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   275
  if (mdo != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   276
    mdo->set_num_loops(loops);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   277
    mdo->set_num_blocks(blocks);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   278
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   279
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   280
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   281
void ciMethodData::set_would_profile(bool p) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   282
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   283
  MethodData* mdo = get_MethodData();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   284
  if (mdo != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   285
    mdo->set_would_profile(p);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   286
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   287
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   288
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
bool ciMethodData::has_escape_info() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   290
  return eflag_set(MethodData::estimated);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   293
void ciMethodData::set_eflag(MethodData::EscapeFlag f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  set_bits(_eflags, f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   297
void ciMethodData::clear_eflag(MethodData::EscapeFlag f) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  clear_bits(_eflags, f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   301
bool ciMethodData::eflag_set(MethodData::EscapeFlag f) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  return mask_bits(_eflags, f) != 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
void ciMethodData::set_arg_local(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  set_nth_bit(_arg_local, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
void ciMethodData::set_arg_stack(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  set_nth_bit(_arg_stack, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
void ciMethodData::set_arg_returned(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  set_nth_bit(_arg_returned, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   317
void ciMethodData::set_arg_modified(int arg, uint val) {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   318
  ArgInfoData *aid = arg_info();
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   319
  if (aid == NULL)
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   320
    return;
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   321
  assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   322
  aid->set_arg_modified(arg, val);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   323
}
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   324
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
bool ciMethodData::is_arg_local(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  return is_set_nth_bit(_arg_local, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
bool ciMethodData::is_arg_stack(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  return is_set_nth_bit(_arg_stack, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
bool ciMethodData::is_arg_returned(int i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  return is_set_nth_bit(_arg_returned, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   337
uint ciMethodData::arg_modified(int arg) const {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   338
  ArgInfoData *aid = arg_info();
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   339
  if (aid == NULL)
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   340
    return 0;
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   341
  assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   342
  return aid->arg_modified(arg);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   343
}
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   344
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   346
  // Get offset within MethodData* of the data array
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   347
  ByteSize data_offset = MethodData::data_offset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Get cell offset of the ProfileData within data array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  int cell_offset = dp_to_di(data->dp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // Add in counter_offset, the # of bytes into the ProfileData of counter or flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  int offset = in_bytes(data_offset) + cell_offset + in_bytes(slot_offset_in_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  return in_ByteSize(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   358
ciArgInfoData *ciMethodData::arg_info() const {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   359
  // Should be last, have to skip all traps.
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   360
  DataLayout* dp  = data_layout_at(data_size());
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   361
  DataLayout* end = data_layout_at(data_size() + extra_data_size());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   362
  for (; dp < end; dp = MethodData::next_extra(dp)) {
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   363
    if (dp->tag() == DataLayout::arg_info_data_tag)
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   364
      return new ciArgInfoData(dp);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   365
  }
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   366
  return NULL;
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   367
}
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   368
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   369
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
// Implementation of the print method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
void ciMethodData::print_impl(outputStream* st) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   372
  ciMetadata::print_impl(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   375
void ciMethodData::dump_replay_data(outputStream* out) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   376
  ASSERT_IN_VM;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   377
  MethodData* mdo = get_MethodData();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   378
  Method* method = mdo->method();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   379
  Klass* holder = method->method_holder();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   380
  out->print("ciMethodData %s %s %s %d %d",
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   381
             holder->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   382
             method->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   383
             method->signature()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   384
             _state,
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   385
             current_mileage());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   386
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   387
  // dump the contents of the MDO header as raw data
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   388
  unsigned char* orig = (unsigned char*)&_orig;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   389
  int length = sizeof(_orig);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   390
  out->print(" orig %d", length);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   391
  for (int i = 0; i < length; i++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   392
    out->print(" %d", orig[i]);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   393
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   394
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   395
  // dump the MDO data as raw data
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   396
  int elements = data_size() / sizeof(intptr_t);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   397
  out->print(" data %d", elements);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   398
  for (int i = 0; i < elements; i++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   399
    // We could use INTPTR_FORMAT here but that's a zero justified
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   400
    // which makes comparing it with the SA version of this output
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   401
    // harder.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   402
#ifdef _LP64
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   403
    out->print(" 0x%" FORMAT64_MODIFIER "x", data()[i]);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   404
#else
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   405
    out->print(" 0x%x", data()[i]);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   406
#endif
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   407
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   408
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   409
  // The MDO contained oop references as ciObjects, so scan for those
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   410
  // and emit pairs of offset and klass name so that they can be
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   411
  // reconstructed at runtime.  The first round counts the number of
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   412
  // oop references and the second actually emits them.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   413
  int count = 0;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   414
  for (int round = 0; round < 2; round++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   415
    if (round == 1) out->print(" oops %d", count);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   416
    ProfileData* pdata = first_data();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   417
    for ( ; is_valid(pdata); pdata = next_data(pdata)) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   418
      if (pdata->is_ReceiverTypeData()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   419
        ciReceiverTypeData* vdata = (ciReceiverTypeData*)pdata;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   420
        for (uint i = 0; i < vdata->row_limit(); i++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   421
          ciKlass* k = vdata->receiver(i);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   422
          if (k != NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   423
            if (round == 0) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   424
              count++;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   425
            } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   426
              out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   427
            }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   428
          }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   429
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   430
      } else if (pdata->is_VirtualCallData()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   431
        ciVirtualCallData* vdata = (ciVirtualCallData*)pdata;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   432
        for (uint i = 0; i < vdata->row_limit(); i++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   433
          ciKlass* k = vdata->receiver(i);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   434
          if (k != NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   435
            if (round == 0) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   436
              count++;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   437
            } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   438
              out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   439
            }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   440
          }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   441
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   442
      }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   443
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   444
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   445
  out->cr();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   446
}
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   447
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
void ciMethodData::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  print_data_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
void ciMethodData::print_data_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  ciProfileData* data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  for (data = first_data(); is_valid(data); data = next_data(data)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    st->print("%d", dp_to_di(data->dp()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    st->fill_to(6);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    data->print_data_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  }
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   461
  st->print_cr("--- Extra data:");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   462
  DataLayout* dp  = data_layout_at(data_size());
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   463
  DataLayout* end = data_layout_at(data_size() + extra_data_size());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
   464
  for (; dp < end; dp = MethodData::next_extra(dp)) {
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   465
    if (dp->tag() == DataLayout::no_tag)  continue;
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   466
    if (dp->tag() == DataLayout::bit_data_tag) {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   467
      data = new BitData(dp);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   468
    } else {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   469
      assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo");
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   470
      data = new ciArgInfoData(dp);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   471
      dp = end; // ArgInfoData is at the end of extra data section.
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   472
    }
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   473
    st->print("%d", dp_to_di(data->dp()));
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   474
    st->fill_to(6);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   475
    data->print_data_on(st);
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   476
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
void ciReceiverTypeData::print_receiver_data_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  uint row;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  int entries = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  for (row = 0; row < row_limit(); row++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    if (receiver(row) != NULL)  entries++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  st->print_cr("count(%u) entries(%u)", count(), entries);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  for (row = 0; row < row_limit(); row++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    if (receiver(row) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
      tab(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
      receiver(row)->print_name_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
      st->print_cr("(%u)", receiver_count(row));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
void ciReceiverTypeData::print_data_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  print_shared(st, "ciReceiverTypeData");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  print_receiver_data_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
void ciVirtualCallData::print_data_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  print_shared(st, "ciVirtualCallData");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  rtd_super()->print_receiver_data_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
#endif