hotspot/src/share/vm/ci/ciInstanceKlass.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
/*
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
     2
 * Copyright (c) 1999, 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: 4571
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4571
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: 4571
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: 7125
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    26
#include "ci/ciField.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    27
#include "ci/ciInstance.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    28
#include "ci/ciInstanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    29
#include "ci/ciUtilities.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    30
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    31
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    32
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    33
#include "oops/oop.inline.hpp"
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
    34
#include "oops/fieldStreams.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7125
diff changeset
    35
#include "runtime/fieldDescriptor.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// ciInstanceKlass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
    39
// This class represents a Klass* in the HotSpot virtual machine
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
    40
// whose Klass part in an InstanceKlass.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// ciInstanceKlass::ciInstanceKlass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// Loaded instance klass.
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
    46
ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
    47
  ciKlass(h_k), _non_static_fields(NULL)
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
    48
{
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  assert(get_Klass()->oop_is_instance(), "wrong type");
8314
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
    50
  assert(get_instanceKlass()->is_loaded(), "must be at least loaded");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
    51
  InstanceKlass* ik = get_instanceKlass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  AccessFlags access_flags = ik->access_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  _flags = ciFlags(access_flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  _has_finalizer = access_flags.has_finalizer();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  _has_subklass = ik->subklass() != NULL;
11407
5399831730cd 7117052: instanceKlass::_init_state can be u1 type
coleenp
parents: 10546
diff changeset
    57
  _init_state = ik->init_state();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  _nonstatic_field_size = ik->nonstatic_field_size();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
    59
  _has_nonstatic_fields = ik->has_nonstatic_fields();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  _nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
    62
  _implementor = NULL; // we will fill these lazily
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  if (ciObjectFactory::is_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    _loader = JNIHandles::make_local(thread, ik->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    _protection_domain = JNIHandles::make_local(thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
                                                ik->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    _is_shared = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    Handle h_loader(thread, ik->class_loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    Handle h_protection_domain(thread, ik->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    _loader = JNIHandles::make_global(h_loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    _protection_domain = JNIHandles::make_global(h_protection_domain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    _is_shared = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // Lazy fields get filled in only upon request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  _super  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  _java_mirror = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  if (is_shared()) {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    83
    if (h_k() != SystemDictionary::Object_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
      super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    //compute_nonstatic_fields();  // done outside of constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  _field_cache = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
// Version for unloaded classes:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
ciInstanceKlass::ciInstanceKlass(ciSymbol* name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
                                 jobject loader, jobject protection_domain)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
    95
  : ciKlass(name, T_OBJECT)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  assert(name->byte_at(0) != '[', "not an instance klass");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
    98
  _init_state = (InstanceKlass::ClassState)0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  _nonstatic_field_size = -1;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   100
  _has_nonstatic_fields = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  _nonstatic_fields = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  _loader = loader;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  _protection_domain = protection_domain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  _is_shared = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  _super = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _java_mirror = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  _field_cache = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
// ciInstanceKlass::compute_shared_is_initialized
5925
a30fef61d0b7 6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents: 5884
diff changeset
   114
void ciInstanceKlass::compute_shared_init_state() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  GUARDED_VM_ENTRY(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   116
    InstanceKlass* ik = get_instanceKlass();
11407
5399831730cd 7117052: instanceKlass::_init_state can be u1 type
coleenp
parents: 10546
diff changeset
   117
    _init_state = ik->init_state();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
// ciInstanceKlass::compute_shared_has_subklass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
bool ciInstanceKlass::compute_shared_has_subklass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  GUARDED_VM_ENTRY(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   125
    InstanceKlass* ik = get_instanceKlass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    _has_subklass = ik->subklass() != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    return _has_subklass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
// ciInstanceKlass::loader
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
oop ciInstanceKlass::loader() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  return JNIHandles::resolve(_loader);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
// ciInstanceKlass::loader_handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
jobject ciInstanceKlass::loader_handle() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  return _loader;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
// ciInstanceKlass::protection_domain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
oop ciInstanceKlass::protection_domain() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  return JNIHandles::resolve(_protection_domain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
// ciInstanceKlass::protection_domain_handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
jobject ciInstanceKlass::protection_domain_handle() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  return _protection_domain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
// ciInstanceKlass::field_cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
// Get the field cache associated with this klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
ciConstantPoolCache* ciInstanceKlass::field_cache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  if (is_shared()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  if (_field_cache == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    assert(!is_java_lang_Object(), "Object has no fields");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    _field_cache = new (arena) ciConstantPoolCache(arena, 5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  return _field_cache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
// ciInstanceKlass::get_canonical_holder
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
ciInstanceKlass* ciInstanceKlass::get_canonical_holder(int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  if (!(offset >= 0 && offset < layout_helper())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    tty->print("*** get_canonical_holder(%d) on ", offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    this->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    tty->print_cr(" ***");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  assert(offset >= 0 && offset < layout_helper(), "offset must be tame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   186
  if (offset < instanceOopDesc::base_offset_in_bytes()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    // All header offsets belong properly to java/lang/Object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    return CURRENT_ENV->Object_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  ciInstanceKlass* self = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  for (;;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    assert(self->is_loaded(), "must be loaded to have size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    ciInstanceKlass* super = self->super();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   195
    if (super == NULL || super->nof_nonstatic_fields() == 0 ||
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   196
        !super->contains_field_offset(offset)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
      return self;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      self = super;  // return super->get_canonical_holder(offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
// ciInstanceKlass::is_java_lang_Object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
// Is this klass java.lang.Object?
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   208
bool ciInstanceKlass::is_java_lang_Object() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  return equals(CURRENT_ENV->Object_klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
// ciInstanceKlass::uses_default_loader
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
bool ciInstanceKlass::uses_default_loader() {
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   215
  // Note:  We do not need to resolve the handle or enter the VM
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   216
  // in order to test null-ness.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   217
  return _loader == NULL;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   218
}
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   219
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   220
// ------------------------------------------------------------------
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   221
// ciInstanceKlass::is_in_package
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   222
//
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   223
// Is this klass in the given package?
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   224
bool ciInstanceKlass::is_in_package(const char* packagename, int len) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   225
  // To avoid class loader mischief, this test always rejects application classes.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   226
  if (!uses_default_loader())
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   227
    return false;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   228
  GUARDED_VM_ENTRY(
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   229
    return is_in_package_impl(packagename, len);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   230
  )
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   231
}
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   232
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   233
bool ciInstanceKlass::is_in_package_impl(const char* packagename, int len) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   234
  ASSERT_IN_VM;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   235
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   236
  // If packagename contains trailing '/' exclude it from the
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   237
  // prefix-test since we test for it explicitly.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   238
  if (packagename[len - 1] == '/')
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   239
    len--;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   240
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   241
  if (!name()->starts_with(packagename, len))
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   242
    return false;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   243
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   244
  // Test if the class name is something like "java/lang".
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   245
  if ((len + 1) > name()->utf8_length())
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   246
    return false;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   247
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   248
  // Test for trailing '/'
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   249
  if ((char) name()->byte_at(len) != '/')
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   250
    return false;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   251
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   252
  // Make sure it's not actually in a subpackage:
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   253
  if (name()->index_of_at(len+1, "/", 1) >= 0)
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   254
    return false;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   255
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4450
diff changeset
   256
  return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
// ciInstanceKlass::print_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
// Implementation of the print method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
void ciInstanceKlass::print_impl(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  ciKlass::print_impl(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  GUARDED_VM_ENTRY(st->print(" loader=0x%x", (address)loader());)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  if (is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    st->print(" loaded=true initialized=%s finalized=%s subklass=%s size=%d flags=",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
              bool_to_str(is_initialized()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
              bool_to_str(has_finalizer()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
              bool_to_str(has_subklass()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
              layout_helper());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    _flags.print_klass_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    if (_super) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
      st->print(" super=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
      _super->print_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    if (_java_mirror) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
      st->print(" mirror=PRESENT");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    st->print(" loaded=false");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
// ciInstanceKlass::super
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
// Get the superklass of this klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
ciInstanceKlass* ciInstanceKlass::super() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  assert(is_loaded(), "must be loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  if (_super == NULL && !is_java_lang_Object()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    GUARDED_VM_ENTRY(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   295
      Klass* super_klass = get_instanceKlass()->super();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   296
      _super = CURRENT_ENV->get_instance_klass(super_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  return _super;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
// ciInstanceKlass::java_mirror
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
// Get the instance of java.lang.Class corresponding to this klass.
5884
3963019e3782 6960865: ldc of unloaded class throws an assert in ciTypeFlow
jrose
parents: 5882
diff changeset
   306
// Cache it on this->_java_mirror.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
ciInstance* ciInstanceKlass::java_mirror() {
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8314
diff changeset
   308
  if (is_shared()) {
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8314
diff changeset
   309
    return ciKlass::java_mirror();
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8314
diff changeset
   310
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  if (_java_mirror == NULL) {
5884
3963019e3782 6960865: ldc of unloaded class throws an assert in ciTypeFlow
jrose
parents: 5882
diff changeset
   312
    _java_mirror = ciKlass::java_mirror();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  return _java_mirror;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
// ciInstanceKlass::unique_concrete_subklass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
ciInstanceKlass* ciInstanceKlass::unique_concrete_subklass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  if (!is_loaded())     return NULL; // No change if class is not loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  if (!is_abstract())   return NULL; // Only applies to abstract classes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  if (!has_subklass())  return NULL; // Must have at least one subklass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   324
  InstanceKlass* ik = get_instanceKlass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  Klass* up = ik->up_cast_abstract();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   326
  assert(up->oop_is_instance(), "must be InstanceKlass");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  if (ik == up) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   330
  return CURRENT_THREAD_ENV->get_instance_klass(up);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
// ciInstanceKlass::has_finalizable_subclass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
bool ciInstanceKlass::has_finalizable_subclass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  if (!is_loaded())     return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  return Dependencies::find_finalizable_subclass(get_instanceKlass()) != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
// ciInstanceKlass::get_field_by_offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
ciField* ciInstanceKlass::get_field_by_offset(int field_offset, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    for (int i = 0, len = nof_nonstatic_fields(); i < len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      ciField* field = _nonstatic_fields->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
      int  field_off = field->offset_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
      if (field_off == field_offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
        return field;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      if (field_off > field_offset)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
      // could do binary search or check bins, but probably not worth it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   357
  InstanceKlass* k = get_instanceKlass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  fieldDescriptor fd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  if (!k->find_field_from_offset(field_offset, is_static, &fd)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  return field;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   366
// ------------------------------------------------------------------
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   367
// ciInstanceKlass::get_field_by_name
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   368
ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   369
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   370
  InstanceKlass* k = get_instanceKlass();
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   371
  fieldDescriptor fd;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   372
  Klass* def = k->find_field(name->get_symbol(), signature->get_symbol(), is_static, &fd);
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   373
  if (def == NULL) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   374
    return NULL;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   375
  }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   376
  ciField* field = new (CURRENT_THREAD_ENV->arena()) ciField(&fd);
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   377
  return field;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   378
}
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   379
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 670
diff changeset
   380
// ------------------------------------------------------------------
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   381
// ciInstanceKlass::non_static_fields.
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   382
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   383
class NonStaticFieldFiller: public FieldClosure {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   384
  GrowableArray<ciField*>* _arr;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   385
  ciEnv* _curEnv;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   386
public:
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   387
  NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) :
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   388
    _curEnv(curEnv), _arr(arr)
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   389
  {}
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   390
  void do_field(fieldDescriptor* fd) {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   391
    ciField* field = new (_curEnv->arena()) ciField(fd);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   392
    _arr->append(field);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   393
  }
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   394
};
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   395
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   396
GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   397
  if (_non_static_fields == NULL) {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   398
    VM_ENTRY_MARK;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   399
    ciEnv* curEnv = ciEnv::current();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   400
    InstanceKlass* ik = get_instanceKlass();
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   401
    int max_n_fields = ik->java_fields_count();
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   402
6180
53c1bf468c81 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 5925
diff changeset
   403
    Arena* arena = curEnv->arena();
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   404
    _non_static_fields =
6180
53c1bf468c81 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 5925
diff changeset
   405
      new (arena) GrowableArray<ciField*>(arena, max_n_fields, 0, NULL);
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   406
    NonStaticFieldFiller filler(curEnv, _non_static_fields);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   407
    ik->do_nonstatic_fields(&filler);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   408
  }
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   409
  return _non_static_fields;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   410
}
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
   411
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
static int sort_field_by_offset(ciField** a, ciField** b) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  return (*a)->offset_in_bytes() - (*b)->offset_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // (no worries about 32-bit overflow...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// ciInstanceKlass::compute_nonstatic_fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
int ciInstanceKlass::compute_nonstatic_fields() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  assert(is_loaded(), "must be loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  if (_nonstatic_fields != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    return _nonstatic_fields->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   425
  if (!has_nonstatic_fields()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    _nonstatic_fields = new (arena) GrowableArray<ciField*>(arena, 0, 0, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  assert(!is_java_lang_Object(), "bootstrap OK");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   432
  // Size in bytes of my fields, including inherited fields.
591
04d2e26e6d69 6703888: Compressed Oops: use the 32-bits gap after klass in a object
kvn
parents: 360
diff changeset
   433
  int fsize = nonstatic_field_size() * heapOopSize;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   434
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  ciInstanceKlass* super = this->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  GrowableArray<ciField*>* super_fields = NULL;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   437
  if (super != NULL && super->has_nonstatic_fields()) {
591
04d2e26e6d69 6703888: Compressed Oops: use the 32-bits gap after klass in a object
kvn
parents: 360
diff changeset
   438
    int super_fsize  = super->nonstatic_field_size() * heapOopSize;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   439
    int super_flen   = super->nof_nonstatic_fields();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    super_fields = super->_nonstatic_fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    assert(super_flen == 0 || super_fields != NULL, "first get nof_fields");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   442
    // See if I am no larger than my super; if so, I can use his fields.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   443
    if (fsize == super_fsize) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   444
      _nonstatic_fields = super_fields;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   445
      return super_fields->length();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 217
diff changeset
   446
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  GrowableArray<ciField*>* fields = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  GUARDED_VM_ENTRY({
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
      fields = compute_nonstatic_fields_impl(super_fields);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    });
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  if (fields == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
    // This can happen if this class (java.lang.Class) has invisible fields.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    _nonstatic_fields = super_fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    return super_fields->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  int flen = fields->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  // Now sort them by offset, ascending.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  // (In principle, they could mix with superclass fields.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  fields->sort(sort_field_by_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  _nonstatic_fields = fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  return flen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
GrowableArray<ciField*>*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
ciInstanceKlass::compute_nonstatic_fields_impl(GrowableArray<ciField*>*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
                                               super_fields) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  int flen = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  GrowableArray<ciField*>* fields = NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   476
  InstanceKlass* k = get_instanceKlass();
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   477
  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   478
    if (fs.access_flags().is_static())  continue;
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   479
    flen += 1;
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   480
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   482
  // allocate the array:
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   483
  if (flen == 0) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   484
    return NULL;  // return nothing if none are locally declared
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   485
  }
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   486
  if (super_fields != NULL) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   487
    flen += super_fields->length();
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   488
  }
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   489
  fields = new (arena) GrowableArray<ciField*>(arena, flen, 0, NULL);
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   490
  if (super_fields != NULL) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   491
    fields->appendAll(super_fields);
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   492
  }
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   493
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   494
  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   495
    if (fs.access_flags().is_static())  continue;
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   496
    fieldDescriptor fd;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   497
    fd.initialize(k, fs.index());
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   498
    ciField* field = new (arena) ciField(&fd);
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 8725
diff changeset
   499
    fields->append(field);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  assert(fields->length() == flen, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  return fields;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
// ciInstanceKlass::find_method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
// Find a method in this klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
ciMethod* ciInstanceKlass::find_method(ciSymbol* name, ciSymbol* signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   511
  InstanceKlass* k = get_instanceKlass();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   512
  Symbol* name_sym = name->get_symbol();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   513
  Symbol* sig_sym= signature->get_symbol();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   515
  Method* m = k->find_method(name_sym, sig_sym);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  if (m == NULL)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   518
  return CURRENT_THREAD_ENV->get_method(m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
// ciInstanceKlass::is_leaf_type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
bool ciInstanceKlass::is_leaf_type() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  assert(is_loaded(), "must be loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  if (is_shared()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
    return is_final();  // approximately correct
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  } else {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   528
    return !_has_subklass && (nof_implementors() == 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
// ciInstanceKlass::implementor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
// Report an implementor of this interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
// Note that there are various races here, since my copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
// of _nof_implementors might be out of date with respect
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   538
// to results returned by InstanceKlass::implementor.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
// This is OK, since any dependencies we decide to assert
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
// will be checked later under the Compile_lock.
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   541
ciInstanceKlass* ciInstanceKlass::implementor() {
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   542
  ciInstanceKlass* impl = _implementor;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  if (impl == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
    // Go into the VM to fetch the implementor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
      VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   547
      Klass* k = get_instanceKlass()->implementor();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
      if (k != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   549
        if (k == get_instanceKlass()) {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   550
          // More than one implementors. Use 'this' in this case.
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   551
          impl = this;
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   552
        } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12369
diff changeset
   553
          impl = CURRENT_THREAD_ENV->get_instance_klass(k);
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   554
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    // Memoize this result.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    if (!is_shared()) {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 11407
diff changeset
   559
      _implementor = impl;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  return impl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
}
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   564
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   565
// Utility class for printing of the contents of the static fields for
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   566
// use by compilation replay.  It only prints out the information that
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   567
// could be consumed by the compiler, so for primitive types it prints
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   568
// out the actual value.  For Strings it's the actual string value.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   569
// For array types it it's first level array size since that's the
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   570
// only value which statically unchangeable.  For all other reference
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   571
// types it simply prints out the dynamic type.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   572
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   573
class StaticFinalFieldPrinter : public FieldClosure {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   574
  outputStream* _out;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   575
  const char*   _holder;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   576
 public:
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   577
  StaticFinalFieldPrinter(outputStream* out, const char* holder) :
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   578
    _out(out),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   579
    _holder(holder) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   580
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   581
  void do_field(fieldDescriptor* fd) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   582
    if (fd->is_final() && !fd->has_initial_value()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   583
      oop mirror = fd->field_holder()->java_mirror();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   584
      _out->print("staticfield %s %s %s ", _holder, fd->name()->as_quoted_ascii(), fd->signature()->as_quoted_ascii());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   585
      switch (fd->field_type()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   586
        case T_BYTE:    _out->print_cr("%d", mirror->byte_field(fd->offset()));   break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   587
        case T_BOOLEAN: _out->print_cr("%d", mirror->bool_field(fd->offset()));   break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   588
        case T_SHORT:   _out->print_cr("%d", mirror->short_field(fd->offset()));  break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   589
        case T_CHAR:    _out->print_cr("%d", mirror->char_field(fd->offset()));   break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   590
        case T_INT:     _out->print_cr("%d", mirror->int_field(fd->offset()));    break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   591
        case T_LONG:    _out->print_cr(INT64_FORMAT, mirror->long_field(fd->offset()));   break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   592
        case T_FLOAT: {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   593
          float f = mirror->float_field(fd->offset());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   594
          _out->print_cr("%d", *(int*)&f);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   595
          break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   596
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   597
        case T_DOUBLE: {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   598
          double d = mirror->double_field(fd->offset());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   599
          _out->print_cr(INT64_FORMAT, *(jlong*)&d);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   600
          break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   601
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   602
        case T_ARRAY: {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   603
          oop value =  mirror->obj_field_acquire(fd->offset());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   604
          if (value == NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   605
            _out->print_cr("null");
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   606
          } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   607
            typeArrayOop ta = (typeArrayOop)value;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   608
            _out->print("%d", ta->length());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   609
            if (value->is_objArray()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   610
              objArrayOop oa = (objArrayOop)value;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   611
              const char* klass_name  = value->klass()->name()->as_quoted_ascii();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   612
              _out->print(" %s", klass_name);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   613
            }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   614
            _out->cr();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   615
          }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   616
          break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   617
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   618
        case T_OBJECT: {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   619
          oop value =  mirror->obj_field_acquire(fd->offset());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   620
          if (value == NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   621
            _out->print_cr("null");
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   622
          } else if (value->is_instance()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   623
            if (value->is_a(SystemDictionary::String_klass())) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   624
              _out->print("\"");
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   625
              _out->print_raw(java_lang_String::as_quoted_ascii(value));
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   626
              _out->print_cr("\"");
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   627
            } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   628
              const char* klass_name  = value->klass()->name()->as_quoted_ascii();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   629
              _out->print_cr(klass_name);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   630
            }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   631
          } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   632
            ShouldNotReachHere();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   633
          }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   634
          break;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   635
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   636
        default:
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   637
          ShouldNotReachHere();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   638
        }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   639
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   640
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   641
};
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   642
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   643
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   644
void ciInstanceKlass::dump_replay_data(outputStream* out) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   645
  ASSERT_IN_VM;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   646
  InstanceKlass* ik = get_instanceKlass();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   647
  ConstantPool*  cp = ik->constants();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   648
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   649
  // Try to record related loaded classes
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   650
  Klass* sub = ik->subklass();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   651
  while (sub != NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   652
    if (sub->oop_is_instance()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   653
      out->print_cr("instanceKlass %s", sub->name()->as_quoted_ascii());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   654
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   655
    sub = sub->next_sibling();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   656
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   657
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   658
  // Dump out the state of the constant pool tags.  During replay the
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   659
  // tags will be validated for things which shouldn't change and
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   660
  // classes will be resolved if the tags indicate that they were
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   661
  // resolved at compile time.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   662
  out->print("ciInstanceKlass %s %d %d %d", ik->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   663
             is_linked(), is_initialized(), cp->length());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   664
  for (int index = 1; index < cp->length(); index++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   665
    out->print(" %d", cp->tags()->at(index));
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   666
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   667
  out->cr();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   668
  if (is_initialized()) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   669
    //  Dump out the static final fields in case the compilation relies
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   670
    //  on their value for correct replay.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   671
    StaticFinalFieldPrinter sffp(out, ik->name()->as_quoted_ascii());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   672
    ik->do_local_static_fields(&sffp);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   673
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   674
}