hotspot/src/share/vm/interpreter/interpreter.cpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8076 96d498ec7ae1
child 12739 09f26b73ae66
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
     2
 * Copyright (c) 1997, 2011, 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: 4564
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4564
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: 4564
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: 6176
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    26
#include "asm/assembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    27
#include "interpreter/bytecodeHistogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    28
#include "interpreter/bytecodeInterpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    29
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    30
#include "interpreter/interpreterRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    31
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    32
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    33
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    34
#include "oops/arrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    35
#include "oops/methodDataOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    36
#include "oops/methodOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    37
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    38
#include "prims/forte.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    39
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    40
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    41
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    42
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    43
#include "runtime/timer.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
# define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// Implementation of InterpreterCodelet
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  _description       = description;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  _bytecode          = bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
void InterpreterCodelet::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    61
void InterpreterCodelet::print_on(outputStream* st) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  if (PrintInterpreter) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    63
    st->cr();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    64
    st->print_cr("----------------------------------------------------------------------");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    67
  if (description() != NULL) st->print("%s  ", description());
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    68
  if (bytecode()    >= 0   ) st->print("%d %s  ", bytecode(), Bytecodes::name(bytecode()));
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    69
  st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "]  %d bytes",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
                code_begin(), code_end(), code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  if (PrintInterpreter) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    73
    st->cr();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    74
    Disassembler::decode(code_begin(), code_end(), st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
// Implementation of  platform independent aspects of Interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
void AbstractInterpreter::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  if (_code != NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // make sure 'imported' classes are initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  if (PrintBytecodeHistogram)                                BytecodeHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  if (PrintBytecodePairHistogram)                            BytecodePairHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  InvocationCounter::reinitialize(DelayCompilationDuringStartup);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
void AbstractInterpreter::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  tty->print_cr("Interpreter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  tty->print_cr("code size        = %6dK bytes", (int)_code->used_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  tty->print_cr("total space      = %6dK bytes", (int)_code->total_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  tty->print_cr("wasted space     = %6dK bytes", (int)_code->available_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  tty->print_cr("# of codelets    = %6d"      , _code->number_of_stubs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _code->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
void interpreter_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  Interpreter::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // need to hit every safepoint in order to call zapping routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // register the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  Forte::register_stub(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    "Interpreter",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    AbstractInterpreter::code()->code_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    AbstractInterpreter::code()->code_end()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // notify JVMTI profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  if (JvmtiExport::should_post_dynamic_code_generated()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    JvmtiExport::post_dynamic_code_generated("Interpreter",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
                                             AbstractInterpreter::code()->code_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
                                             AbstractInterpreter::code()->code_end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
// Implementation of interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
StubQueue* AbstractInterpreter::_code                                       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
bool       AbstractInterpreter::_notice_safepoints                          = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
address    AbstractInterpreter::_rethrow_exception_entry                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
address    AbstractInterpreter::_native_entry_begin                         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
address    AbstractInterpreter::_native_entry_end                           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
address    AbstractInterpreter::_slow_signature_handler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
address    AbstractInterpreter::_entry_table            [AbstractInterpreter::number_of_method_entries];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
address    AbstractInterpreter::_native_abi_to_tosca    [AbstractInterpreter::number_of_result_handlers];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
// Generation of complete interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  _masm                      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
static const BasicType types[Interpreter::number_of_result_handlers] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  T_BOOLEAN,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  T_CHAR   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  T_BYTE   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  T_SHORT  ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  T_INT    ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  T_LONG   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  T_VOID   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  T_FLOAT  ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  T_DOUBLE ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  T_OBJECT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
void AbstractInterpreterGenerator::generate_all() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  { CodeletMark cm(_masm, "slow signature handler");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    Interpreter::_slow_signature_handler = generate_slow_signature_handler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
// Entry points
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Abstract method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  if (m->is_abstract()) return abstract;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   183
  // Invoker for method handles?
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   184
  if (m->is_method_handle_invoke())  return method_handle;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   185
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // Native method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Note: This test must come _before_ the test for intrinsic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  //       methods. See also comments below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  if (m->is_native()) {
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   190
    assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    return m->is_synchronized() ? native_synchronized : native;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // Synchronized?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  if (m->is_synchronized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    return zerolocals_synchronized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  if (RegisterFinalizersAtInit && m->code_size() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
      m->intrinsic_id() == vmIntrinsics::_Object_init) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    // We need to execute the special return bytecode to check for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    // finalizer registration so create a normal frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // Empty method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  if (m->is_empty_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    return empty;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // Special intrinsic method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // Note: This test must come _after_ the test for native methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  //       otherwise we will run into problems with JDK 1.2, see also
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  //       AbstractInterpreterGenerator::generate_method_entry() for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  //       for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  switch (m->intrinsic_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    case vmIntrinsics::_dlog  : return java_lang_math_log  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    case vmIntrinsics::_dlog10: return java_lang_math_log10;
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   224
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   225
    case vmIntrinsics::_Reference_get:
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   226
                                return java_lang_ref_reference_get;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   227
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   228
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   229
  // Accessor method?
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   230
  if (m->is_accessor()) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   231
    assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   232
    return accessor;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // Note: for now: zero locals for all non-empty methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
// Return true if the interpreter can prove that the given bytecode has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
// not yet been executed (in Java semantics, not in actual operation).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   243
  Bytecodes::Code code = method()->code_at(bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   245
  if (!Bytecodes::must_rewrite(code)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    // might have been reached
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // the bytecode might not be rewritten if the method is an accessor, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  address ientry = method->interpreter_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
      ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    return false;  // interpreter does not run this method!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // otherwise, we can be sure this bytecode has never been executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
void AbstractInterpreter::print_method_kind(MethodKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  switch (kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    case zerolocals             : tty->print("zerolocals"             ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    case native                 : tty->print("native"                 ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    case native_synchronized    : tty->print("native_synchronized"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    case empty                  : tty->print("empty"                  ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    case accessor               : tty->print("accessor"               ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    case abstract               : tty->print("abstract"               ); break;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   271
    case method_handle          : tty->print("method_handle"          ); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    case java_lang_math_sin     : tty->print("java_lang_math_sin"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    case java_lang_math_cos     : tty->print("java_lang_math_cos"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    case java_lang_math_tan     : tty->print("java_lang_math_tan"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    case java_lang_math_abs     : tty->print("java_lang_math_abs"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    case java_lang_math_sqrt    : tty->print("java_lang_math_sqrt"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    case java_lang_math_log     : tty->print("java_lang_math_log"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    case java_lang_math_log10   : tty->print("java_lang_math_log10"   ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    default                     : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
// Deoptimization support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   288
// If deoptimization happens, this function returns the point of next bytecode to continue execution
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   289
address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  assert(method->contains(bcp), "just checkin'");
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   291
  Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   292
  assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  int             bci    = method->bci_from(bcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  int             length = -1; // initial value for debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // compute continuation length
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   296
  length = Bytecodes::length_at(method, bcp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // compute result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  BasicType type = T_ILLEGAL;
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   299
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    case Bytecodes::_invokevirtual  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    case Bytecodes::_invokespecial  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    case Bytecodes::_invokestatic   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    case Bytecodes::_invokeinterface: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
      Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
      ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   308
      type = Bytecode_invoke(mh, bci).result_type();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
      // since the cache entry might not be initialized:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
      // (NOT needed for the old calling convension)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
      if (!is_top_frame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
        int index = Bytes::get_native_u2(bcp+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
        method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   318
   case Bytecodes::_invokedynamic: {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   319
      Thread *thread = Thread::current();
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   320
      ResourceMark rm(thread);
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   321
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   322
      type = Bytecode_invoke(mh, bci).result_type();
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   323
      // since the cache entry might not be initialized:
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   324
      // (NOT needed for the old calling convension)
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   325
      if (!is_top_frame) {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   326
        int index = Bytes::get_native_u4(bcp+1);
4564
55dfb20908d0 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 4429
diff changeset
   327
        method->constants()->cache()->secondary_entry_at(index)->set_parameter_size(callee_parameters);
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   328
      }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   329
      break;
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   330
    }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   331
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    case Bytecodes::_ldc   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    case Bytecodes::_ldc_w : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    case Bytecodes::_ldc2_w:
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   335
      {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   336
        Thread *thread = Thread::current();
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   337
        ResourceMark rm(thread);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   338
        methodHandle mh(thread, method);
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   339
        type = Bytecode_loadconstant(mh, bci).result_type();
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   340
        break;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   341
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
      type = Bytecodes::result_type(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // return entry point for computed continuation state & bytecode length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    is_top_frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    ? Interpreter::deopt_entry (as_TosState(type), length)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    : Interpreter::return_entry(as_TosState(type), length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   355
// If deoptimization happens, this function returns the point where the interpreter reexecutes
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   356
// the bytecode.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   357
// Note: Bytecodes::_athrow is a special case in that it does not return
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   358
//       Interpreter::deopt_entry(vtos, 0) like others
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   359
address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   360
  assert(method->contains(bcp), "just checkin'");
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   361
  Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   362
#ifdef COMPILER1
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   363
  if(code == Bytecodes::_athrow ) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   364
    return Interpreter::rethrow_exception_entry();
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   365
  }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   366
#endif /* COMPILER1 */
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   367
  return Interpreter::deopt_entry(vtos, 0);
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   368
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   369
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   370
// If deoptimization happens, the interpreter should reexecute these bytecodes.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   371
// This function mainly helps the compilers to set up the reexecute bit.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   372
bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   373
  switch (code) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   374
    case Bytecodes::_lookupswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   375
    case Bytecodes::_tableswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   376
    case Bytecodes::_fast_binaryswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   377
    case Bytecodes::_fast_linearswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   378
    // recompute condtional expression folded into _if<cond>
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   379
    case Bytecodes::_lcmp      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   380
    case Bytecodes::_fcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   381
    case Bytecodes::_fcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   382
    case Bytecodes::_dcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   383
    case Bytecodes::_dcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   384
    case Bytecodes::_ifnull    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   385
    case Bytecodes::_ifnonnull :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   386
    case Bytecodes::_goto      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   387
    case Bytecodes::_goto_w    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   388
    case Bytecodes::_ifeq      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   389
    case Bytecodes::_ifne      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   390
    case Bytecodes::_iflt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   391
    case Bytecodes::_ifge      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   392
    case Bytecodes::_ifgt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   393
    case Bytecodes::_ifle      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   394
    case Bytecodes::_if_icmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   395
    case Bytecodes::_if_icmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   396
    case Bytecodes::_if_icmplt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   397
    case Bytecodes::_if_icmpge :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   398
    case Bytecodes::_if_icmpgt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   399
    case Bytecodes::_if_icmple :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   400
    case Bytecodes::_if_acmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   401
    case Bytecodes::_if_acmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   402
    // special cases
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   403
    case Bytecodes::_getfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   404
    case Bytecodes::_putfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   405
    case Bytecodes::_getstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   406
    case Bytecodes::_putstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   407
    case Bytecodes::_aastore   :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   408
#ifdef COMPILER1
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   409
    //special case of reexecution
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   410
    case Bytecodes::_athrow    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   411
#endif
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   412
      return true;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   413
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   414
    default:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   415
      return false;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   416
  }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   417
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   418
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  // Quick & dirty stack overflow checking: bang the stack & handle trap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // Note that we do the banging after the frame is setup, since the exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  // handling code expects to find a valid interpreter frame on the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // Doing the banging earlier fails if the caller frame is not an interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // (Also, the exception throwing code expects to unlock any synchronized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // method receiever, so do the banging after locking the receiver.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  // Bang each page in the shadow zone. We can't assume it's been done for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // an interpreter frame with greater than a page of locals, so each page
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // needs to be checked.  Only true for non-native.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  if (UseStackBanging) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    const int start_page = native_call ? StackShadowPages : 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    const int page_size = os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    for (int pages = start_page; pages <= StackShadowPages ; pages++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
      __ bang_stack_with_offset(pages*page_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
}