hotspot/src/share/vm/runtime/sharedRuntime.hpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 37179 4dbcb3a642d2
child 38133 78b95467b9f1
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
37152
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 36079
diff changeset
     2
 * Copyright (c) 1997, 2016, 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: 5050
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5050
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: 5050
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: 6965
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_SHAREDRUNTIME_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    26
#define SHARE_VM_RUNTIME_SHAREDRUNTIME_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    28
#include "interpreter/bytecodeHistogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    29
#include "interpreter/bytecodeTracer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    30
#include "interpreter/linkResolver.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    31
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    32
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    33
#include "utilities/hashtable.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 13883
diff changeset
    34
#include "utilities/macros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
    35
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class AdapterHandlerEntry;
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
    37
class AdapterHandlerTable;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
    38
class AdapterFingerPrint;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class vframeStream;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// Runtime is the base class for various runtime interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// (InterpreterRuntime, CompilerRuntime, etc.). It provides
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// shared functionality such as exception forwarding (C++ to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// Java exceptions), locking/unlocking mechanisms, statistical
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// information, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class SharedRuntime: AllStatic {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10004
diff changeset
    48
  friend class VMStructs;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 10004
diff changeset
    49
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  static methodHandle resolve_sub_helper(JavaThread *thread,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25472
diff changeset
    52
                                         bool is_virtual,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25472
diff changeset
    53
                                         bool is_optimized, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  // Shared stub locations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    57
  static RuntimeStub*        _wrong_method_blob;
21726
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
    58
  static RuntimeStub*        _wrong_method_abstract_blob;
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    59
  static RuntimeStub*        _ic_miss_blob;
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    60
  static RuntimeStub*        _resolve_opt_virtual_call_blob;
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    61
  static RuntimeStub*        _resolve_virtual_call_blob;
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    62
  static RuntimeStub*        _resolve_static_call_blob;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    64
  static DeoptimizationBlob* _deopt_blob;
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8872
diff changeset
    65
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
    66
  static SafepointBlob*      _polling_page_vectors_safepoint_handler_blob;
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    67
  static SafepointBlob*      _polling_page_safepoint_handler_blob;
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    68
  static SafepointBlob*      _polling_page_return_handler_blob;
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    69
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
#ifdef COMPILER2
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    71
  static UncommonTrapBlob*   _uncommon_trap_blob;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
#endif // COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // Counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  static int     _nof_megamorphic_calls;         // total # of megamorphic calls (through vtable)
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    77
#endif // !PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    79
 private:
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
    80
  enum { POLL_AT_RETURN,  POLL_AT_LOOP, POLL_AT_VECTOR_LOOP };
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
    81
  static SafepointBlob* generate_handler_blob(address call_ptr, int poll_type);
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    82
  static RuntimeStub*   generate_resolve_blob(address destination, const char* name);
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    83
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
 public:
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9630
diff changeset
    85
  static void generate_stubs(void);
363
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 189
diff changeset
    86
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 189
diff changeset
    87
  // max bytes for each dtrace string parameter
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 189
diff changeset
    88
  enum { max_dtrace_string_size = 256 };
99d43e8a76ad 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 189
diff changeset
    89
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // The following arithmetic routines are used on platforms that do
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // not have machine instructions to implement their functionality.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // Do not remove these.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // long arithmetics
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  static jlong   lmul(jlong y, jlong x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  static jlong   ldiv(jlong y, jlong x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  static jlong   lrem(jlong y, jlong x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // float and double remainder
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  static jfloat  frem(jfloat  x, jfloat  y);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  static jdouble drem(jdouble x, jdouble y);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
35055
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   103
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   104
#ifdef _WIN64
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   105
  // Workaround for fmod issue in the Windows x64 CRT
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   106
  static double fmod_winx64(double x, double y);
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   107
#endif
a4cf2927e727 8015396: double a%b returns NaN for some (a,b) (|a| < inf, |b|>0)
ctornqvi
parents: 34633
diff changeset
   108
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   109
#ifdef __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   110
  static jfloat  fadd(jfloat x, jfloat y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   111
  static jfloat  fsub(jfloat x, jfloat y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   112
  static jfloat  fmul(jfloat x, jfloat y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   113
  static jfloat  fdiv(jfloat x, jfloat y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   114
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   115
  static jdouble dadd(jdouble x, jdouble y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   116
  static jdouble dsub(jdouble x, jdouble y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   117
  static jdouble dmul(jdouble x, jdouble y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   118
  static jdouble ddiv(jdouble x, jdouble y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   119
#endif // __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   120
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // float conversion (needs to set appropriate rounding mode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  static jint    f2i (jfloat  x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  static jlong   f2l (jfloat  x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  static jint    d2i (jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  static jlong   d2l (jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  static jfloat  d2f (jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  static jfloat  l2f (jlong   x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  static jdouble l2d (jlong   x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   130
#ifdef __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   131
  static jfloat  i2f (jint    x);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   132
  static jdouble i2d (jint    x);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   133
  static jdouble f2d (jfloat  x);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   134
#endif // __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   135
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  // double trigonometrics and transcendentals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  static jdouble dsin(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  static jdouble dcos(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  static jdouble dtan(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  static jdouble dlog(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  static jdouble dlog10(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  static jdouble dexp(jdouble x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  static jdouble dpow(jdouble x, jdouble y);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   145
#if defined(__SOFTFP__) || defined(E500V2)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   146
  static double dabs(double f);
6965
4ef36b2a6a3a 6989297: Integrate additional portability improvements
bobv
parents: 6418
diff changeset
   147
#endif
4ef36b2a6a3a 6989297: Integrate additional portability improvements
bobv
parents: 6418
diff changeset
   148
34220
1ba69cb5585c 8138952: C1: Distinguish between PPC32 and PPC64
mdoerr
parents: 33593
diff changeset
   149
#if defined(__SOFTFP__) || defined(PPC)
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   150
  static double dsqrt(double f);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   151
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   152
31583
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   153
  // Montgomery multiplication
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   154
  static void montgomery_multiply(jint *a_ints, jint *b_ints, jint *n_ints,
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   155
                                  jint len, jlong inv, jint *m_ints);
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   156
  static void montgomery_square(jint *a_ints, jint *n_ints,
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   157
                                jint len, jlong inv, jint *m_ints);
eb5bea7b4835 8130150: Implement BigInteger.montgomeryMultiply intrinsic
aph
parents: 30244
diff changeset
   158
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   159
#ifdef __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   160
  // C++ compiler generates soft float instructions as well as passing
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   161
  // float and double in registers.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   162
  static int  fcmpl(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   163
  static int  fcmpg(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   164
  static int  dcmpl(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   165
  static int  dcmpg(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   166
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   167
  static int unordered_fcmplt(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   168
  static int unordered_dcmplt(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   169
  static int unordered_fcmple(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   170
  static int unordered_dcmple(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   171
  static int unordered_fcmpge(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   172
  static int unordered_dcmpge(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   173
  static int unordered_fcmpgt(float x, float y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   174
  static int unordered_dcmpgt(double x, double y);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   175
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   176
  static float  fneg(float f);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   177
  static double dneg(double f);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   178
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   179
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // exception handling across interpreter/compiler boundaries
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4755
diff changeset
   181
  static address raw_exception_handler_for_return_address(JavaThread* thread, address return_address);
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4755
diff changeset
   182
  static address exception_handler_for_return_address(JavaThread* thread, address return_address);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 13883
diff changeset
   184
#if INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   185
  // G1 write barriers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   186
  static void g1_wb_pre(oopDesc* orig, JavaThread *thread);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   187
  static void g1_wb_post(void* card_addr, JavaThread* thread);
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 13883
diff changeset
   188
#endif // INCLUDE_ALL_GCS
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 363
diff changeset
   189
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // exception handling and implicit exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  static address compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
                                              bool force_unwind, bool top_frame_only);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  enum ImplicitExceptionKind {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    IMPLICIT_NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    IMPLICIT_DIVIDE_BY_ZERO,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    STACK_OVERFLOW
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  static void    throw_AbstractMethodError(JavaThread* thread);
189
4248c8e21063 6664627: Merge changes made only in hotspot 11 forward to jdk 7
dcubed
parents: 1
diff changeset
   199
  static void    throw_IncompatibleClassChangeError(JavaThread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  static void    throw_ArithmeticException(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  static void    throw_NullPointerException(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  static void    throw_NullPointerException_at_call(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  static void    throw_StackOverflowError(JavaThread* thread);
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 35055
diff changeset
   204
  static void    throw_delayed_StackOverflowError(JavaThread* thread);
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 35055
diff changeset
   205
  static void    throw_StackOverflowError_common(JavaThread* thread, bool delayed);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  static address continuation_for_implicit_exception(JavaThread* thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
                                                     address faulting_pc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
                                                     ImplicitExceptionKind exception_kind);
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   209
#if INCLUDE_JVMCI
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   210
  static address deoptimize_for_implicit_exception(JavaThread* thread, address pc, nmethod* nm, int deopt_reason);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   211
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 35055
diff changeset
   213
  static void enable_stack_reserved_zone(JavaThread* thread);
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 35055
diff changeset
   214
  static frame look_for_reserved_stack_annotated_method(JavaThread* thread, frame fr);
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 35055
diff changeset
   215
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // Shared stub locations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  static address get_poll_stub(address pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  static address get_ic_miss_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    assert(_ic_miss_blob!= NULL, "oops");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   221
    return _ic_miss_blob->entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  static address get_handle_wrong_method_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    assert(_wrong_method_blob!= NULL, "oops");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   226
    return _wrong_method_blob->entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
21726
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   229
  static address get_handle_wrong_method_abstract_stub() {
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   230
    assert(_wrong_method_abstract_blob!= NULL, "oops");
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   231
    return _wrong_method_abstract_blob->entry_point();
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   232
  }
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   233
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  static void generate_uncommon_trap_blob(void);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  static UncommonTrapBlob* uncommon_trap_blob()                  { return _uncommon_trap_blob; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
#endif // COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
25069
c937c5e883c5 8047156: cleanup more non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24462
diff changeset
   239
  static address get_resolve_opt_virtual_call_stub() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    assert(_resolve_opt_virtual_call_blob != NULL, "oops");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   241
    return _resolve_opt_virtual_call_blob->entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  static address get_resolve_virtual_call_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    assert(_resolve_virtual_call_blob != NULL, "oops");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   245
    return _resolve_virtual_call_blob->entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  static address get_resolve_static_call_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    assert(_resolve_static_call_blob != NULL, "oops");
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   249
    return _resolve_static_call_blob->entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  static SafepointBlob* polling_page_return_handler_blob()     { return _polling_page_return_handler_blob; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  static SafepointBlob* polling_page_safepoint_handler_blob()  { return _polling_page_safepoint_handler_blob; }
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
   254
  static SafepointBlob* polling_page_vectors_safepoint_handler_blob()  { return _polling_page_vectors_safepoint_handler_blob; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // Counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  static address nof_megamorphic_calls_addr() { return (address)&_nof_megamorphic_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // Helper routine for full-speed JVMTI exception throwing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  static void throw_and_post_jvmti_exception(JavaThread *thread, Handle h_exception);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   263
  static void throw_and_post_jvmti_exception(JavaThread *thread, Symbol* name, const char *message = NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
2136
c55428da3cec 6805864: 4/3 Problem with jvmti->redefineClasses: some methods don't get redefined
dcubed
parents: 1388
diff changeset
   265
  // RedefineClasses() tracing support for obsolete method entry
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   266
  static int rc_trace_method_entry(JavaThread* thread, Method* m);
2136
c55428da3cec 6805864: 4/3 Problem with jvmti->redefineClasses: some methods don't get redefined
dcubed
parents: 1388
diff changeset
   267
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // To be used as the entry point for unresolved native methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  static address native_method_throw_unsatisfied_link_error_entry();
13396
1b2b5f740ee0 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 13391
diff changeset
   270
  static address native_method_throw_unsupported_operation_exception_entry();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
25069
c937c5e883c5 8047156: cleanup more non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24462
diff changeset
   272
  static oop retrieve_receiver(Symbol* sig, frame caller);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  static void register_finalizer(JavaThread* thread, oopDesc* obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // dtrace notifications
23995
fc58ec725daf 8039904: dtrace/hotspot/Monitors/Monitors001 fails with "assert(s > 0) failed: Bad size calculated"
coleenp
parents: 23865
diff changeset
   277
  static int dtrace_object_alloc(oopDesc* o, int size);
fc58ec725daf 8039904: dtrace/hotspot/Monitors/Monitors001 fails with "assert(s > 0) failed: Bad size calculated"
coleenp
parents: 23865
diff changeset
   278
  static int dtrace_object_alloc_base(Thread* thread, oopDesc* o, int size);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   279
  static int dtrace_method_entry(JavaThread* thread, Method* m);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   280
  static int dtrace_method_exit(JavaThread* thread, Method* m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // Utility method for retrieving the Java thread id, returns 0 if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // thread is not a well formed Java thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static jlong get_java_tid(Thread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // used by native wrappers to reenable yellow if overflow happened in native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  static void reguard_yellow_pages();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   290
  // Fill in the "X cannot be cast to a Y" message for ClassCastException
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   291
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   292
  // @param thr the current thread
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   293
  // @param caster_klass the class of the object we are casting
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   294
  // @return the dynamically allocated exception message (must be freed
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   295
  // by the caller using a resource mark)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   296
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   297
  // BCP must refer to the current 'checkcast' opcode for the frame
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   298
  // on top of the stack.
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   299
  // The caller (or one of its callers) must use a ResourceMark
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   300
  // in order to correctly free the result.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   301
  //
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   302
  static char* generate_class_cast_message(JavaThread* thr, Klass* caster_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   304
  // Fill in the "X cannot be cast to a Y" message for ClassCastException
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   305
  //
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   306
  // @param caster_klass the class of the object we are casting
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   307
  // @param target_klass the target klass attempt
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   308
  // @return the dynamically allocated exception message (must be freed
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   309
  // by the caller using a resource mark)
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   310
  //
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   311
  // This version does not require access the frame, so it can be called
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   312
  // from interpreted code
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   313
  // The caller (or one of it's callers) must use a ResourceMark
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   314
  // in order to correctly free the result.
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   315
  //
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36079
diff changeset
   316
  static char* generate_class_cast_message(Klass* caster_klass, Klass* target_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // Resolves a call site- may patch in the destination of the call into the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // compiled code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  static methodHandle resolve_helper(JavaThread *thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
                                     bool is_virtual,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
                                     bool is_optimized, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25472
diff changeset
   324
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // deopt blob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  static void generate_deopt_blob(void);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25472
diff changeset
   328
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  static DeoptimizationBlob* deopt_blob(void)      { return _deopt_blob; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  // Resets a call-site in compiled code so it will get resolved again.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  static methodHandle reresolve_call_site(JavaThread *thread, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  // In the code prolog, if the klass comparison fails, the inline cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  // misses and the call site is patched to megamorphic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  static methodHandle handle_ic_miss_helper(JavaThread* thread, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // Find the method that called us.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  static methodHandle find_callee_method(JavaThread* thread, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  static Handle find_callee_info(JavaThread* thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
                                 Bytecodes::Code& bc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
                                 CallInfo& callinfo, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  static Handle find_callee_info_helper(JavaThread* thread,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
                                        vframeStream& vfst,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
                                        Bytecodes::Code& bc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
                                        CallInfo& callinfo, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
35086
bbf32241d851 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents: 34220
diff changeset
   351
  static methodHandle extract_attached_method(vframeStream& vfst);
bbf32241d851 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents: 34220
diff changeset
   352
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  static address clean_virtual_call_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  static address clean_opt_virtual_call_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  static address clean_static_call_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
36079
692adc3fa1b5 6378256: Performance problem with System.identityHashCode in client compiler
thartmann
parents: 35135
diff changeset
   357
#if defined(X86) && defined(COMPILER1)
692adc3fa1b5 6378256: Performance problem with System.identityHashCode in client compiler
thartmann
parents: 35135
diff changeset
   358
  // For Object.hashCode, System.identityHashCode try to pull hashCode from object header if available.
692adc3fa1b5 6378256: Performance problem with System.identityHashCode in client compiler
thartmann
parents: 35135
diff changeset
   359
  static void inline_check_hashcode_from_object_header(MacroAssembler* masm, methodHandle method, Register obj_reg, Register result);
692adc3fa1b5 6378256: Performance problem with System.identityHashCode in client compiler
thartmann
parents: 35135
diff changeset
   360
#endif // X86 && COMPILER1
692adc3fa1b5 6378256: Performance problem with System.identityHashCode in client compiler
thartmann
parents: 35135
diff changeset
   361
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  // Read the array of BasicTypes from a Java signature, and compute where
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  // compiled Java code would like to put the results.  Values in reg_lo and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  // reg_hi refer to 4-byte quantities.  Values less than SharedInfo::stack0 are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  // registers, those above refer to 4-byte stack slots.  All stack slots are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // based off of the window top.  SharedInfo::stack0 refers to the first usable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // slot in the bottom of the frame. SharedInfo::stack0+1 refers to the memory word
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  // 4-bytes higher. So for sparc because the register window save area is at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // the bottom of the frame the first 16 words will be skipped and SharedInfo::stack0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // will be just above it. (
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // return value is the maximum number of VMReg stack slots the convention will use.
13881
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   374
  static int java_calling_convention(const BasicType* sig_bt, VMRegPair* regs, int total_args_passed, int is_outgoing);
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   375
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33160
diff changeset
   376
  static void check_member_name_argument_is_last_argument(const methodHandle& method,
13881
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   377
                                                          const BasicType* sig_bt,
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   378
                                                          const VMRegPair* regs) NOT_DEBUG_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  // Ditto except for calling C
22832
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   381
  //
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   382
  // C argument in register AND stack slot.
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   383
  // Some architectures require that an argument must be passed in a register
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   384
  // AND in a stack slot. These architectures provide a second VMRegPair array
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   385
  // to be filled by the c_calling_convention method. On other architectures,
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   386
  // NULL is being passed as the second VMRegPair array, so arguments are either
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   387
  // passed in a register OR in a stack slot.
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   388
  static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, VMRegPair *regs2,
03720a5b7595 8024344: PPC64 (part 112): C argument in register AND stack slot.
goetz
parents: 22808
diff changeset
   389
                                  int total_args_passed);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
22834
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   391
  // Compute the new number of arguments in the signature if 32 bit ints
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   392
  // must be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   393
  // is true.
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   394
  static int  convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt);
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   395
  // Adapt a method's signature if it contains 32 bit integers that must
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   396
  // be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   397
  // is true.
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   398
  static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count,
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   399
                                       BasicType*& in_sig_bt, VMRegPair*& in_regs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   401
  static size_t trampoline_size();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   402
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   403
  static void generate_trampoline(MacroAssembler *masm, address destination);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   404
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  // Generate I2C and C2I adapters. These adapters are simple argument marshalling
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  // blobs. Unlike adapters in the tiger and earlier releases the code in these
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // blobs does not create a new frame and are therefore virtually invisible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // to the stack walking code. In general these blobs extend the callers stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // as needed for the conversion of argument locations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // When calling a c2i blob the code will always call the interpreter even if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // by the time we reach the blob there is compiled code available. This allows
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // the blob to pass the incoming stack pointer (the sender sp) in a known
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // location for the interpreter to record. This is used by the frame code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // to correct the sender code to match up with the stack pointer when the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // thread left the compiled code. In addition it allows the interpreter
22834
3e2df6a4a28c 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
goetz
parents: 22832
diff changeset
   417
  // to remove the space the c2i adapter allocated to do its argument conversion.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  // Although a c2i blob will always run interpreted even if compiled code is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  // present if we see that compiled code is present the compiled call site
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // will be patched/re-resolved so that later calls will run compiled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22247
diff changeset
   423
  // Additionally a c2i blob need to have a unverified entry because it can be reached
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // in situations where the call site is an inlined cache site and may go megamorphic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // A i2c adapter is simpler than the c2i adapter. This is because it is assumed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // that the interpreter before it does any call dispatch will record the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  // stack pointer in the interpreter frame. On return it will restore the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // pointer as needed. This means the i2c adapter code doesn't need any special
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // handshaking path with compiled code to keep the stack walking correct.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  static AdapterHandlerEntry* generate_i2c2i_adapters(MacroAssembler *_masm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
                                                      int total_args_passed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
                                                      int max_arg,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
                                                      const BasicType *sig_bt,
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   436
                                                      const VMRegPair *regs,
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   437
                                                      AdapterFingerPrint* fingerprint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   439
  static void gen_i2c_adapter(MacroAssembler *_masm,
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   440
                              int total_args_passed,
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   441
                              int comp_args_on_stack,
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   442
                              const BasicType *sig_bt,
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   443
                              const VMRegPair *regs);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   444
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // OSR support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // OSR_migration_begin will extract the jvm state from an interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // frame (locals, monitors) and store the data in a piece of C heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // storage. This then allows the interpreter frame to be removed from the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // stack and the OSR nmethod to be called. That method is called with a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // pointer to the C heap storage. This pointer is the return value from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // OSR_migration_begin.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   454
  static intptr_t* OSR_migration_begin(JavaThread *thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // OSR_migration_end is a trivial routine. It is called after the compiled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  // method has extracted the jvm state from the C heap that OSR_migration_begin
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  // created. It's entire job is to simply free this storage.
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   459
  static void OSR_migration_end(intptr_t* buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  // Convert a sig into a calling convention register layout
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  // and find interesting things about it.
17872
2c49e72dcf08 8009981: nashorn tests fail with -XX:+VerifyStack
roland
parents: 15482
diff changeset
   463
  static VMRegPair* find_callee_arguments(Symbol* sig, bool has_receiver, bool has_appendix, int *arg_size);
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   464
  static VMReg name_for_receiver();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  // "Top of Stack" slots that may be unused by the calling convention but must
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // otherwise be preserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  // On Intel these are not necessary and the value can be zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  // On Sparc this describes the words reserved for storing a register window
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // when an interrupt occurs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  static uint out_preserve_stack_slots();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
   473
  // Is vector's size (in bytes) bigger than a size saved by default?
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
   474
  // For example, on x86 16 bytes XMM registers are saved by default.
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
   475
  static bool is_wide_vector(int size);
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13881
diff changeset
   476
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  // Save and restore a native result
25069
c937c5e883c5 8047156: cleanup more non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24462
diff changeset
   478
  static void    save_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots);
c937c5e883c5 8047156: cleanup more non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24462
diff changeset
   479
  static void restore_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // Generate a native wrapper for a given method.  The method takes arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  // in the Java compiled code convention, marshals them to the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  // convention (handlizes oops, etc), transitions to native, makes the call,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  // returns to java state (possibly blocking), unhandlizes any result and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  // returns.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   486
  //
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   487
  // The wrapper may contain special-case code if the given method
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   488
  // is a JNI critical method, or a compiled method handle adapter,
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   489
  // such as _invokeBasic, _linkToVirtual, etc.
13881
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   490
  static nmethod* generate_native_wrapper(MacroAssembler* masm,
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33160
diff changeset
   491
                                          const methodHandle& method,
8872
36680c58660e 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 8076
diff changeset
   492
                                          int compile_id,
13881
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   493
                                          BasicType* sig_bt,
a326d528f3e1 7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents: 13728
diff changeset
   494
                                          VMRegPair* regs,
25069
c937c5e883c5 8047156: cleanup more non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 24462
diff changeset
   495
                                          BasicType ret_type);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10517
diff changeset
   497
  // Block before entering a JNI critical method
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10517
diff changeset
   498
  static void block_for_jni_critical(JavaThread* thread);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10517
diff changeset
   499
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  // A compiled caller has just called the interpreter, but compiled code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  // exists.  Patch the caller so he no longer calls into the interpreter.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   502
  static void fixup_callers_callsite(Method* moop, address ret_pc);
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   503
  static bool should_fixup_call_destination(address destination, address entry_point, address caller_pc, Method* moop, CodeBlob* cb);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Slow-path Locking and Unlocking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  static void complete_monitor_locking_C(oopDesc* obj, BasicLock* lock, JavaThread* thread);
30244
d4e471395ff5 8073165: Contended Locking fast exit bucket
dcubed
parents: 28947
diff changeset
   507
  static void complete_monitor_unlocking_C(oopDesc* obj, BasicLock* lock, JavaThread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  // Resolving of calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  static address resolve_static_call_C     (JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  static address resolve_virtual_call_C    (JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  static address resolve_opt_virtual_call_C(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // arraycopy, the non-leaf version.  (See StubRoutines for all the leaf calls.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  static void slow_arraycopy_C(oopDesc* src,  jint src_pos,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
                               oopDesc* dest, jint dest_pos,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
                               jint length, JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // handle ic miss with caller being compiled code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // wrong method handling (inline cache misses, zombie methods)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  static address handle_wrong_method(JavaThread* thread);
21726
3533814ab107 8028319: ConflictingDefaultsTest.testReabstract spins when running with -mode invoke and -Xcomp
morris
parents: 17872
diff changeset
   522
  static address handle_wrong_method_abstract(JavaThread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  static address handle_wrong_method_ic_miss(JavaThread* thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // Collect and print inline cache miss statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  enum { maxICmiss_count = 100 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  static int     _ICmiss_index;                  // length of IC miss histogram
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  static int     _ICmiss_count[maxICmiss_count]; // miss counts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  static address _ICmiss_at[maxICmiss_count];    // miss addresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  static void trace_ic_miss(address at);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  static int _throw_null_ctr;                    // throwing a null-pointer exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  static int _ic_miss_ctr;                       // total # of IC misses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  static int _wrong_method_ctr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  static int _resolve_static_ctr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  static int _resolve_virtual_ctr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  static int _resolve_opt_virtual_ctr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  static int _implicit_null_throws;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  static int _implicit_div0_throws;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  static int _jbyte_array_copy_ctr;        // Slow-path byte array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  static int _jshort_array_copy_ctr;       // Slow-path short array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  static int _jint_array_copy_ctr;         // Slow-path int array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  static int _jlong_array_copy_ctr;        // Slow-path long array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  static int _oop_array_copy_ctr;          // Slow-path oop array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  static int _checkcast_array_copy_ctr;    // Slow-path oop array copy, with cast
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  static int _unsafe_array_copy_ctr;       // Slow-path includes alignment checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  static int _generic_array_copy_ctr;      // Slow-path includes type decoding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  static int _slow_array_copy_ctr;         // Slow-path failed out to a method call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  static int _new_instance_ctr;            // 'new' object requires GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  static int _new_array_ctr;               // 'new' array requires GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  static int _multi1_ctr, _multi2_ctr, _multi3_ctr, _multi4_ctr, _multi5_ctr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  static int _find_handler_ctr;            // find exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  static int _rethrow_ctr;                 // rethrow exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  static int _mon_enter_stub_ctr;          // monitor enter stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  static int _mon_exit_stub_ctr;           // monitor exit stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  static int _mon_enter_ctr;               // monitor enter slow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  static int _mon_exit_ctr;                // monitor exit slow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  static int _partial_subtype_ctr;         // SubRoutines::partial_subtype_check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // Statistics code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // stats for "normal" compiled calls (non-interface)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  static int     _nof_normal_calls;              // total # of calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  static int     _nof_optimized_calls;           // total # of statically-bound calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  static int     _nof_inlined_calls;             // total # of inlined normal calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  static int     _nof_static_calls;              // total # of calls to static methods or super methods (invokespecial)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  static int     _nof_inlined_static_calls;      // total # of inlined static calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  // stats for compiled interface calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  static int     _nof_interface_calls;           // total # of compiled calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  static int     _nof_optimized_interface_calls; // total # of statically-bound interface calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  static int     _nof_inlined_interface_calls;   // total # of inlined interface calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  static int     _nof_megamorphic_interface_calls;// total # of megamorphic interface calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  // stats for runtime exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  static int     _nof_removable_exceptions;      // total # of exceptions that could be replaced by branches due to inlining
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
 public: // for compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  static address nof_normal_calls_addr()                { return (address)&_nof_normal_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  static address nof_optimized_calls_addr()             { return (address)&_nof_optimized_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  static address nof_inlined_calls_addr()               { return (address)&_nof_inlined_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  static address nof_static_calls_addr()                { return (address)&_nof_static_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  static address nof_inlined_static_calls_addr()        { return (address)&_nof_inlined_static_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  static address nof_interface_calls_addr()             { return (address)&_nof_interface_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  static address nof_optimized_interface_calls_addr()   { return (address)&_nof_optimized_interface_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  static address nof_inlined_interface_calls_addr()     { return (address)&_nof_inlined_interface_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  static address nof_megamorphic_interface_calls_addr() { return (address)&_nof_megamorphic_interface_calls; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  static void print_call_statistics(int comp_total);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  static void print_statistics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  static void print_ic_miss_histogram();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
// ---------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
// Implementation of AdapterHandlerLibrary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
// This library manages argument marshaling adapters and native wrappers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
// There are 2 flavors of adapters: I2C and C2I.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
//
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   605
// The I2C flavor takes a stock interpreted call setup, marshals the
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   606
// arguments for a Java-compiled call, and jumps to Rmethod-> code()->
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   607
// code_begin().  It is broken to call it without an nmethod assigned.
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   608
// The usual behavior is to lift any register arguments up out of the
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22247
diff changeset
   609
// stack and possibly re-pack the extra arguments to be contiguous.
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   610
// I2C adapters will save what the interpreter's stack pointer will be
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   611
// after arguments are popped, then adjust the interpreter's frame
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   612
// size to force alignment and possibly to repack the arguments.
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   613
// After re-packing, it jumps to the compiled code start.  There are
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   614
// no safepoints in this adapter code and a GC cannot happen while
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   615
// marshaling is in progress.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
// The C2I flavor takes a stock compiled call setup plus the target method in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
// Rmethod, marshals the arguments for an interpreted call and jumps to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
// Rmethod->_i2i_entry.  On entry, the interpreted frame has not yet been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
// setup.  Compiled frames are fixed-size and the args are likely not in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
// right place.  Hence all the args will likely be copied into the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
// interpreter's frame, forcing that frame to grow.  The compiled frame's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
// outgoing stack args will be dead after the copy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
// Native wrappers, like adapters, marshal arguments.  Unlike adapters they
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22247
diff changeset
   626
// also perform an official frame push & pop.  They have a call to the native
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
// routine in their middles and end in a return (instead of ending in a jump).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
// The native wrappers are stored in real nmethods instead of the BufferBlobs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
// used by the adapters.  The code generation happens here because it's very
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
// similar to what the adapters have to do.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11637
diff changeset
   632
class AdapterHandlerEntry : public BasicHashtableEntry<mtCode> {
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   633
  friend class AdapterHandlerTable;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   634
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
 private:
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   636
  AdapterFingerPrint* _fingerprint;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  address _i2c_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  address _c2i_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  address _c2i_unverified_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   641
#ifdef ASSERT
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   642
  // Captures code and signature used to generate this adapter when
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22247
diff changeset
   643
  // verifying adapter equivalence.
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   644
  unsigned char* _saved_code;
22209
25c1e0025b51 8026478: -XX:+VerifyAdapterSharing is broken
anoll
parents: 21726
diff changeset
   645
  int            _saved_code_length;
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   646
#endif
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   647
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   648
  void init(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) {
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   649
    _fingerprint = fingerprint;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   650
    _i2c_entry = i2c_entry;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   651
    _c2i_entry = c2i_entry;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   652
    _c2i_unverified_entry = c2i_unverified_entry;
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   653
#ifdef ASSERT
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   654
    _saved_code = NULL;
22209
25c1e0025b51 8026478: -XX:+VerifyAdapterSharing is broken
anoll
parents: 21726
diff changeset
   655
    _saved_code_length = 0;
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   656
#endif
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   657
  }
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   658
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   659
  void deallocate();
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   660
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   661
  // should never be used
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   662
  AdapterHandlerEntry();
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   663
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
 public:
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   665
  address get_i2c_entry()            const { return _i2c_entry; }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   666
  address get_c2i_entry()            const { return _c2i_entry; }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   667
  address get_c2i_unverified_entry() const { return _c2i_unverified_entry; }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   668
  address base_address();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  void relocate(address new_base);
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   670
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   671
  AdapterFingerPrint* fingerprint() const { return _fingerprint; }
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   672
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   673
  AdapterHandlerEntry* next() {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11637
diff changeset
   674
    return (AdapterHandlerEntry*)BasicHashtableEntry<mtCode>::next();
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   675
  }
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   676
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   677
#ifdef ASSERT
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   678
  // Used to verify that code generated for shared adapters is equivalent
22209
25c1e0025b51 8026478: -XX:+VerifyAdapterSharing is broken
anoll
parents: 21726
diff changeset
   679
  void save_code   (unsigned char* code, int length);
25c1e0025b51 8026478: -XX:+VerifyAdapterSharing is broken
anoll
parents: 21726
diff changeset
   680
  bool compare_code(unsigned char* code, int length);
4755
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   681
#endif
eee57ea6d910 6921922: fix for 6911204 breaks tagged stack interpreter
never
parents: 4735
diff changeset
   682
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   683
  //virtual void print_on(outputStream* st) const;  DO NOT USE
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13195
diff changeset
   684
  void print_adapter_on(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   687
class CDSAdapterHandlerEntry: public AdapterHandlerEntry {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   688
  address               _c2i_entry_trampoline;   // allocated from shared spaces "MC" region
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   689
  AdapterHandlerEntry** _adapter_trampoline;     // allocated from shared spaces "MD" region
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   690
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   691
public:
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   692
  address get_c2i_entry_trampoline()             const { return _c2i_entry_trampoline; }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   693
  AdapterHandlerEntry** get_adapter_trampoline() const { return _adapter_trampoline; }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   694
  void init() NOT_CDS_RETURN;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   695
};
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   696
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   697
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
class AdapterHandlerLibrary: public AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
 private:
2732
3ab85419f523 6834177: Running jsynprog on Solaris Nevada can cause JVM crash
kvn
parents: 2534
diff changeset
   700
  static BufferBlob* _buffer; // the temporary code buffer in CodeCache
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   701
  static AdapterHandlerTable* _adapters;
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   702
  static AdapterHandlerEntry* _abstract_method_handler;
2732
3ab85419f523 6834177: Running jsynprog on Solaris Nevada can cause JVM crash
kvn
parents: 2534
diff changeset
   703
  static BufferBlob* buffer_blob();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  static void initialize();
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37179
diff changeset
   705
  static AdapterHandlerEntry* get_adapter0(const methodHandle& method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
 public:
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   708
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   709
  static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint,
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   710
                                        address i2c_entry, address c2i_entry, address c2i_unverified_entry);
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33160
diff changeset
   711
  static void create_native_wrapper(const methodHandle& method);
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33160
diff changeset
   712
  static AdapterHandlerEntry* get_adapter(const methodHandle& method);
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   713
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   714
  static void print_handler(const CodeBlob* b) { print_handler_on(tty, b); }
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   715
  static void print_handler_on(outputStream* st, const CodeBlob* b);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31583
diff changeset
   716
  static bool contains(const CodeBlob* b);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
#ifndef PRODUCT
4735
3d4e4ec0df67 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 4567
diff changeset
   718
  static void print_statistics();
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   719
#endif // PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
   722
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6965
diff changeset
   723
#endif // SHARE_VM_RUNTIME_SHAREDRUNTIME_HPP