hotspot/src/share/vm/ci/ciEnv.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14391 df0a1573d5bd
child 14490 5bb45ed999ee
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
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: 5420
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
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: 5420
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    26
#include "ci/ciConstant.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
#include "ci/ciEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "ci/ciField.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "ci/ciInstance.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "ci/ciInstanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "ci/ciMethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    32
#include "ci/ciNullObject.hpp"
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
    33
#include "ci/ciReplay.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
#include "ci/ciUtilities.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    35
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    36
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    37
#include "code/scopeDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    38
#include "compiler/compileBroker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    39
#include "compiler/compileLog.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    40
#include "compiler/compilerOracle.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    41
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    42
#include "interpreter/linkResolver.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    43
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    44
#include "memory/oopFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    45
#include "memory/universe.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
    46
#include "oops/methodData.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    47
#include "oops/objArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    48
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    49
#include "oops/oop.inline2.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    50
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    51
#include "runtime/init.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    52
#include "runtime/reflection.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    53
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    54
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    55
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    56
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    57
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    58
#ifdef COMPILER2
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    59
#include "opto/runtime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    60
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
// ciEnv
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// This class is the top level broker for requests from the compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// to the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
ciObject*              ciEnv::_null_object_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    69
#define WK_KLASS_DEFN(name, ignore_s, ignore_o) ciInstanceKlass* ciEnv::_##name = NULL;
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    70
WK_KLASSES_DO(WK_KLASS_DEFN)
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    71
#undef WK_KLASS_DEFN
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
ciSymbol*        ciEnv::_unloaded_cisymbol = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
ciInstanceKlass* ciEnv::_unloaded_ciinstance_klass = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
ciObjArrayKlass* ciEnv::_unloaded_ciobjarrayklass = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
jobject ciEnv::_ArrayIndexOutOfBoundsException_handle = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
jobject ciEnv::_ArrayStoreException_handle = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
jobject ciEnv::_ClassCastException_handle = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
static bool firstEnv = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
#endif /* PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
// ciEnv::ciEnv
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
ciEnv::ciEnv(CompileTask* task, int system_dictionary_modification_counter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // Set up ciEnv::current immediately, for the sake of ciObjectFactory, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  thread->set_env(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  assert(ciEnv::current() == this, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  _oop_recorder = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  _debug_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  _dependencies = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  _failure_reason = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  _compilable = MethodCompilable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  _break_at_compile = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  _compiler_data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  assert(!firstEnv, "not initialized properly");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
#endif /* !PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  _system_dictionary_modification_counter = system_dictionary_modification_counter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _num_inlined_bytecodes = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  assert(task == NULL || thread->task() == task, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  _task = task;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  _log = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // Temporary buffer for creating symbols and such.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  _name_buffer = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  _name_buffer_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  _arena   = &_ciEnv_arena;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  _factory = new (_arena) ciObjectFactory(_arena, 128);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // Preload commonly referenced system ciObjects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // During VM initialization, these instances have not yet been created.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Assertions ensure that these instances are not accessed before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // their initialization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  assert(Universe::is_fully_initialized(), "should be complete");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  oop o = Universe::null_ptr_exception_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  assert(o != NULL, "should have been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  _NullPointerException_instance = get_object(o)->as_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  o = Universe::arithmetic_exception_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  assert(o != NULL, "should have been initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  _ArithmeticException_instance = get_object(o)->as_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  _ArrayIndexOutOfBoundsException_instance = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  _ArrayStoreException_instance = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _ClassCastException_instance = NULL;
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   136
  _the_null_string = NULL;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   137
  _the_min_jint_string = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
ciEnv::ciEnv(Arena* arena) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // Set up ciEnv::current immediately, for the sake of ciObjectFactory, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  CompilerThread* current_thread = CompilerThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  assert(current_thread->env() == NULL, "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  current_thread->set_env(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  assert(ciEnv::current() == this, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  _oop_recorder = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  _debug_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  _dependencies = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  _failure_reason = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  _compilable = MethodCompilable_never;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  _break_at_compile = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  _compiler_data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  assert(firstEnv, "must be first");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  firstEnv = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
#endif /* !PRODUCT */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  _system_dictionary_modification_counter = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  _num_inlined_bytecodes = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  _task = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  _log = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // Temporary buffer for creating symbols and such.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  _name_buffer = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  _name_buffer_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  _arena   = arena;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  _factory = new (_arena) ciObjectFactory(_arena, 128);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Preload commonly referenced system ciObjects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // During VM initialization, these instances have not yet been created.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // Assertions ensure that these instances are not accessed before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // their initialization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  assert(Universe::is_fully_initialized(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   181
  _NullPointerException_instance = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   182
  _ArithmeticException_instance = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  _ArrayIndexOutOfBoundsException_instance = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  _ArrayStoreException_instance = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  _ClassCastException_instance = NULL;
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   186
  _the_null_string = NULL;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   187
  _the_min_jint_string = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
ciEnv::~ciEnv() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  CompilerThread* current_thread = CompilerThread::current();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   192
  _factory->remove_symbols();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   193
  // Need safepoint to clear the env on the thread.  RedefineClasses might
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   194
  // be reading it.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   195
  GUARDED_VM_ENTRY(current_thread->set_env(NULL);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
// ------------------------------------------------------------------
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   199
// Cache Jvmti state
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   200
void ciEnv::cache_jvmti_state() {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   201
  VM_ENTRY_MARK;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   202
  // Get Jvmti capabilities under lock to get consistant values.
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   203
  MutexLocker mu(JvmtiThreadState_lock);
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   204
  _jvmti_can_hotswap_or_post_breakpoint = JvmtiExport::can_hotswap_or_post_breakpoint();
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   205
  _jvmti_can_access_local_variables     = JvmtiExport::can_access_local_variables();
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   206
  _jvmti_can_post_on_exceptions         = JvmtiExport::can_post_on_exceptions();
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   207
}
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   208
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   209
// ------------------------------------------------------------------
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   210
// Cache DTrace flags
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   211
void ciEnv::cache_dtrace_flags() {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   212
  // Need lock?
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   213
  _dtrace_extended_probes = ExtendedDTraceProbes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   214
  if (_dtrace_extended_probes) {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   215
    _dtrace_monitor_probes  = true;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   216
    _dtrace_method_probes   = true;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   217
    _dtrace_alloc_probes    = true;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   218
  } else {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   219
    _dtrace_monitor_probes  = DTraceMonitorProbes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   220
    _dtrace_method_probes   = DTraceMethodProbes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   221
    _dtrace_alloc_probes    = DTraceAllocProbes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   222
  }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   223
}
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   224
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   225
// ------------------------------------------------------------------
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
// helper for lazy exception creation
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   227
ciInstance* ciEnv::get_or_create_exception(jobject& handle, Symbol* name) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  if (handle == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    // Cf. universe.cpp, creation of Universe::_null_ptr_exception_instance.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   231
    Klass* k = SystemDictionary::find(name, Handle(), Handle(), THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    jobject objh = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    if (!HAS_PENDING_EXCEPTION && k != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   234
      oop obj = InstanceKlass::cast(k)->allocate_instance(THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      if (!HAS_PENDING_EXCEPTION)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
        objh = JNIHandles::make_global(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      handle = objh;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  oop obj = JNIHandles::resolve(handle);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  return obj == NULL? NULL: get_object(obj)->as_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
ciInstance* ciEnv::ArrayIndexOutOfBoundsException_instance() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  if (_ArrayIndexOutOfBoundsException_instance == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    _ArrayIndexOutOfBoundsException_instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
          = get_or_create_exception(_ArrayIndexOutOfBoundsException_handle,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   252
          vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  return _ArrayIndexOutOfBoundsException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
ciInstance* ciEnv::ArrayStoreException_instance() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  if (_ArrayStoreException_instance == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    _ArrayStoreException_instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
          = get_or_create_exception(_ArrayStoreException_handle,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   260
          vmSymbols::java_lang_ArrayStoreException());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  return _ArrayStoreException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
ciInstance* ciEnv::ClassCastException_instance() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  if (_ClassCastException_instance == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    _ClassCastException_instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
          = get_or_create_exception(_ClassCastException_handle,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   268
          vmSymbols::java_lang_ClassCastException());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  return _ClassCastException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   273
ciInstance* ciEnv::the_null_string() {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   274
  if (_the_null_string == NULL) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   275
    VM_ENTRY_MARK;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   276
    _the_null_string = get_object(Universe::the_null_string())->as_instance();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   277
  }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   278
  return _the_null_string;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   279
}
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   280
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   281
ciInstance* ciEnv::the_min_jint_string() {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   282
  if (_the_min_jint_string == NULL) {
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   283
    VM_ENTRY_MARK;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   284
    _the_min_jint_string = get_object(Universe::the_min_jint_string())->as_instance();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   285
  }
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   286
  return _the_min_jint_string;
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   287
}
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 4429
diff changeset
   288
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
// ciEnv::get_method_from_handle
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   291
ciMethod* ciEnv::get_method_from_handle(Method* method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   293
  return get_metadata(method)->as_method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
// ciEnv::array_element_offset_in_bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
int ciEnv::array_element_offset_in_bytes(ciArray* a_h, ciObject* o_h) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  objArrayOop a = (objArrayOop)a_h->get_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  assert(a->is_objArray(), "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  int length = a->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  oop o = o_h->get_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  for (int i = 0; i < length; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    if (a->obj_at(i) == o)  return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// ciEnv::check_klass_accessiblity
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// Note: the logic of this method should mirror the logic of
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   315
// ConstantPool::verify_constant_pool_resolve.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
bool ciEnv::check_klass_accessibility(ciKlass* accessing_klass,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   317
                                      Klass* resolved_klass) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  if (accessing_klass == NULL || !accessing_klass->is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   321
  if (accessing_klass->is_obj_array_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    accessing_klass = accessing_klass->as_obj_array_klass()->base_element_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  if (!accessing_klass->is_instance_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   328
  if (resolved_klass->oop_is_objArray()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    // Find the element klass, if this is an array.
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13883
diff changeset
   330
    resolved_klass = ObjArrayKlass::cast(resolved_klass)->bottom_klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   332
  if (resolved_klass->oop_is_instance()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   333
    return Reflection::verify_class_access(accessing_klass->get_Klass(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
                                           resolved_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
                                           true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// ciEnv::get_klass_by_name_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
ciKlass* ciEnv::get_klass_by_name_impl(ciKlass* accessing_klass,
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   343
                                       constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
                                       ciSymbol* name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
                                       bool require_local) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  EXCEPTION_CONTEXT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Now we need to check the SystemDictionary
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   350
  Symbol* sym = name->get_symbol();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  if (sym->byte_at(0) == 'L' &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    sym->byte_at(sym->utf8_length()-1) == ';') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    // This is a name from a signature.  Strip off the trimmings.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   354
    // Call recursive to keep scope of strippedsym.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   355
    TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   356
                    sym->utf8_length()-2,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   357
                    KILL_COMPILE_ON_FATAL_(_unloaded_ciinstance_klass));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   358
    ciSymbol* strippedname = get_symbol(strippedsym);
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   359
    return get_klass_by_name_impl(accessing_klass, cpool, strippedname, require_local);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  // Check for prior unloaded klass.  The SystemDictionary's answers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // can vary over time but the compiler needs consistency.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  ciKlass* unloaded_klass = check_get_unloaded_klass(accessing_klass, name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  if (unloaded_klass != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    if (require_local)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    return unloaded_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  Handle loader(THREAD, (oop)NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  Handle domain(THREAD, (oop)NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  if (accessing_klass != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    loader = Handle(THREAD, accessing_klass->loader());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    domain = Handle(THREAD, accessing_klass->protection_domain());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // setup up the proper type to return on OOM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  ciKlass* fail_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  if (sym->byte_at(0) == '[') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    fail_type = _unloaded_ciobjarrayklass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    fail_type = _unloaded_ciinstance_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  }
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7397
diff changeset
   384
  KlassHandle found_klass;
8314
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   385
  {
8333
11a7f6fc6419 7021531: lock ordering problems after fix for 6354181
never
parents: 8314
diff changeset
   386
    ttyUnlocker ttyul;  // release tty lock to avoid ordering problems
8314
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   387
    MutexLocker ml(Compile_lock);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   388
    Klass* kls;
8314
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   389
    if (!require_local) {
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   390
      kls = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader,
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   391
                                                                       KILL_COMPILE_ON_FATAL_(fail_type));
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   392
    } else {
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   393
      kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain,
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   394
                                                           KILL_COMPILE_ON_FATAL_(fail_type));
057b1c20fd7e 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 8076
diff changeset
   395
    }
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7397
diff changeset
   396
    found_klass = KlassHandle(THREAD, kls);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  // If we fail to find an array klass, look again for its element type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  // The element type may be available either locally or via constraints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // In either case, if we can find the element type in the system dictionary,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  // we must build an array type around it.  The CI requires array klasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  // to be loaded if their element klasses are loaded, except when memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  // is exhausted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  if (sym->byte_at(0) == '[' &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
      (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    // We have an unloaded array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    // Build it on the fly if the element class exists.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   409
    TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   410
                                                 sym->utf8_length()-1,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   411
                                                 KILL_COMPILE_ON_FATAL_(fail_type));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   412
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    // Get element ciKlass recursively.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
    ciKlass* elem_klass =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
      get_klass_by_name_impl(accessing_klass,
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   416
                             cpool,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   417
                             get_symbol(elem_sym),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
                             require_local);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    if (elem_klass != NULL && elem_klass->is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
      // Now make an array for it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
      return ciObjArrayKlass::make_impl(elem_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   425
  if (found_klass() == NULL && !cpool.is_null() && cpool->has_preresolution()) {
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   426
    // Look inside the constant pool for pre-resolved class entries.
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   427
    for (int i = cpool->length() - 1; i >= 1; i--) {
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   428
      if (cpool->tag_at(i).is_klass()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   429
        Klass* kls = cpool->resolved_klass_at(i);
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   430
        if (Klass::cast(kls)->name() == sym) {
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   431
          found_klass = KlassHandle(THREAD, kls);
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   432
          break;
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   433
        }
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   434
      }
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   435
    }
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   436
  }
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   437
7918
ce1e4ae77aea 7012505: BreakpointWithFullGC.sh fails with Internal Error (src/share/vm/oops/methodOop.cpp:220)
kamg
parents: 7397
diff changeset
   438
  if (found_klass() != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    // Found it.  Build a CI handle.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   440
    return get_klass(found_klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  if (require_local)  return NULL;
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10564
diff changeset
   444
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // Not yet loaded into the VM, or not governed by loader constraints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // Make a CI representative for it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  return get_unloaded_klass(accessing_klass, name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
// ciEnv::get_klass_by_name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
ciKlass* ciEnv::get_klass_by_name(ciKlass* accessing_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
                                  ciSymbol* klass_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
                                  bool require_local) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  GUARDED_VM_ENTRY(return get_klass_by_name_impl(accessing_klass,
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   456
                                                 constantPoolHandle(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
                                                 klass_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
                                                 require_local);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
// ciEnv::get_klass_by_index_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
// Implementation of get_klass_by_index.
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   465
ciKlass* ciEnv::get_klass_by_index_impl(constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
                                        int index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   467
                                        bool& is_accessible,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   468
                                        ciInstanceKlass* accessor) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  EXCEPTION_CONTEXT;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   470
  KlassHandle klass; // = NULL;
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   471
  Symbol* klass_name = NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   472
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   473
  if (cpool->tag_at(index).is_symbol()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   474
    klass_name = cpool->symbol_at(index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   475
  } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   476
    // Check if it's resolved if it's not a symbol constant pool entry.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   477
    klass = KlassHandle(THREAD, ConstantPool::klass_at_if_loaded(cpool, index));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   478
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  if (klass.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    // The klass has not been inserted into the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    // Try to look it up by name.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
      // We have to lock the cpool to keep the oop from being resolved
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
      // while we are accessing it.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   485
        MonitorLockerEx ml(cpool->lock());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
      constantTag tag = cpool->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
      if (tag.is_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
        // The klass has been inserted into the constant pool
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
        // very recently.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
        klass = KlassHandle(THREAD, cpool->resolved_klass_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
        assert(cpool->tag_at(index).is_unresolved_klass(), "wrong tag");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   493
        klass_name = cpool->unresolved_klass_at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   497
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  if (klass.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    // Not found in constant pool.  Use the name to do the lookup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    ciKlass* k = get_klass_by_name_impl(accessor,
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   502
                                        cpool,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   503
                                        get_symbol(klass_name),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
                                        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    // Calculate accessibility the hard way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    if (!k->is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
      is_accessible = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    } else if (k->loader() != accessor->loader() &&
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   509
               get_klass_by_name_impl(accessor, cpool, k->name(), true) == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
      // Loaded only remotely.  Not linked yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
      is_accessible = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      // Linked locally, and we must also check public/private, etc.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   514
      is_accessible = check_klass_accessibility(accessor, k->get_Klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
    return k;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // Check for prior unloaded klass.  The SystemDictionary's answers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // can vary over time but the compiler needs consistency.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   521
  ciSymbol* name = get_symbol(klass()->name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  ciKlass* unloaded_klass = check_get_unloaded_klass(accessor, name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  if (unloaded_klass != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
    is_accessible = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    return unloaded_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // It is known to be accessible, since it was found in the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  is_accessible = true;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   530
  return get_klass(klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
// ciEnv::get_klass_by_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
// Get a klass from the constant pool.
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   537
ciKlass* ciEnv::get_klass_by_index(constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
                                   int index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   539
                                   bool& is_accessible,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   540
                                   ciInstanceKlass* accessor) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   541
  GUARDED_VM_ENTRY(return get_klass_by_index_impl(cpool, index, is_accessible, accessor);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
// ciEnv::get_constant_by_index_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
// Implementation of get_constant_by_index().
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   548
ciConstant ciEnv::get_constant_by_index_impl(constantPoolHandle cpool,
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   549
                                             int pool_index, int cache_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   550
                                             ciInstanceKlass* accessor) {
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   551
  bool ignore_will_link;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  EXCEPTION_CONTEXT;
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   553
  int index = pool_index;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   554
  if (cache_index >= 0) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   555
    assert(index < 0, "only one kind of index at a time");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   556
    oop obj = cpool->resolved_references()->obj_at(cache_index);
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   557
    if (obj != NULL) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   558
      ciObject* ciobj = get_object(obj);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   559
      return ciConstant(T_OBJECT, ciobj);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   560
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   561
    index = cpool->object_to_cp_index(cache_index);
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   562
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  constantTag tag = cpool->tag_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  if (tag.is_int()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    return ciConstant(T_INT, (jint)cpool->int_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  } else if (tag.is_long()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    return ciConstant((jlong)cpool->long_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  } else if (tag.is_float()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    return ciConstant((jfloat)cpool->float_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  } else if (tag.is_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    return ciConstant((jdouble)cpool->double_at(index));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   572
  } else if (tag.is_string()) {
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   573
    oop string = NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   574
    assert(cache_index >= 0, "should have a cache index");
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   575
    if (cpool->is_pseudo_string_at(index)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   576
      string = cpool->pseudo_string_at(index, cache_index);
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   577
    } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   578
      string = cpool->string_at(index, cache_index, THREAD);
1550
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   579
      if (HAS_PENDING_EXCEPTION) {
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   580
        CLEAR_PENDING_EXCEPTION;
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   581
        record_out_of_memory_failure();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   582
        return ciConstant();
be2fc37a817f 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 1
diff changeset
   583
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    ciObject* constant = get_object(string);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    assert (constant->is_instance(), "must be an instance, or not? ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    return ciConstant(T_OBJECT, constant);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  } else if (tag.is_klass() || tag.is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    // 4881222: allow ldc to take a class type
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   590
    ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore_will_link, accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
      record_out_of_memory_failure();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
      return ciConstant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    assert (klass->is_instance_klass() || klass->is_array_klass(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
            "must be an instance or array klass ");
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   598
    return ciConstant(T_OBJECT, klass->java_mirror());
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   599
  } else if (tag.is_object()) {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   600
    oop obj = cpool->object_at(index);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   601
    ciObject* ciobj = get_object(obj);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   602
    return ciConstant(T_OBJECT, ciobj);
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   603
  } else if (tag.is_method_type()) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   604
    // must execute Java code to link this CP entry into cache[i].f1
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   605
    ciSymbol* signature = get_symbol(cpool->method_type_signature_at(index));
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   606
    ciObject* ciobj = get_unloaded_method_type_constant(signature);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   607
    return ciConstant(T_OBJECT, ciobj);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   608
  } else if (tag.is_method_handle()) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   609
    // must execute Java code to link this CP entry into cache[i].f1
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   610
    int ref_kind        = cpool->method_handle_ref_kind_at(index);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   611
    int callee_index    = cpool->method_handle_klass_index_at(index);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   612
    ciKlass* callee     = get_klass_by_index_impl(cpool, callee_index, ignore_will_link, accessor);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   613
    ciSymbol* name      = get_symbol(cpool->method_handle_name_ref_at(index));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   614
    ciSymbol* signature = get_symbol(cpool->method_handle_signature_ref_at(index));
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   615
    ciObject* ciobj     = get_unloaded_method_handle_constant(callee, name, signature, ref_kind);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   616
    return ciConstant(T_OBJECT, ciobj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
    return ciConstant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
// ciEnv::get_constant_by_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
// Pull a constant out of the constant pool.  How appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
// Implementation note: this query is currently in no way cached.
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   629
ciConstant ciEnv::get_constant_by_index(constantPoolHandle cpool,
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   630
                                        int pool_index, int cache_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   631
                                        ciInstanceKlass* accessor) {
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   632
  GUARDED_VM_ENTRY(return get_constant_by_index_impl(cpool, pool_index, cache_index, accessor);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
// ciEnv::get_field_by_index_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
// Implementation of get_field_by_index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
// Implementation note: the results of field lookups are cached
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
// in the accessor klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
ciField* ciEnv::get_field_by_index_impl(ciInstanceKlass* accessor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
                                        int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  ciConstantPoolCache* cache = accessor->field_cache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  if (cache == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    ciField* field = new (arena()) ciField(accessor, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    return field;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    ciField* field = (ciField*)cache->get(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
    if (field == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
      field = new (arena()) ciField(accessor, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
      cache->insert(index, field);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    return field;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
// ciEnv::get_field_by_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
// Get a field by index from a klass's constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
ciField* ciEnv::get_field_by_index(ciInstanceKlass* accessor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
                                   int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  GUARDED_VM_ENTRY(return get_field_by_index_impl(accessor, index);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
// ciEnv::lookup_method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
// Perform an appropriate method lookup based on accessor, holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
// name, signature, and bytecode.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   672
Method* ciEnv::lookup_method(InstanceKlass*  accessor,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   673
                               InstanceKlass*  holder,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   674
                               Symbol*       name,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   675
                               Symbol*       sig,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
                               Bytecodes::Code bc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  EXCEPTION_CONTEXT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  KlassHandle h_accessor(THREAD, accessor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  KlassHandle h_holder(THREAD, holder);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  LinkResolver::check_klass_accessability(h_accessor, h_holder, KILL_COMPILE_ON_FATAL_(NULL));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  methodHandle dest_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  switch (bc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  case Bytecodes::_invokestatic:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
    dest_method =
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   685
      LinkResolver::resolve_static_call_or_null(h_holder, name, sig, h_accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  case Bytecodes::_invokespecial:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
    dest_method =
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   689
      LinkResolver::resolve_special_call_or_null(h_holder, name, sig, h_accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  case Bytecodes::_invokeinterface:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
    dest_method =
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   693
      LinkResolver::linktime_resolve_interface_method_or_null(h_holder, name, sig,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
                                                              h_accessor, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  case Bytecodes::_invokevirtual:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
    dest_method =
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7918
diff changeset
   698
      LinkResolver::linktime_resolve_virtual_method_or_null(h_holder, name, sig,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
                                                            h_accessor, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  return dest_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
// ciEnv::get_method_by_index_impl
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   710
ciMethod* ciEnv::get_method_by_index_impl(constantPoolHandle cpool,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   711
                                          int index, Bytecodes::Code bc,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   712
                                          ciInstanceKlass* accessor) {
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   713
  if (bc == Bytecodes::_invokedynamic) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   714
    ConstantPoolCacheEntry* cpce = cpool->invokedynamic_cp_cache_entry_at(index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   715
    bool is_resolved = !cpce->is_f1_null();
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   716
    // FIXME: code generation could allow for null (unlinked) call site
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   717
    // The call site could be made patchable as follows:
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   718
    // Load the appendix argument from the constant pool.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   719
    // Test the appendix argument and jump to a known deopt routine if it is null.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   720
    // Jump through a patchable call site, which is initially a deopt routine.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   721
    // Patch the call site to the nmethod entry point of the static compiled lambda form.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   722
    // As with other two-component call sites, both values must be independently verified.
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   723
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   724
    if (is_resolved) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   725
      // Get the invoker Method* from the constant pool.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   726
      // (The appendix argument, if any, will be noted in the method's signature.)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   727
      Method* adapter = cpce->f1_as_method();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   728
      return get_method(adapter);
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
   729
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   731
    // Fake a method that is equivalent to a declared method.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   732
    ciInstanceKlass* holder    = get_instance_klass(SystemDictionary::MethodHandle_klass());
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10734
diff changeset
   733
    ciSymbol*        name      = ciSymbol::invokeBasic_name();
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10564
diff changeset
   734
    ciSymbol*        signature = get_symbol(cpool->signature_ref_at(index));
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10564
diff changeset
   735
    return get_unloaded_method(holder, name, signature, accessor);
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   736
  } else {
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   737
    const int holder_index = cpool->klass_ref_index_at(index);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   738
    bool holder_is_accessible;
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   739
    ciKlass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   740
    ciInstanceKlass* declared_holder = get_instance_klass_for_declared_method_holder(holder);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   741
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   742
    // Get the method's name and signature.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   743
    Symbol* name_sym = cpool->name_ref_at(index);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   744
    Symbol* sig_sym  = cpool->signature_ref_at(index);
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   745
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   746
    if (cpool->has_preresolution()
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   747
        || (holder == ciEnv::MethodHandle_klass() &&
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   748
            MethodHandles::is_signature_polymorphic_name(holder->get_Klass(), name_sym))) {
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   749
      // Short-circuit lookups for JSR 292-related call sites.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   750
      // That is, do not rely only on name-based lookups, because they may fail
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   751
      // if the names are not resolvable in the boot class loader (7056328).
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   752
      switch (bc) {
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   753
      case Bytecodes::_invokevirtual:
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   754
      case Bytecodes::_invokeinterface:
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   755
      case Bytecodes::_invokespecial:
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   756
      case Bytecodes::_invokestatic:
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   757
        {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   758
          Method* m = ConstantPool::method_at_if_loaded(cpool, index);
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   759
          if (m != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   760
            return get_method(m);
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   761
          }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   762
        }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   763
        break;
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   764
      }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   765
    }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   766
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   767
    if (holder_is_accessible) {  // Our declared holder is loaded.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   768
      InstanceKlass* lookup = declared_holder->get_instanceKlass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   769
      Method* m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc);
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   770
      if (m != NULL &&
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   771
          (bc == Bytecodes::_invokestatic
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13974
diff changeset
   772
           ?  m->method_holder()->is_not_initialized()
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13974
diff changeset
   773
           : !m->method_holder()->is_loaded())) {
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   774
        m = NULL;
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   775
      }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   776
#ifdef ASSERT
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   777
      if (m != NULL && ReplayCompiles && !ciReplay::is_loaded(m)) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   778
        m = NULL;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   779
      }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   780
#endif
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   781
      if (m != NULL) {
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   782
        // We found the method.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   783
        return get_method(m);
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   784
      }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   785
    }
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   786
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   787
    // Either the declared holder was not loaded, or the method could
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   788
    // not be found.  Create a dummy ciMethod to represent the failed
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   789
    // lookup.
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   790
    ciSymbol* name      = get_symbol(name_sym);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   791
    ciSymbol* signature = get_symbol(sig_sym);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   792
    return get_unloaded_method(declared_holder, name, signature, accessor);
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   793
  }
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   794
}
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   795
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   796
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   797
// ------------------------------------------------------------------
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
// ciEnv::get_instance_klass_for_declared_method_holder
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
ciInstanceKlass* ciEnv::get_instance_klass_for_declared_method_holder(ciKlass* method_holder) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  // For the case of <array>.clone(), the method holder can be a ciArrayKlass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  // instead of a ciInstanceKlass.  For that case simply pretend that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  // declared holder is Object.clone since that's where the call will bottom out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  // A more correct fix would trickle out through many interfaces in CI,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  // requiring ciInstanceKlass* to become ciKlass* and many more places would
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  // require checks to make sure the expected type was found.  Given that this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  // only occurs for clone() the more extensive fix seems like overkill so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  // instead we simply smear the array type into Object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  if (method_holder->is_instance_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    return method_holder->as_instance_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  } else if (method_holder->is_array_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
    return current()->Object_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
// ciEnv::get_method_by_index
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   821
ciMethod* ciEnv::get_method_by_index(constantPoolHandle cpool,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   822
                                     int index, Bytecodes::Code bc,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   823
                                     ciInstanceKlass* accessor) {
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
   824
  GUARDED_VM_ENTRY(return get_method_by_index_impl(cpool, index, bc, accessor);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 4450
diff changeset
   827
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
// ciEnv::name_buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
char *ciEnv::name_buffer(int req_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  if (_name_buffer_len < req_len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
    if (_name_buffer == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
      _name_buffer = (char*)arena()->Amalloc(sizeof(char)*req_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
      _name_buffer_len = req_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
      _name_buffer =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
        (char*)arena()->Arealloc(_name_buffer, _name_buffer_len, req_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
      _name_buffer_len = req_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  return _name_buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
// ciEnv::is_in_vm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
bool ciEnv::is_in_vm() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  return JavaThread::current()->thread_state() == _thread_in_vm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
bool ciEnv::system_dictionary_modification_counter_changed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  return _system_dictionary_modification_counter != SystemDictionary::number_of_modifications();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
// ------------------------------------------------------------------
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   855
// ciEnv::validate_compile_task_dependencies
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   856
//
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   857
// Check for changes during compilation (e.g. class loads, evolution,
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   858
// breakpoints, call site invalidation).
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   859
void ciEnv::validate_compile_task_dependencies(ciMethod* target) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  if (failing())  return;  // no need for further checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   862
  // First, check non-klass dependencies as we might return early and
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   863
  // not check klass dependencies if the system dictionary
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   864
  // modification counter hasn't changed (see below).
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   865
  for (Dependencies::DepStream deps(dependencies()); deps.next(); ) {
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   866
    if (deps.is_klass_type())  continue;  // skip klass dependencies
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   867
    Klass* witness = deps.check_dependency();
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   868
    if (witness != NULL) {
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   869
      record_failure("invalid non-klass dependency");
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   870
      return;
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   871
    }
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   872
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   874
  // Klass dependencies must be checked when the system dictionary
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   875
  // changes.  If logging is enabled all violated dependences will be
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   876
  // recorded in the log.  In debug mode check dependencies even if
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   877
  // the system dictionary hasn't changed to verify that no invalid
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   878
  // dependencies were inserted.  Any violated dependences in this
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   879
  // case are dumped to the tty.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  bool counter_changed = system_dictionary_modification_counter_changed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
10564
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   882
  bool verify_deps = trueInDebug;
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   883
  if (!counter_changed && !verify_deps)  return;
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   884
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   885
  int klass_violations = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  for (Dependencies::DepStream deps(dependencies()); deps.next(); ) {
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   887
    if (!deps.is_klass_type())  continue;  // skip non-klass dependencies
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   888
    Klass* witness = deps.check_dependency();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    if (witness != NULL) {
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   890
      klass_violations++;
10564
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   891
      if (!counter_changed) {
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   892
        // Dependence failed but counter didn't change.  Log a message
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   893
        // describing what failed and allow the assert at the end to
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   894
        // trigger.
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   895
        deps.print_dependency(witness);
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   896
      } else if (xtty == NULL) {
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   897
        // If we're not logging then a single violation is sufficient,
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   898
        // otherwise we want to log all the dependences which were
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   899
        // violated.
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   900
        break;
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   901
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   905
  if (klass_violations != 0) {
10564
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   906
#ifdef ASSERT
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   907
    if (!counter_changed && !PrintCompilation) {
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   908
      // Print out the compile task that failed
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   909
      _task->print_line();
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   910
    }
db5bf5438c0a 7092236: java/util/EnumSet/EnumSetBash.java fails
never
parents: 10508
diff changeset
   911
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
    assert(counter_changed, "failed dependencies, but counter didn't change");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    record_failure("concurrent class loading");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
// ciEnv::register_method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
void ciEnv::register_method(ciMethod* target,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
                            int entry_bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
                            CodeOffsets* offsets,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
                            int orig_pc_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
                            CodeBuffer* code_buffer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
                            int frame_words,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
                            OopMapSet* oop_map_set,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
                            ExceptionHandlerTable* handler_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
                            ImplicitExceptionTable* inc_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
                            AbstractCompiler* compiler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
                            int comp_level,
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   930
                            bool has_unsafe_access,
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   931
                            bool has_wide_vectors) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  nmethod* nm = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
    // To prevent compile queue updates.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
    MutexLocker locker(MethodCompileQueue_lock, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
    // Prevent SystemDictionary::add_to_hierarchy from running
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
    // and invalidating our dependencies until we install this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    MutexLocker ml(Compile_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   942
    // Change in Jvmti state may invalidate compilation.
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   943
    if (!failing() &&
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   944
        ( (!jvmti_can_hotswap_or_post_breakpoint() &&
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   945
           JvmtiExport::can_hotswap_or_post_breakpoint()) ||
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   946
          (!jvmti_can_access_local_variables() &&
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   947
           JvmtiExport::can_access_local_variables()) ||
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   948
          (!jvmti_can_post_on_exceptions() &&
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   949
           JvmtiExport::can_post_on_exceptions()) )) {
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   950
      record_failure("Jvmti state change invalidated dependencies");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   953
    // Change in DTrace flags may invalidate compilation.
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   954
    if (!failing() &&
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   955
        ( (!dtrace_extended_probes() && ExtendedDTraceProbes) ||
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   956
          (!dtrace_method_probes() && DTraceMethodProbes) ||
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   957
          (!dtrace_alloc_probes() && DTraceAllocProbes) )) {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   958
      record_failure("DTrace flags change invalidated dependencies");
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   959
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   961
    if (!failing()) {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   962
      if (log() != NULL) {
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   963
        // Log the dependencies which this compilation declares.
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   964
        dependencies()->log_all_dependencies();
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   965
      }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   966
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   967
      // Encode the dependencies now, so we can check them right away.
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   968
      dependencies()->encode_content_bytes();
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   969
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   970
      // Check for {class loads, evolution, breakpoints, ...} during compilation
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   971
      validate_compile_task_dependencies(target);
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1623
diff changeset
   972
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   974
    methodHandle method(THREAD, target->get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
    if (failing()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
      // While not a true deoptimization, it is a preemptive decompile.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   978
      MethodData* mdo = method()->method_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
      if (mdo != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
        mdo->inc_decompile_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
      // All buffers in the CodeBuffer are allocated in the CodeCache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
      // If the code buffer is created on each compile attempt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
      // as in C2, then it must be freed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
      code_buffer->free_blob();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
    assert(offsets->value(CodeOffsets::Deopt) != -1, "must have deopt entry");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
    assert(offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    nm =  nmethod::new_nmethod(method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
                               compile_id(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
                               entry_bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
                               offsets,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
                               orig_pc_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
                               debug_info(), dependencies(), code_buffer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
                               frame_words, oop_map_set,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
                               handler_table, inc_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
                               compiler, comp_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
    // Free codeBlobs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    code_buffer->free_blob();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    // stress test 6243940 by immediately making the method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    // non-entrant behind the system's back. This has serious
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    // side effects on the code cache and is not meant for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    // general stress testing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
    if (nm != NULL && StressNonEntrant) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
      MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
      NativeJump::patch_verified_entry(nm->entry_point(), nm->verified_entry_point(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
                  SharedRuntime::get_handle_wrong_method_stub());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
    if (nm == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
      // The CodeCache is full.  Print out warning and disable compilation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
      record_failure("code cache is full");
4750
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4571
diff changeset
  1019
      {
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4571
diff changeset
  1020
        MutexUnlocker ml(Compile_lock);
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4571
diff changeset
  1021
        MutexUnlocker locker(MethodCompileQueue_lock);
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4571
diff changeset
  1022
        CompileBroker::handle_full_code_cache();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
      nm->set_has_unsafe_access(has_unsafe_access);
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
  1026
      nm->set_has_wide_vectors(has_wide_vectors);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
      // Record successful registration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
      // (Put nm into the task handle *before* publishing to the Java heap.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
      if (task() != NULL)  task()->set_code(nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
      if (entry_bci == InvocationEntryBci) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1033
        if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1034
          // If there is an old version we're done with it
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1035
          nmethod* old = method->code();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1036
          if (TraceMethodReplacement && old != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1037
            ResourceMark rm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1038
            char *method_name = method->name_and_sig_as_C_string();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1039
            tty->print_cr("Replacing method %s", method_name);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1040
          }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1041
          if (old != NULL ) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1042
            old->make_not_entrant();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1043
          }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
        if (TraceNMethodInstalls ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
          ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
          char *method_name = method->name_and_sig_as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
          ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
          tty->print_cr("Installing method (%d) %s ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
                        comp_level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
                        method_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
        // Allow the code to be executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
        method->set_code(method, nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
        if (TraceNMethodInstalls ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
          ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
          char *method_name = method->name_and_sig_as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
          ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
          tty->print_cr("Installing osr method (%d) %s @ %d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
                        comp_level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
                        method_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
                        entry_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
        }
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13974
diff changeset
  1065
        method->method_holder()->add_osr_nmethod(nm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  // JVMTI -- compiled method notification (must be done outside lock)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  if (nm != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    nm->post_compiled_method_load_event();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
// ciEnv::find_system_klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
ciKlass* ciEnv::find_system_klass(ciSymbol* klass_name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  VM_ENTRY_MARK;
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9328
diff changeset
  1082
  return get_klass_by_name_impl(NULL, constantPoolHandle(), klass_name, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
// ciEnv::comp_level
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
int ciEnv::comp_level() {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6064
diff changeset
  1088
  if (task() == NULL)  return CompLevel_highest_tier;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  return task()->comp_level();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
// ciEnv::compile_id
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
uint ciEnv::compile_id() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  if (task() == NULL)  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  return task()->compile_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
// ciEnv::notice_inlined_method()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
void ciEnv::notice_inlined_method(ciMethod* method) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10734
diff changeset
  1102
  _num_inlined_bytecodes += method->code_size_for_inlining();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
// ciEnv::num_inlined_bytecodes()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
int ciEnv::num_inlined_bytecodes() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  return _num_inlined_bytecodes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
// ciEnv::record_failure()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
void ciEnv::record_failure(const char* reason) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  if (log() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
    log()->elem("failure reason='%s'", reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  if (_failure_reason == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    // Record the first failure reason.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
    _failure_reason = reason;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
// ciEnv::record_method_not_compilable()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
void ciEnv::record_method_not_compilable(const char* reason, bool all_tiers) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  int new_compilable =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    all_tiers ? MethodCompilable_never : MethodCompilable_not_at_tier ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  // Only note transitions to a worse state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  if (new_compilable > _compilable) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
    if (log() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
      if (all_tiers) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
        log()->elem("method_not_compilable");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
      } else {
13964
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13883
diff changeset
  1135
        log()->elem("method_not_compilable_at_tier level='%d'",
01a2b863cc61 7177003: C1: LogCompilation support
vlivanov
parents: 13883
diff changeset
  1136
                    current()->task()->comp_level());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    _compilable = new_compilable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    // Reset failure reason; this one is more important.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
    _failure_reason = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
    record_failure(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
// ciEnv::record_out_of_memory_failure()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
void ciEnv::record_out_of_memory_failure() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  // If memory is low, we stop compiling methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  record_method_not_compilable("out of memory");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
}
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1153
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1154
fileStream* ciEnv::_replay_data_stream = NULL;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1155
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1156
void ciEnv::dump_replay_data() {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1157
  VM_ENTRY_MARK;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1158
  MutexLocker ml(Compile_lock);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1159
  if (_replay_data_stream == NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1160
    _replay_data_stream = new (ResourceObj::C_HEAP, mtCompiler) fileStream(ReplayDataFile);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1161
    if (_replay_data_stream == NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1162
      fatal(err_msg("Can't open %s for replay data", ReplayDataFile));
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1163
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1164
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1165
  dump_replay_data(_replay_data_stream);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1166
}
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1167
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1168
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1169
void ciEnv::dump_replay_data(outputStream* out) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1170
  ASSERT_IN_VM;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1171
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1172
#if INCLUDE_JVMTI
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1173
  out->print_cr("JvmtiExport can_access_local_variables %d",     _jvmti_can_access_local_variables);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1174
  out->print_cr("JvmtiExport can_hotswap_or_post_breakpoint %d", _jvmti_can_hotswap_or_post_breakpoint);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1175
  out->print_cr("JvmtiExport can_post_on_exceptions %d",         _jvmti_can_post_on_exceptions);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1176
#endif // INCLUDE_JVMTI
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1177
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1178
  GrowableArray<ciMetadata*>* objects = _factory->get_ci_metadata();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1179
  out->print_cr("# %d ciObject found", objects->length());
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1180
  for (int i = 0; i < objects->length(); i++) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1181
    objects->at(i)->dump_replay_data(out);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1182
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1183
  Method* method = task()->method();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1184
  int entry_bci = task()->osr_bci();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1185
  // Klass holder = method->method_holder();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1186
  out->print_cr("compile %s %s %s %d",
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1187
                method->klass_name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1188
                method->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1189
                method->signature()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1190
                entry_bci);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1191
  out->flush();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1192
}