hotspot/src/share/vm/ci/ciMethodData.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14477 95e66ea71f71
child 20695 4f5a5e95090b
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@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: 9638
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
#ifndef SHARE_VM_CI_CIMETHODDATA_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    26
#define SHARE_VM_CI_CIMETHODDATA_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "ci/ciClassList.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "ci/ciKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "ci/ciObject.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "ci/ciUtilities.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
    32
#include "oops/methodData.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class ciBitData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class ciCounterData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class ciJumpData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class ciReceiverTypeData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class ciRetData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class ciBranchData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class ciArrayData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
class ciMultiBranchData;
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
    43
class ciArgInfoData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
typedef ProfileData ciProfileData;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class ciBitData : public BitData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  ciBitData(DataLayout* layout) : BitData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
class ciCounterData : public CounterData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  ciCounterData(DataLayout* layout) : CounterData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
class ciJumpData : public JumpData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  ciJumpData(DataLayout* layout) : JumpData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
class ciReceiverTypeData : public ReceiverTypeData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  ciReceiverTypeData(DataLayout* layout) : ReceiverTypeData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  void set_receiver(uint row, ciKlass* recv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    assert((uint)row < row_limit(), "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    set_intptr_at(receiver0_offset + row * receiver_type_row_cell_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
                  (intptr_t) recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  ciKlass* receiver(uint row) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    assert((uint)row < row_limit(), "oob");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
    74
    ciKlass* recv = (ciKlass*)intptr_at(receiver0_offset + row * receiver_type_row_cell_count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    assert(recv == NULL || recv->is_klass(), "wrong type");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
    76
    return recv;
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
  // Copy & translate from oop based ReceiverTypeData
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  virtual void translate_from(ProfileData* data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    translate_receiver_data_from(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  void translate_receiver_data_from(ProfileData* data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  void print_data_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  void print_receiver_data_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
class ciVirtualCallData : public VirtualCallData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // Fake multiple inheritance...  It's a ciReceiverTypeData also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  ciReceiverTypeData* rtd_super() { return (ciReceiverTypeData*) this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  ciVirtualCallData(DataLayout* layout) : VirtualCallData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  void set_receiver(uint row, ciKlass* recv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    rtd_super()->set_receiver(row, recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  ciKlass* receiver(uint row) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    return rtd_super()->receiver(row);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Copy & translate from oop based VirtualCallData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  virtual void translate_from(ProfileData* data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    rtd_super()->translate_receiver_data_from(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  void print_data_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
class ciRetData : public RetData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  ciRetData(DataLayout* layout) : RetData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
class ciBranchData : public BranchData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  ciBranchData(DataLayout* layout) : BranchData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
class ciArrayData : public ArrayData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  ciArrayData(DataLayout* layout) : ArrayData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
class ciMultiBranchData : public MultiBranchData {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  ciMultiBranchData(DataLayout* layout) : MultiBranchData(layout) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   135
class ciArgInfoData : public ArgInfoData {
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   136
public:
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   137
  ciArgInfoData(DataLayout* layout) : ArgInfoData(layout) {};
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   138
};
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   139
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
// ciMethodData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   142
// This class represents a MethodData* in the HotSpot virtual
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
// machine.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   145
class ciMethodData : public ciMetadata {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  CI_PACKAGE_ACCESS
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   147
  friend class ciReplay;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // Size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  int _data_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  int _extra_data_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // Data entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  intptr_t* _data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // Cached hint for data_before()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  int _hint_di;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Is data attached?  And is it mature?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  enum { empty_state, immature_state, mature_state };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  u_char _state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // Set this true if empty extra_data slots are ever witnessed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  u_char _saw_free_extra_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // Support for interprocedural escape analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  intx              _eflags;          // flags on escape information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  intx              _arg_local;       // bit set of non-escaping arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  intx              _arg_stack;       // bit set of stack-allocatable arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  intx              _arg_returned;    // bit set of returned arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Maturity of the oop when the snapshot is taken.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  int _current_mileage;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   176
  // These counters hold the age of MDO in tiered. In tiered we can have the same method
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   177
  // running at different compilation levels concurrently. So, in order to precisely measure
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   178
  // its maturity we need separate counters.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   179
  int _invocation_counter;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   180
  int _backedge_counter;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   181
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // Coherent snapshot of original header.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   183
  MethodData _orig;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   185
  ciMethodData(MethodData* md);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  ciMethodData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // Accessors
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   189
  int data_size() const { return _data_size; }
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   190
  int extra_data_size() const { return _extra_data_size; }
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   191
  intptr_t * data() const { return _data; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   193
  MethodData* get_MethodData() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   194
    return (MethodData*)_metadata;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  const char* type_string()                      { return "ciMethodData"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  void print_impl(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   201
  DataLayout* data_layout_at(int data_index) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    assert(data_index % sizeof(intptr_t) == 0, "unaligned");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    return (DataLayout*) (((address)_data) + data_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  bool out_of_bounds(int data_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    return data_index >= data_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // hint accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  int      hint_di() const  { return _hint_di; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  void set_hint_di(int di)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
    assert(!out_of_bounds(di), "hint_di out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    _hint_di = di;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  ciProfileData* data_before(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    // avoid SEGV on this edge case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    if (data_size() == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    int hint = hint_di();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    if (data_layout_at(hint)->bci() <= bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
      return data_at(hint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    return first_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  // What is the index of the first data entry?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  int first_di() { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   230
  ciArgInfoData *arg_info() const;
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   231
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   233
  bool is_method_data() const { return true; }
9638
a9e79f5cd83b 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 7397
diff changeset
   234
a9e79f5cd83b 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 7397
diff changeset
   235
  void set_mature() { _state = mature_state; }
a9e79f5cd83b 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 7397
diff changeset
   236
a9e79f5cd83b 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 7397
diff changeset
   237
  bool is_empty()  { return _state == empty_state; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  bool is_mature() { return _state == mature_state; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  int creation_mileage() { return _orig.creation_mileage(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  int current_mileage()  { return _current_mileage; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   243
  int invocation_count() { return _invocation_counter; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   244
  int backedge_count()   { return _backedge_counter;   }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   245
  // Transfer information about the method to MethodData*.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   246
  // would_profile means we would like to profile this method,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   247
  // meaning it's not trivial.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   248
  void set_would_profile(bool p);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   249
  // Also set the numer of loops and blocks in the method.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   250
  // Again, this is used to determine if a method is trivial.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   251
  void set_compilation_stats(short loops, short blocks);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   252
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  void load_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // Convert a dp (data pointer) to a di (data index).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  int dp_to_di(address dp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    return dp - ((address)_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // Get the data at an arbitrary (sort of) data index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  ciProfileData* data_at(int data_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // Walk through the data in order.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  ciProfileData* first_data() { return data_at(first_di()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  ciProfileData* next_data(ciProfileData* current);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  bool is_valid(ciProfileData* current) { return current != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // Get the data at an arbitrary bci, or NULL if there is none.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  ciProfileData* bci_to_data(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  ciProfileData* bci_to_extra_data(int bci, bool create_if_missing);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  uint overflow_trap_count() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    return _orig.overflow_trap_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  uint overflow_recompile_count() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    return _orig.overflow_recompile_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  uint decompile_count() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    return _orig.decompile_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  uint trap_count(int reason) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    return _orig.trap_count(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  uint trap_reason_limit() const { return _orig.trap_reason_limit(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  uint trap_count_limit()  const { return _orig.trap_count_limit(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // Helpful query functions that decode trap_state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  int has_trap_at(ciProfileData* data, int reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  int has_trap_at(int bci, int reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    return has_trap_at(bci_to_data(bci), reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  int trap_recompiled_at(ciProfileData* data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  int trap_recompiled_at(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    return trap_recompiled_at(bci_to_data(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  void clear_escape_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  bool has_escape_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  void update_escape_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   301
  void set_eflag(MethodData::EscapeFlag f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   302
  void clear_eflag(MethodData::EscapeFlag f);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 9638
diff changeset
   303
  bool eflag_set(MethodData::EscapeFlag f) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  void set_arg_local(int i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  void set_arg_stack(int i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  void set_arg_returned(int i);
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   308
  void set_arg_modified(int arg, uint val);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  bool is_arg_local(int i) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  bool is_arg_stack(int i) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  bool is_arg_returned(int i) const;
218
a0e996680b05 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 1
diff changeset
   313
  uint arg_modified(int arg) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // Code generation helper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  ByteSize offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  int      byte_offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) { return in_bytes(offset_of_slot(data, slot_offset_in_data)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // printing support for method data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  void print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  void print_data_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
#endif
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   324
  void dump_replay_data(outputStream* out);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   326
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   327
#endif // SHARE_VM_CI_CIMETHODDATA_HPP