hotspot/src/share/vm/oops/method.hpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 36350 29d8bb1668f5
child 37449 1b4042cde136
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
/*
35898
ddc274f0052f 8145628: hotspot metadata classes shouldn't use HeapWordSize or heap related macros like align_object_size
coleenp
parents: 35495
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: 5420
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    25
#ifndef SHARE_VM_OOPS_METHODOOP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    26
#define SHARE_VM_OOPS_METHODOOP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    28
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    29
#include "code/compressedStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    30
#include "compiler/oopMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    31
#include "interpreter/invocationCounter.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    32
#include "oops/annotations.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    33
#include "oops/constantPool.hpp"
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
    34
#include "oops/methodCounters.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    35
#include "oops/instanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    36
#include "oops/oop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    37
#include "oops/typeArrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    38
#include "utilities/accessFlags.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    39
#include "utilities/growableArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
    40
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 20710
diff changeset
    41
// A Method represents a Java method.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    43
// Note that most applications load thousands of methods, so keeping the size of this
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    44
// class small has a big impact on footprint.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    46
// Note that native_function and signature_handler have to be at fixed offsets
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    47
// (required by the interpreter)
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    48
//
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    49
//  Method embedded field layout (after declared fields):
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    50
//   [EMBEDDED native_function       (present only if native) ]
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
    51
//   [EMBEDDED signature_handler     (present only if native) ]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class CheckedExceptionElement;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class LocalVariableTableElement;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class AdapterHandlerEntry;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    56
class MethodData;
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
    57
class MethodCounters;
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
    58
class ConstMethod;
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
    59
class InlineTableSizes;
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15110
diff changeset
    60
class KlassSizeStats;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    62
class Method : public Metadata {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
 friend class VMStructs;
35123
b0b89d83bcf5 8134994: use separate VMStructs databases for SA and JVMCI
twisti
parents: 34185
diff changeset
    64
 friend class JVMCIVMStructs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
 private:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    66
  ConstMethod*      _constMethod;                // Method read-only data.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
    67
  MethodData*       _method_data;
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
    68
  MethodCounters*   _method_counters;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  AccessFlags       _access_flags;               // Access flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  int               _vtable_index;               // vtable index of this method (see VtableIndexFlag)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
                                                 // note: can have vtables with >2**16 elements (because of inheritance)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
#ifdef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  int               _result_index;               // C++ interpreter needs for converting results to/from stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#endif
32820
ec181adbf3b1 8135085: Change Method::_intrinsic_id from u1 to u2
minqi
parents: 31790
diff changeset
    75
  u2                _intrinsic_id;               // vmSymbols::intrinsic_id (0 == _none)
23219
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
    76
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
    77
  // Flags
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
    78
  enum Flags {
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    79
    _jfr_towrite           = 1 << 0,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    80
    _caller_sensitive      = 1 << 1,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    81
    _force_inline          = 1 << 2,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    82
    _dont_inline           = 1 << 3,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    83
    _hidden                = 1 << 4,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    84
    _has_injected_profile  = 1 << 5,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    85
    _running_emcp          = 1 << 6,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    86
    _intrinsic_candidate   = 1 << 7,
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    87
    _reserved_stack_access = 1 << 8
23219
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
    88
  };
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
    89
  mutable u2 _flags;
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
    90
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  int               _compiled_invocation_count;  // Number of nmethod invocations so far (for perf. debugging)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // Entry point for calling both from and to the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  address _i2i_entry;           // All-args-on-stack calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // Entry point for calling from compiled code, to compiled code if it exists
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // or else the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  volatile address _from_compiled_entry;        // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // The entry point for calling both from and to compiled code is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // "_code->entry_point()".  Because of tiered compilation and de-opt, this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  // field can come and go.  It can transition from NULL to not-null at any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // time (whenever a compile completes).  It can transition from not-null to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  // NULL only at safepoints (because of a de-opt).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  nmethod* volatile _code;                       // Points to the corresponding piece of native code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  volatile address           _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   107
  // Constructor
33209
43d7a2139756 8135284: Remove Method::_method_size field
minqi
parents: 32820
diff changeset
   108
  Method(ConstMethod* xconst, AccessFlags access_flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
 public:
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   110
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   111
  static Method* allocate(ClassLoaderData* loader_data,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   112
                          int byte_code_size,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   113
                          AccessFlags access_flags,
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   114
                          InlineTableSizes* sizes,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   115
                          ConstMethod::MethodType method_type,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   116
                          TRAPS);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   117
14579
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14391
diff changeset
   118
  // CDS and vtbl checking can create an empty Method to get vtbl pointer.
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14391
diff changeset
   119
  Method(){}
13736
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   120
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   121
  // The Method vtable is restored by this call when the Method is in the
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   122
  // shared archive.  See patch_klass_vtables() in metaspaceShared.cpp for
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   123
  // all the gory details.  SA, dtrace and pstack helpers distinguish metadata
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   124
  // by their vtable.
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   125
  void restore_vtable() { guarantee(is_method(), "vtable restored by this call"); }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   126
  bool is_method() const volatile { return true; }
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 670
diff changeset
   127
23872
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
   128
  void restore_unshareable_info(TRAPS);
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
   129
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // accessors for instance variables
13736
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
   131
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   132
  ConstMethod* constMethod() const             { return _constMethod; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   133
  void set_constMethod(ConstMethod* xconst)    { _constMethod = xconst; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  static address make_adapters(methodHandle mh, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  volatile address from_compiled_entry() const   { return (address)OrderAccess::load_ptr_acquire(&_from_compiled_entry); }
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   138
  volatile address from_compiled_entry_no_trampoline() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  volatile address from_interpreted_entry() const{ return (address)OrderAccess::load_ptr_acquire(&_from_interpreted_entry); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // access flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  AccessFlags access_flags() const               { return _access_flags;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  void set_access_flags(AccessFlags flags)       { _access_flags = flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // name
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   146
  Symbol* name() const                           { return constants()->symbol_at(name_index()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  int name_index() const                         { return constMethod()->name_index();         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  void set_name_index(int index)                 { constMethod()->set_name_index(index);       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // signature
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   151
  Symbol* signature() const                      { return constants()->symbol_at(signature_index()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  int signature_index() const                    { return constMethod()->signature_index();         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  void set_signature_index(int index)            { constMethod()->set_signature_index(index);       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // generics support
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   156
  Symbol* generic_signature() const              { int idx = generic_signature_index(); return ((idx != 0) ? constants()->symbol_at(idx) : (Symbol*)NULL); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  int generic_signature_index() const            { return constMethod()->generic_signature_index(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  void set_generic_signature_index(int index)    { constMethod()->set_generic_signature_index(index); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // annotations support
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   161
  AnnotationArray* annotations() const           {
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   162
    return constMethod()->method_annotations();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   163
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   164
  AnnotationArray* parameter_annotations() const {
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   165
    return constMethod()->parameter_annotations();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   166
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   167
  AnnotationArray* annotation_default() const    {
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   168
    return constMethod()->default_annotations();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   169
  }
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   170
  AnnotationArray* type_annotations() const      {
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   171
    return constMethod()->type_annotations();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
   172
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
#ifdef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  void set_result_index(BasicType type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  int  result_index()                            { return _result_index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // Helper routine: get klass name + "." + method name + signature as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // C string, for the purpose of providing more useful NoSuchMethodErrors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // and fatal error handling. The string is allocated in resource
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // area if a buffer is not provided by the caller.
12959
4d33f9be7e87 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 11637
diff changeset
   183
  char* name_and_sig_as_C_string() const;
4d33f9be7e87 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 11637
diff changeset
   184
  char* name_and_sig_as_C_string(char* buf, int size) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   186
  // Static routine in the situations we don't have a Method*
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   187
  static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   188
  static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   190
  Bytecodes::Code java_code_at(int bci) const {
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   191
    return Bytecodes::java_code_at(this, bcp_from(bci));
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   192
  }
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   193
  Bytecodes::Code code_at(int bci) const {
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   194
    return Bytecodes::code_at(this, bcp_from(bci));
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   195
  }
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   196
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // JVMTI breakpoints
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   198
  Bytecodes::Code orig_bytecode_at(int bci) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  void        set_orig_bytecode_at(int bci, Bytecodes::Code code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  void set_breakpoint(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  void clear_breakpoint(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  void clear_all_breakpoints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Tracking number of breakpoints, for fullspeed debugging.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Only mutated by VM thread.
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   205
  u2   number_of_breakpoints()             const {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   206
    MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   207
    if (mcs == NULL) {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   208
      return 0;
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   209
    } else {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   210
      return mcs->number_of_breakpoints();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   211
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   212
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   213
  void incr_number_of_breakpoints(TRAPS)         {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   214
    MethodCounters* mcs = get_method_counters(CHECK);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   215
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   216
      mcs->incr_number_of_breakpoints();
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   217
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   218
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   219
  void decr_number_of_breakpoints(TRAPS)         {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   220
    MethodCounters* mcs = get_method_counters(CHECK);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   221
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   222
      mcs->decr_number_of_breakpoints();
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   223
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   224
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  // Initialization only
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   226
  void clear_number_of_breakpoints()             {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   227
    MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   228
    if (mcs != NULL) {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   229
      mcs->clear_number_of_breakpoints();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   230
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   231
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   233
  // index into InstanceKlass methods() array
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 10008
diff changeset
   234
  // note: also used by jfr
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  u2 method_idnum() const           { return constMethod()->method_idnum(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  void set_method_idnum(u2 idnum)   { constMethod()->set_method_idnum(idnum); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
29316
5287df8a8972 8046246: the constantPoolCacheOopDesc::adjust_method_entries() used in RedefineClasses does not scale
sspitsyn
parents: 27643
diff changeset
   238
  u2 orig_method_idnum() const           { return constMethod()->orig_method_idnum(); }
5287df8a8972 8046246: the constantPoolCacheOopDesc::adjust_method_entries() used in RedefineClasses does not scale
sspitsyn
parents: 27643
diff changeset
   239
  void set_orig_method_idnum(u2 idnum)   { constMethod()->set_orig_method_idnum(idnum); }
5287df8a8972 8046246: the constantPoolCacheOopDesc::adjust_method_entries() used in RedefineClasses does not scale
sspitsyn
parents: 27643
diff changeset
   240
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // code size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  int code_size() const                  { return constMethod()->code_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
33209
43d7a2139756 8135284: Remove Method::_method_size field
minqi
parents: 32820
diff changeset
   244
  // method size in words
43d7a2139756 8135284: Remove Method::_method_size field
minqi
parents: 32820
diff changeset
   245
  int method_size() const                { return sizeof(Method)/wordSize + is_native() ? 2 : 0; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   247
  // constant pool for Klass* holding this method
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   248
  ConstantPool* constants() const              { return constMethod()->constants(); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   249
  void set_constants(ConstantPool* c)          { constMethod()->set_constants(c); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // max stack
13396
1b2b5f740ee0 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 13391
diff changeset
   252
  // return original max stack size for method verification
14586
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14391
diff changeset
   253
  int  verifier_max_stack() const                { return constMethod()->max_stack(); }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14391
diff changeset
   254
  int           max_stack() const                { return constMethod()->max_stack() + extra_stack_entries(); }
1262473e8fc1 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 14391
diff changeset
   255
  void      set_max_stack(int size)              {        constMethod()->set_max_stack(size); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // max locals
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14587
diff changeset
   258
  int  max_locals() const                        { return constMethod()->max_locals(); }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14587
diff changeset
   259
  void set_max_locals(int size)                  { constMethod()->set_max_locals(size); }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   260
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   261
  int highest_comp_level() const;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   262
  void set_highest_comp_level(int level);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   263
  int highest_osr_comp_level() const;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   264
  void set_highest_osr_comp_level(int level);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // Count of times method was exited via exception while interpreting
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   267
  void interpreter_throwout_increment(TRAPS) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   268
    MethodCounters* mcs = get_method_counters(CHECK);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   269
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   270
      mcs->interpreter_throwout_increment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   274
  int  interpreter_throwout_count() const        {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   275
    MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   276
    if (mcs == NULL) {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   277
      return 0;
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   278
    } else {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   279
      return mcs->interpreter_throwout_count();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   280
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   281
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // size of parameters
14745
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14587
diff changeset
   284
  int  size_of_parameters() const                { return constMethod()->size_of_parameters(); }
03904dd8649b 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 14587
diff changeset
   285
  void set_size_of_parameters(int size)          { constMethod()->set_size_of_parameters(size); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  bool has_stackmap_table() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    return constMethod()->has_stackmap_table();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   291
  Array<u1>* stackmap_data() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    return constMethod()->stackmap_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   295
  void set_stackmap_data(Array<u1>* sd) {
6974
a013f1c533a5 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 6463
diff changeset
   296
    constMethod()->set_stackmap_data(sd);
a013f1c533a5 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 6463
diff changeset
   297
  }
a013f1c533a5 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 6463
diff changeset
   298
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // exception handler table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  bool has_exception_handler() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
                             { return constMethod()->has_exception_handler(); }
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   302
  int exception_table_length() const
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   303
                             { return constMethod()->exception_table_length(); }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   304
  ExceptionTableElement* exception_table_start() const
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   305
                             { return constMethod()->exception_table_start(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Finds the first entry point bci of an exception handler for an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // exception of klass ex_klass thrown at throw_bci. A value of NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // for ex_klass indicates that the exception klass is not known; in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  // this case it matches any constraint class. Returns -1 if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // exception cannot be handled in this method. The handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // constraint classes are loaded if necessary. Note that this may
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  // throw an exception if loading of the constraint classes causes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // If an exception is thrown, returns the bci of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // exception handler which caused the exception to be thrown, which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // is needed for proper retries. See, for example,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // InterpreterRuntime::exception_handler_for_exception.
15109
088b1ea04490 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 14745
diff changeset
   319
  static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // method data access
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   322
  MethodData* method_data() const              {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    return _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  }
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   325
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   326
  void set_method_data(MethodData* data)       {
22859
7b88983393b7 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 20710
diff changeset
   327
    // The store into method must be released. On platforms without
7b88983393b7 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 20710
diff changeset
   328
    // total store order (TSO) the reference may become visible before
7b88983393b7 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 20710
diff changeset
   329
    // the initialization of data otherwise.
7b88983393b7 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 20710
diff changeset
   330
    OrderAccess::release_store_ptr((volatile void *)&_method_data, data);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   333
  MethodCounters* method_counters() const {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   334
    return _method_counters;
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   335
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   336
26799
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   337
  void clear_method_counters() {
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   338
    _method_counters = NULL;
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   339
  }
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   340
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   341
  bool init_method_counters(MethodCounters* counters) {
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   342
    // Try to install a pointer to MethodCounters, return true on success.
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26558
diff changeset
   343
    return Atomic::cmpxchg_ptr(counters, (volatile void*)&_method_counters, NULL) == NULL;
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   344
  }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   345
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
   346
#ifdef TIERED
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
   347
  // We are reusing interpreter_invocation_count as a holder for the previous event count!
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
   348
  // We can do that since interpreter_invocation_count is not used in tiered.
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   349
  int prev_event_count() const                   {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   350
    if (method_counters() == NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   351
      return 0;
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   352
    } else {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   353
      return method_counters()->interpreter_invocation_count();
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   354
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   355
  }
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   356
  void set_prev_event_count(int count) {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   357
    MethodCounters* mcs = method_counters();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   358
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   359
      mcs->set_interpreter_invocation_count(count);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   360
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   361
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   362
  jlong prev_time() const                        {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   363
    MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   364
    return mcs == NULL ? 0 : mcs->prev_time();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   365
  }
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   366
  void set_prev_time(jlong time) {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   367
    MethodCounters* mcs = method_counters();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   368
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   369
      mcs->set_prev_time(time);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   370
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   371
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   372
  float rate() const                             {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   373
    MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   374
    return mcs == NULL ? 0 : mcs->rate();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   375
  }
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   376
  void set_rate(float rate) {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   377
    MethodCounters* mcs = method_counters();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   378
    if (mcs != NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   379
      mcs->set_rate(rate);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   380
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   381
  }
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
   382
#endif
24442
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   383
  int nmethod_age() const {
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   384
    if (method_counters() == NULL) {
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   385
      return INT_MAX;
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   386
    } else {
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   387
      return method_counters()->nmethod_age();
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   388
    }
4d4ae31dea26 8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents: 24322
diff changeset
   389
  }
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 8313
diff changeset
   390
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   391
  int invocation_count();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   392
  int backedge_count();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   393
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   394
  bool was_executed_more_than(int n);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   395
  bool was_never_executed()                      { return !was_executed_more_than(0); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33230
diff changeset
   397
  static void build_interpreter_method_data(const methodHandle& method, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   399
  static MethodCounters* build_method_counters(Method* m, TRAPS);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   400
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   401
  int interpreter_invocation_count() {
24443
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   402
    if (TieredCompilation) {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   403
      return invocation_count();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   404
    } else {
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   405
      MethodCounters* mcs = method_counters();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   406
      return (mcs == NULL) ? 0 : mcs->interpreter_invocation_count();
7aaf1b306b55 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
vlivanov
parents: 24442
diff changeset
   407
    }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   408
  }
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   409
  int increment_interpreter_invocation_count(TRAPS) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   410
    if (TieredCompilation) ShouldNotReachHere();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   411
    MethodCounters* mcs = get_method_counters(CHECK_0);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   412
    return (mcs == NULL) ? 0 : mcs->increment_interpreter_invocation_count();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   413
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
#ifndef PRODUCT
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   416
  int  compiled_invocation_count() const         { return _compiled_invocation_count;  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  void set_compiled_invocation_count(int count)  { _compiled_invocation_count = count; }
23526
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23219
diff changeset
   418
#else
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23219
diff changeset
   419
  // for PrintMethodData in a product build
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23219
diff changeset
   420
  int  compiled_invocation_count() const         { return 0;  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
#endif // not PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1894
diff changeset
   423
  // Clear (non-shared space) pointers which could not be relevant
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // if this (shared) method were mapped into another JVM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  void remove_unshareable_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // nmethod/verified compiler entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  address verified_code_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  bool check_code() const;      // Not inline to avoid circular ref
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  nmethod* volatile code() const                 { assert( check_code(), "" ); return (nmethod *)OrderAccess::load_ptr_acquire(&_code); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  void clear_code();            // Clear out any compiled code
4750
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4581
diff changeset
   432
  static void set_code(methodHandle mh, nmethod* code);
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   433
  void set_adapter_entry(AdapterHandlerEntry* adapter) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   434
    constMethod()->set_adapter_entry(adapter);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   435
  }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   436
  void update_adapter_trampoline(AdapterHandlerEntry* adapter) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   437
    constMethod()->update_adapter_trampoline(adapter);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   438
  }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   439
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  address get_i2c_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  address get_c2i_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  address get_c2i_unverified_entry();
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   443
  AdapterHandlerEntry* adapter() const {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   444
    return constMethod()->adapter();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   445
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // setup entry points
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33230
diff changeset
   447
  void link_method(const methodHandle& method, TRAPS);
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   448
  // clear entry points. Used by sharing code during dump time
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   449
  void unlink_method() NOT_CDS_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // vtable index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  enum VtableIndexFlag {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    // Valid vtable indexes are non-negative (>= 0).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    // These few negative values are used as sentinels.
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   455
    itable_index_max        = -10, // first itable index, growing downward
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   456
    pending_itable_index    = -9,  // itable index will be assigned
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    invalid_vtable_index    = -4,  // distinct from any valid vtable index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    garbage_vtable_index    = -3,  // not yet linked; no vtable layout yet
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    nonvirtual_vtable_index = -2   // there is no need for vtable dispatch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    // 6330203 Note:  Do not use -1, which was overloaded with many meanings.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  DEBUG_ONLY(bool valid_vtable_index() const     { return _vtable_index >= nonvirtual_vtable_index; })
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   463
  bool has_vtable_index() const                  { return _vtable_index >= 0; }
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   464
  int  vtable_index() const                      { return _vtable_index; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  void set_vtable_index(int index)               { _vtable_index = index; }
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   466
  DEBUG_ONLY(bool valid_itable_index() const     { return _vtable_index <= pending_itable_index; })
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   467
  bool has_itable_index() const                  { return _vtable_index <= itable_index_max; }
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   468
  int  itable_index() const                      { assert(valid_itable_index(), "");
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   469
                                                   return itable_index_max - _vtable_index; }
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   470
  void set_itable_index(int index)               { _vtable_index = itable_index_max - index; assert(valid_itable_index(), ""); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  // interpreter entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  address interpreter_entry() const              { return _i2i_entry; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   475
  void set_interpreter_entry(address entry) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   476
    assert(!is_shared(), "shared method's interpreter entry should not be changed at run time");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   477
    if (_i2i_entry != entry) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   478
      _i2i_entry = entry;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   479
    }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   480
    if (_from_interpreted_entry != entry) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   481
      _from_interpreted_entry = entry;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   482
    }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 36350
diff changeset
   483
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  // native function (used for native methods only)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    native_bind_event_is_interesting = true
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  address native_function() const                { return *(native_function_addr()); }
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11480
diff changeset
   490
  address critical_native_function();
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11480
diff changeset
   491
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // Must specify a real function (not NULL).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  // Use clear_native_function() to unregister.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  void set_native_function(address function, bool post_event_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  bool has_native_function() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  void clear_native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  // signature handler (used for native methods only)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  address signature_handler() const              { return *(signature_handler_addr()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  void set_signature_handler(address handler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  // Interpreter oopmap support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  void mask_for(int bci, InterpreterOopMap* mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // operations on invocation counter
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   506
  void print_invocation_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  // byte codes
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 3824
diff changeset
   509
  void    set_code(address code)      { return constMethod()->set_code(code); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  address code_base() const           { return constMethod()->code_base(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  bool    contains(address bcp) const { return constMethod()->contains(bcp); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // prints byte codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  void print_codes() const            { print_codes_on(tty); }
23526
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23219
diff changeset
   515
  void print_codes_on(outputStream* st) const;
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23219
diff changeset
   516
  void print_codes_on(int from, int to, outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   518
  // method parameters
15744
fd58c7e770b3 8007153: Ensure that MethodParameters API works properly with RedefineClasses
emc
parents: 15601
diff changeset
   519
  bool has_method_parameters() const
fd58c7e770b3 8007153: Ensure that MethodParameters API works properly with RedefineClasses
emc
parents: 15601
diff changeset
   520
                         { return constMethod()->has_method_parameters(); }
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   521
  int method_parameters_length() const
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   522
                         { return constMethod()->method_parameters_length(); }
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   523
  MethodParametersElement* method_parameters_start() const
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   524
                          { return constMethod()->method_parameters_start(); }
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15098
diff changeset
   525
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  // checked exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  int checked_exceptions_length() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
                         { return constMethod()->checked_exceptions_length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  CheckedExceptionElement* checked_exceptions_start() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
                          { return constMethod()->checked_exceptions_start(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  // localvariable table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  bool has_localvariable_table() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
                          { return constMethod()->has_localvariable_table(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  int localvariable_table_length() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
                        { return constMethod()->localvariable_table_length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  LocalVariableTableElement* localvariable_table_start() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
                         { return constMethod()->localvariable_table_start(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  bool has_linenumber_table() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
                              { return constMethod()->has_linenumber_table(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  u_char* compressed_linenumber_table() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
                       { return constMethod()->compressed_linenumber_table(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   545
  // method holder (the Klass* holding this method)
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14385
diff changeset
   546
  InstanceKlass* method_holder() const         { return constants()->pool_holder(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   549
  Symbol* klass_name() const;                    // returns the name of the method holder
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  BasicType result_type() const;                 // type of the method result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  int result_type_index() const;                 // type index of the method result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  bool is_returning_oop() const                  { BasicType r = result_type(); return (r == T_OBJECT || r == T_ARRAY); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  bool is_returning_fp() const                   { BasicType r = result_type(); return (r == T_FLOAT || r == T_DOUBLE); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  // Checked exceptions thrown by this method (resolved to mirrors)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  objArrayHandle resolved_checked_exceptions(TRAPS) { return resolved_checked_exceptions_impl(this, THREAD); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  // Access flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  bool is_public() const                         { return access_flags().is_public();      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  bool is_private() const                        { return access_flags().is_private();     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  bool is_protected() const                      { return access_flags().is_protected();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  bool is_package_private() const                { return !is_public() && !is_private() && !is_protected(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  bool is_static() const                         { return access_flags().is_static();      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  bool is_final() const                          { return access_flags().is_final();       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  bool is_synchronized() const                   { return access_flags().is_synchronized();}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  bool is_native() const                         { return access_flags().is_native();      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  bool is_abstract() const                       { return access_flags().is_abstract();    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  bool is_strict() const                         { return access_flags().is_strict();      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  bool is_synthetic() const                      { return access_flags().is_synthetic();   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  // returns true if contains only return operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  bool is_empty_method() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  // returns true if this is a vanilla constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  bool is_vanilla_constructor() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  // checks method and its method holder
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  bool is_final_method() const;
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   579
  bool is_final_method(AccessFlags class_access_flags) const;
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20017
diff changeset
   580
  bool is_default_method() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  // true if method needs no dynamic dispatch (final and/or no vtable entry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  bool can_be_statically_bound() const;
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   584
  bool can_be_statically_bound(AccessFlags class_access_flags) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // returns true if the method has any backward branches.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  bool has_loops() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  bool compute_has_loops_flag();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  bool has_jsrs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    return access_flags().has_jsrs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  void set_has_jsrs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    _access_flags.set_has_jsrs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  // returns true if the method has any monitors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  bool has_monitors() const                      { return is_synchronized() || access_flags().has_monitor_bytecodes(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  bool has_monitor_bytecodes() const             { return access_flags().has_monitor_bytecodes(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  void set_has_monitor_bytecodes()               { _access_flags.set_has_monitor_bytecodes(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  // monitor matching. This returns a conservative estimate of whether the monitorenter/monitorexit bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  // propererly nest in the method. It might return false, even though they actually nest properly, since the info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  // has not been computed yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  bool guaranteed_monitor_matching() const       { return access_flags().is_monitor_matching(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  void set_guaranteed_monitor_matching()         { _access_flags.set_monitor_matching(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  // returns true if the method is an accessor function (setter/getter).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  bool is_accessor() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
34169
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   615
  // returns true if the method is a getter
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   616
  bool is_getter() const;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   617
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   618
  // returns true if the method is a setter
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   619
  bool is_setter() const;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   620
27643
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27478
diff changeset
   621
  // returns true if the method does nothing but return a constant of primitive type
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27478
diff changeset
   622
  bool is_constant_getter() const;
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27478
diff changeset
   623
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  // returns true if the method is an initializer (<init> or <clinit>).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  bool is_initializer() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   627
  // returns true if the method is static OR if the classfile version < 51
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   628
  bool has_valid_initializer_flags() const;
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   629
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   630
  // returns true if the method name is <clinit> and the method has
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   631
  // valid static initializer flags.
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   632
  bool is_static_initializer() const;
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8313
diff changeset
   633
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  // compiled code support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  // NOTE: code() is inherently racy as deopt can be clearing code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  // simultaneously. Use with caution.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  bool has_compiled_code() const                 { return code() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  // sizing
35898
ddc274f0052f 8145628: hotspot metadata classes shouldn't use HeapWordSize or heap related macros like align_object_size
coleenp
parents: 35495
diff changeset
   640
  static int header_size()                       { return sizeof(Method)/wordSize; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   641
  static int size(bool is_native);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   642
  int size() const                               { return method_size(); }
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15110
diff changeset
   643
#if INCLUDE_SERVICES
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15110
diff changeset
   644
  void collect_statistics(KlassSizeStats *sz) const;
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15110
diff changeset
   645
#endif
31790
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31587
diff changeset
   646
  void log_touched(TRAPS);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31587
diff changeset
   647
  static void print_touched_methods(outputStream* out);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // interpreter support
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   650
  static ByteSize const_offset()                 { return byte_offset_of(Method, _constMethod       ); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   651
  static ByteSize access_flags_offset()          { return byte_offset_of(Method, _access_flags      ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
#ifdef CC_INTERP
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   653
  static ByteSize result_index_offset()          { return byte_offset_of(Method, _result_index ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
#endif /* CC_INTERP */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   655
  static ByteSize from_compiled_offset()         { return byte_offset_of(Method, _from_compiled_entry); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   656
  static ByteSize code_offset()                  { return byte_offset_of(Method, _code); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  static ByteSize method_data_offset()           {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   658
    return byte_offset_of(Method, _method_data);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  }
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   660
  static ByteSize method_counters_offset()       {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   661
    return byte_offset_of(Method, _method_counters);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   662
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
#ifndef PRODUCT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   664
  static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
#endif // not PRODUCT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   666
  static ByteSize native_function_offset()       { return in_ByteSize(sizeof(Method));                 }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   667
  static ByteSize from_interpreted_offset()      { return byte_offset_of(Method, _from_interpreted_entry ); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   668
  static ByteSize interpreter_entry_offset()     { return byte_offset_of(Method, _i2i_entry ); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   669
  static ByteSize signature_handler_offset()     { return in_ByteSize(sizeof(Method) + wordSize);      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  // for code generation
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   672
  static int method_data_offset_in_bytes()       { return offset_of(Method, _method_data); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   673
  static int intrinsic_id_offset_in_bytes()      { return offset_of(Method, _intrinsic_id); }
32820
ec181adbf3b1 8135085: Change Method::_intrinsic_id from u1 to u2
minqi
parents: 31790
diff changeset
   674
  static int intrinsic_id_size_in_bytes()        { return sizeof(u2); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  // Static methods that are used to implement member methods where an exposed this pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  // is needed due to possible GCs
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 23219
diff changeset
   678
  static objArrayHandle resolved_checked_exceptions_impl(Method* method, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  // Returns the byte code index from the byte code pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  int     bci_from(address bcp) const;
25895
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25714
diff changeset
   682
  address bcp_from(int bci) const;
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25714
diff changeset
   683
  address bcp_from(address bcp) const;
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 24461
diff changeset
   684
  int validate_bci_from_bcp(address bcp) const;
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 24461
diff changeset
   685
  int validate_bci(int bci) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  // Returns the line number for a bci if debugging information for the method is prowided,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  // -1 is returned otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  int line_number_from_bci(int bci) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  // Reflection support
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   692
  bool is_overridden_in(Klass* k) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
16617
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 15744
diff changeset
   694
  // Stack walking support
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 15744
diff changeset
   695
  bool is_ignored_by_security_stack_walk() const;
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 15744
diff changeset
   696
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2154
diff changeset
   697
  // JSR 292 support
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   698
  bool is_method_handle_intrinsic() const;          // MethodHandles::is_signature_polymorphic_intrinsic(intrinsic_id)
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   699
  bool is_compiled_lambda_form() const;             // intrinsic_id() == vmIntrinsics::_compiledLambdaForm
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   700
  bool has_member_arg() const;                      // intrinsic_id() == vmIntrinsics::_linkToSpecial, etc.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   701
  static methodHandle make_method_handle_intrinsic(vmIntrinsics::ID iid, // _invokeBasic, _linkToVirtual
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   702
                                                   Symbol* signature, //anything at all
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   703
                                                   TRAPS);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   704
  static Klass* check_non_bcp_klass(Klass* klass);
17875
9d4aa49a1d76 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 17372
diff changeset
   705
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32820
diff changeset
   706
  enum {
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32820
diff changeset
   707
    // How many extra stack entries for invokedynamic
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32820
diff changeset
   708
    extra_stack_entries_for_jsr292 = 1
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 32820
diff changeset
   709
  };
17875
9d4aa49a1d76 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 17372
diff changeset
   710
9d4aa49a1d76 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 17372
diff changeset
   711
  // this operates only on invoke methods:
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2154
diff changeset
   712
  // presize interpreter frames for extra interpreter stack entries, if needed
17875
9d4aa49a1d76 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 17372
diff changeset
   713
  // Account for the extra appendix argument for invokehandle/invokedynamic
24322
c2978d1578e3 8036956: remove EnableInvokeDynamic flag
anoll
parents: 23872
diff changeset
   714
  static int extra_stack_entries() { return extra_stack_entries_for_jsr292; }
17875
9d4aa49a1d76 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 17372
diff changeset
   715
  static int extra_stack_words();  // = extra_stack_entries() * Interpreter::stackElementSize
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   716
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  // RedefineClasses() support:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  bool is_old() const                               { return access_flags().is_old(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  void set_is_old()                                 { _access_flags.set_is_old(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  bool is_obsolete() const                          { return access_flags().is_obsolete(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  void set_is_obsolete()                            { _access_flags.set_is_obsolete(); }
24459
ebd373039673 8042796: jvmtiRedefineClasses.cpp: guarantee(false) failed: OLD and/or OBSOLETE method(s) found
sspitsyn
parents: 24457
diff changeset
   722
  bool is_deleted() const                           { return access_flags().is_deleted(); }
ebd373039673 8042796: jvmtiRedefineClasses.cpp: guarantee(false) failed: OLD and/or OBSOLETE method(s) found
sspitsyn
parents: 24457
diff changeset
   723
  void set_is_deleted()                             { _access_flags.set_is_deleted(); }
26558
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   724
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   725
  bool is_running_emcp() const {
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   726
    // EMCP methods are old but not obsolete or deleted. Equivalent
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   727
    // Modulo Constant Pool means the method is equivalent except
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   728
    // the constant pool and instructions that access the constant
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   729
    // pool might be different.
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   730
    // If a breakpoint is set in a redefined method, its EMCP methods that are
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   731
    // still running must have a breakpoint also.
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   732
    return (_flags & _running_emcp) != 0;
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   733
  }
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   734
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   735
  void set_running_emcp(bool x) {
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   736
    _flags = x ? (_flags | _running_emcp) : (_flags & ~_running_emcp);
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   737
  }
b7df27df6384 8055008: Clean up code that saves the previous versions of redefined classes
coleenp
parents: 25895
diff changeset
   738
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   739
  bool on_stack() const                             { return access_flags().on_stack(); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   740
  void set_on_stack(const bool value);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   741
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   742
  // see the definition in Method*.cpp for the gory details
221
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
   743
  bool should_not_be_cached() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  // JVMTI Native method prefixing support:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  bool is_prefixed_native() const                   { return access_flags().is_prefixed_native(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  void set_is_prefixed_native()                     { _access_flags.set_is_prefixed_native(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  // Rewriting support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  static methodHandle clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
                                          u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   753
  // jmethodID handling
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   754
  // Because the useful life-span of a jmethodID cannot be determined,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   755
  // once created they are never reclaimed.  The methods to which they refer,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   756
  // however, can be GC'ed away if the class is unloaded or if the method is
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   757
  // made obsolete or deleted -- in these cases, the jmethodID
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   758
  // refers to NULL (as is the case for any weak reference).
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   759
  static jmethodID make_jmethod_id(ClassLoaderData* loader_data, Method* mh);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   760
  static void destroy_jmethod_id(ClassLoaderData* loader_data, jmethodID mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   761
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27434
diff changeset
   762
  // Ensure there is enough capacity in the internal tracking data
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27434
diff changeset
   763
  // structures to hold the number of jmethodIDs you plan to generate.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27434
diff changeset
   764
  // This saves substantial time doing allocations.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27434
diff changeset
   765
  static void ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27434
diff changeset
   766
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   767
  // Use resolve_jmethod_id() in situations where the caller is expected
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   768
  // to provide a valid jmethodID; the only sanity checks are in asserts;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   769
  // result guaranteed not to be NULL.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   770
  inline static Method* resolve_jmethod_id(jmethodID mid) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   771
    assert(mid != NULL, "JNI method id should not be null");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   772
    return *((Method**)mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   773
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   774
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   775
  // Use checked_resolve_jmethod_id() in situations where the caller
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   776
  // should provide a valid jmethodID, but might not. NULL is returned
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   777
  // when the jmethodID does not refer to a valid method.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   778
  static Method* checked_resolve_jmethod_id(jmethodID mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   779
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   780
  static void change_method_associated_with_jmethod_id(jmethodID old_jmid_ptr, Method* new_method);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   781
  static bool is_method_id(jmethodID mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   782
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   783
  // Clear methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   784
  static void clear_jmethod_ids(ClassLoaderData* loader_data);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   785
  static void print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) PRODUCT_RETURN;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   786
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  // Get this method's jmethodID -- allocate if it doesn't exist
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  jmethodID jmethod_id()                            { methodHandle this_h(this);
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14385
diff changeset
   789
                                                      return InstanceKlass::get_jmethod_id(method_holder(), this_h); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  // Lookup the jmethodID for this method.  Return NULL if not found.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  // NOTE that this function can be called from a signal handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  // (see AsyncGetCallTrace support for Forte Analyzer) and this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  // needs to be async-safe. No allocation should be done and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  // so handles are not used to avoid deadlock.
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14385
diff changeset
   796
  jmethodID find_jmethod_id_or_null()               { return method_holder()->jmethod_id_or_null(this); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  // Support for inlining of intrinsic methods
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
   799
  vmIntrinsics::ID intrinsic_id() const          { return (vmIntrinsics::ID) _intrinsic_id;           }
32820
ec181adbf3b1 8135085: Change Method::_intrinsic_id from u1 to u2
minqi
parents: 31790
diff changeset
   800
  void     set_intrinsic_id(vmIntrinsics::ID id) {                           _intrinsic_id = (u2) id; }
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
   801
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
   802
  // Helper routines for intrinsic_id() and vmIntrinsics::method().
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
   803
  void init_intrinsic_id();     // updates from _none if a match
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 34185
diff changeset
   804
  static vmSymbols::SID klass_id_for_intrinsics(const Klass* holder);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 34185
diff changeset
   806
  bool jfr_towrite() const {
23219
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   807
    return (_flags & _jfr_towrite) != 0;
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   808
  }
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 34185
diff changeset
   809
  void set_jfr_towrite(bool x) const {
23219
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   810
    _flags = x ? (_flags | _jfr_towrite) : (_flags & ~_jfr_towrite);
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   811
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   812
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   813
  bool caller_sensitive() {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   814
    return (_flags & _caller_sensitive) != 0;
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   815
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   816
  void set_caller_sensitive(bool x) {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   817
    _flags = x ? (_flags | _caller_sensitive) : (_flags & ~_caller_sensitive);
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   818
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   819
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   820
  bool force_inline() {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   821
    return (_flags & _force_inline) != 0;
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   822
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   823
  void set_force_inline(bool x) {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   824
    _flags = x ? (_flags | _force_inline) : (_flags & ~_force_inline);
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   825
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   826
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   827
  bool dont_inline() {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   828
    return (_flags & _dont_inline) != 0;
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   829
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   830
  void set_dont_inline(bool x) {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   831
    _flags = x ? (_flags | _dont_inline) : (_flags & ~_dont_inline);
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   832
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   833
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   834
  bool is_hidden() {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   835
    return (_flags & _hidden) != 0;
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   836
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   837
  void set_hidden(bool x) {
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   838
    _flags = x ? (_flags | _hidden) : (_flags & ~_hidden);
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   839
  }
69e72eaf9f51 8037043: put Method flag bits in predictable positions
twisti
parents: 22876
diff changeset
   840
31587
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   841
  bool intrinsic_candidate() {
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   842
    return (_flags & _intrinsic_candidate) != 0;
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   843
  }
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   844
  void set_intrinsic_candidate(bool x) {
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   845
    _flags = x ? (_flags | _intrinsic_candidate) : (_flags & ~_intrinsic_candidate);
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   846
  }
e48945b7849c 8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents: 31228
diff changeset
   847
31228
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   848
  bool has_injected_profile() {
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   849
    return (_flags & _has_injected_profile) != 0;
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   850
  }
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   851
  void set_has_injected_profile(bool x) {
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   852
    _flags = x ? (_flags | _has_injected_profile) : (_flags & ~_has_injected_profile);
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   853
  }
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 29316
diff changeset
   854
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   855
  bool has_reserved_stack_access() {
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   856
    return (_flags & _reserved_stack_access) != 0;
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   857
  }
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   858
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   859
  void set_has_reserved_stack_access(bool x) {
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   860
    _flags = x ? (_flags | _reserved_stack_access) : (_flags & ~_reserved_stack_access);
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   861
  }
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34666
diff changeset
   862
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   863
  ConstMethod::MethodType method_type() const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   864
      return _constMethod->method_type();
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   865
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13891
diff changeset
   866
  bool is_overpass() const { return method_type() == ConstMethod::OVERPASS; }
13291
9de3b1387cb8 6711908: JVM needs direct access to some annotations
jrose
parents: 12960
diff changeset
   867
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  // On-stack replacement support
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   869
  bool has_osr_nmethod(int level, bool match_level) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14385
diff changeset
   870
   return method_holder()->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   871
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   872
27434
b4b185d05bb5 8061817: Whitebox.deoptimizeMethod() does not deoptimize all OSR versions of method
thartmann
parents: 26799
diff changeset
   873
  int mark_osr_nmethods() {
b4b185d05bb5 8061817: Whitebox.deoptimizeMethod() does not deoptimize all OSR versions of method
thartmann
parents: 26799
diff changeset
   874
    return method_holder()->mark_osr_nmethods(this);
b4b185d05bb5 8061817: Whitebox.deoptimizeMethod() does not deoptimize all OSR versions of method
thartmann
parents: 26799
diff changeset
   875
  }
b4b185d05bb5 8061817: Whitebox.deoptimizeMethod() does not deoptimize all OSR versions of method
thartmann
parents: 26799
diff changeset
   876
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   877
  nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14385
diff changeset
   878
    return method_holder()->lookup_osr_nmethod(this, bci, level, match_level);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   879
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  // Inline cache support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  void cleanup_inline_caches();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // Find if klass for method is loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  bool is_klass_loaded_by_klass_index(int klass_index) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  bool is_klass_loaded(int refinfo_index, bool must_be_resolved = false) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // Indicates whether compilation failed earlier for this method, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  // whether it is not compilable for another reason like having a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  // breakpoint set in it.
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   891
  bool  is_not_compilable(int comp_level = CompLevel_any) const;
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   892
  void set_not_compilable(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   893
  void set_not_compilable_quietly(int comp_level = CompLevel_all) {
4756
da88c27a9241 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 4750
diff changeset
   894
    set_not_compilable(comp_level, false);
da88c27a9241 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 4750
diff changeset
   895
  }
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   896
  bool  is_not_osr_compilable(int comp_level = CompLevel_any) const;
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   897
  void set_not_osr_compilable(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   898
  void set_not_osr_compilable_quietly(int comp_level = CompLevel_all) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   899
    set_not_osr_compilable(comp_level, false);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   900
  }
19720
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 17875
diff changeset
   901
  bool is_always_compilable() const;
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   902
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   903
 private:
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   904
  void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   905
20695
4f5a5e95090b 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 20017
diff changeset
   906
 public:
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   907
  MethodCounters* get_method_counters(TRAPS) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   908
    if (_method_counters == NULL) {
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   909
      build_method_counters(this, CHECK_AND_CLEAR_NULL);
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   910
    }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   911
    return _method_counters;
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   912
  }
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16617
diff changeset
   913
16689
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   914
  bool   is_not_c1_compilable() const         { return access_flags().is_not_c1_compilable();  }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   915
  void  set_not_c1_compilable()               {       _access_flags.set_not_c1_compilable();   }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   916
  void clear_not_c1_compilable()              {       _access_flags.clear_not_c1_compilable(); }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   917
  bool   is_not_c2_compilable() const         { return access_flags().is_not_c2_compilable();  }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   918
  void  set_not_c2_compilable()               {       _access_flags.set_not_c2_compilable();   }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   919
  void clear_not_c2_compilable()              {       _access_flags.clear_not_c2_compilable(); }
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13736
diff changeset
   920
16689
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   921
  bool    is_not_c1_osr_compilable() const    { return is_not_c1_compilable(); }  // don't waste an accessFlags bit
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   922
  void   set_not_c1_osr_compilable()          {       set_not_c1_compilable(); }  // don't waste an accessFlags bit
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   923
  void clear_not_c1_osr_compilable()          {     clear_not_c1_compilable(); }  // don't waste an accessFlags bit
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   924
  bool   is_not_c2_osr_compilable() const     { return access_flags().is_not_c2_osr_compilable();  }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   925
  void  set_not_c2_osr_compilable()           {       _access_flags.set_not_c2_osr_compilable();   }
efce070b8d42 8007288: Additional WB API for compiler's testing
iignatyev
parents: 16617
diff changeset
   926
  void clear_not_c2_osr_compilable()          {       _access_flags.clear_not_c2_osr_compilable(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  // Background compilation support
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   929
  bool queued_for_compilation() const  { return access_flags().queued_for_compilation(); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   930
  void set_queued_for_compilation()    { _access_flags.set_queued_for_compilation();     }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5547
diff changeset
   931
  void clear_queued_for_compilation()  { _access_flags.clear_queued_for_compilation();   }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  // Resolve all classes in signature, return 'true' if successful
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  static bool load_signature_classes(methodHandle m, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // Return if true if not all classes references in signature, including return type, has been loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  static bool has_unloaded_classes_in_signature(methodHandle m, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  // Printing
15591
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15450
diff changeset
   940
  void print_short_name(outputStream* st = tty); // prints as klassname::methodname; Exposed so field engineers can debug VM
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15450
diff changeset
   941
#if INCLUDE_JVMTI
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15450
diff changeset
   942
  void print_name(outputStream* st = tty); // prints as "virtual void foo(int)"; exposed for TraceRedefineClasses
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15450
diff changeset
   943
#else
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13296
diff changeset
   944
  void print_name(outputStream* st = tty)        PRODUCT_RETURN; // prints as "virtual void foo(int)"
15591
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15450
diff changeset
   945
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  // Helper routine used for method sorting
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20017
diff changeset
   948
  static void sort_methods(Array<Method*>* methods, bool idempotent = false, bool set_idnums = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   950
  // Deallocation function for redefine classes or if an error occurs
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   951
  void deallocate_contents(ClassLoaderData* loader_data);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   952
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   953
  // Printing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   954
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   955
  void print_on(outputStream* st) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   956
#endif
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   957
  void print_value_on(outputStream* st) const;
35463
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 35071
diff changeset
   958
  void print_linkage_flags(outputStream* st) PRODUCT_RETURN;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   959
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   960
  const char* internal_name() const { return "{method}"; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   961
14579
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14391
diff changeset
   962
  // Check for valid method pointer
24457
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24322
diff changeset
   963
  static bool has_method_vptr(const void* ptr);
14579
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14391
diff changeset
   964
  bool is_valid_method() const;
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14391
diff changeset
   965
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   966
  // Verify
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   967
  void verify() { verify_on(tty); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   968
  void verify_on(outputStream* st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
   969
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  // Inlined elements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  address* native_function_addr() const          { assert(is_native(), "must be native"); return (address*) (this+1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  address* signature_handler_addr() const        { return native_function_addr() + 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
// Utility class for compressing line number tables
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
class CompressedLineNumberWriteStream: public CompressedWriteStream {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  int _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  int _line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  // Constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  CompressedLineNumberWriteStream(int initial_size) : CompressedWriteStream(initial_size), _bci(0), _line(0) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  CompressedLineNumberWriteStream(u_char* buffer, int initial_size) : CompressedWriteStream(buffer, initial_size), _bci(0), _line(0) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // Write (bci, line number) pair to stream
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  void write_pair_regular(int bci_delta, int line_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  inline void write_pair_inline(int bci, int line) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    int bci_delta = bci - _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
    int line_delta = line - _line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    _bci = bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    _line = line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    // Skip (0,0) deltas - they do not add information and conflict with terminator.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
    if (bci_delta == 0 && line_delta == 0) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
    // Check if bci is 5-bit and line number 3-bit unsigned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
    if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
      // Compress into single byte.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
      jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
      // Check that value doesn't match escape character.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
      if (value != 0xFF) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
        write_byte(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
        return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    write_pair_regular(bci_delta, line_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
// Windows AMD64 + Apr 2005 PSDK with /O2 generates bad code for write_pair.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
// Disabling optimization doesn't work for methods in header files
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
// so we force it to call through the non-optimized version in the .cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
// It's gross, but it's the only way we can ensure that all callers are
8303
81a0b8663748 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 8076
diff changeset
  1016
// fixed.  _MSC_VER is defined by the windows compiler
81a0b8663748 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 8076
diff changeset
  1017
#if defined(_M_AMD64) && _MSC_VER >= 1400
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  void write_pair(int bci, int line);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  void write_pair(int bci, int line) { write_pair_inline(bci, line); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  // Write end-of-stream marker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  void write_terminator()                        { write_byte(0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
// Utility class for decompressing line number tables
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
class CompressedLineNumberReadStream: public CompressedReadStream {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  int _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  int _line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  // Constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  CompressedLineNumberReadStream(u_char* buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  // Read (bci, line number) pair from stream. Returns false at end-of-stream.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  bool read_pair();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  // Accessing bci and line number (after calling read_pair)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  int bci() const                               { return _bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  int line() const                              { return _line; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
/// Fast Breakpoints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
// If this structure gets more complicated (because bpts get numerous),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
// move it into its own header.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
// There is presently no provision for concurrent access
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
// to breakpoint lists, which is only OK for JVMTI because
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
// breakpoints are written only at safepoints, and are read
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
// concurrently only outside of safepoints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12960
diff changeset
  1055
class BreakpointInfo : public CHeapObj<mtClass> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  Bytecodes::Code  _orig_bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  int              _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  u2               _name_index;       // of method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  u2               _signature_index;  // of method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  BreakpointInfo*  _next;             // simple storage allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
 public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1065
  BreakpointInfo(Method* m, int bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  Bytecodes::Code orig_bytecode()                     { return _orig_bytecode; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  void        set_orig_bytecode(Bytecodes::Code code) { _orig_bytecode = code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  int         bci()                                   { return _bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  BreakpointInfo*          next() const               { return _next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  void                 set_next(BreakpointInfo* n)    { _next = n; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  // helps for searchers
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1076
  bool match(const Method* m, int bci) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
    return bci == _bci && match(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1080
  bool match(const Method* m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
    return _name_index == m->name_index() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
      _signature_index == m->signature_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1085
  void set(Method* method);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13396
diff changeset
  1086
  void clear(Method* method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
  1088
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1089
// Utility class for access exception handlers
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1090
class ExceptionTable : public StackObj {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1091
 private:
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1092
  ExceptionTableElement* _table;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1093
  u2  _length;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1094
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1095
 public:
17370
59a0620561fa 8003557: NPG: Klass* const k should be const Klass* k.
minqi
parents: 17002
diff changeset
  1096
  ExceptionTable(const Method* m) {
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1097
    if (m->has_exception_handler()) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1098
      _table = m->exception_table_start();
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1099
      _length = m->exception_table_length();
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1100
    } else {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1101
      _table = NULL;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1102
      _length = 0;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1103
    }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1104
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1105
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1106
  int length() const {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1107
    return _length;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1108
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1109
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1110
  u2 start_pc(int idx) const {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1111
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1112
    return _table[idx].start_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1113
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1114
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1115
  void set_start_pc(int idx, u2 value) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1116
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1117
    _table[idx].start_pc = value;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1118
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1119
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1120
  u2 end_pc(int idx) const {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1121
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1122
    return _table[idx].end_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1123
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1124
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1125
  void set_end_pc(int idx, u2 value) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1126
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1127
    _table[idx].end_pc = value;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1128
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1129
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1130
  u2 handler_pc(int idx) const {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1131
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1132
    return _table[idx].handler_pc;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1133
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1134
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1135
  void set_handler_pc(int idx, u2 value) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1136
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1137
    _table[idx].handler_pc = value;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1138
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1139
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1140
  u2 catch_type_index(int idx) const {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1141
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1142
    return _table[idx].catch_type_index;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1143
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1144
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1145
  void set_catch_type_index(int idx, u2 value) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1146
    assert(idx < _length, "out of bounds");
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1147
    _table[idx].catch_type_index = value;
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1148
  }
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1149
};
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
  1150
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6974
diff changeset
  1151
#endif // SHARE_VM_OOPS_METHODOOP_HPP