hotspot/src/share/vm/oops/method.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 37267 ad8c0e8de29f
child 37480 291ee208fb72
child 38059 86ab3f0a9f87
child 38133 78b95467b9f1
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35498
392b50de06c6 8146401: Clean up oop.hpp: add inline directives and fix header files
goetz
parents: 35463
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: 5428
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5428
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: 5428
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: 6771
diff changeset
    25
#include "precompiled.hpp"
15430
7c35f12cf1e5 8006040: NPG: on_stack processing wastes space in ConstantPool
coleenp
parents: 15110
diff changeset
    26
#include "classfile/metadataOnStackMark.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    27
#include "classfile/systemDictionary.hpp"
28374
0558e321c027 8067836: The Universe::flush_foo methods belong in CodeCache.
coleenp
parents: 27923
diff changeset
    28
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    29
#include "code/debugInfoRec.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29576
diff changeset
    30
#include "gc/shared/collectedHeap.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29576
diff changeset
    31
#include "gc/shared/gcLocker.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29576
diff changeset
    32
#include "gc/shared/generation.hpp"
37129
af29e306e50b 8151601: Cleanup locking of the Reference pending list
pliden
parents: 36350
diff changeset
    33
#include "gc/shared/referencePendingListLocker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    34
#include "interpreter/bytecodeStream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    35
#include "interpreter/bytecodeTracer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    36
#include "interpreter/bytecodes.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    37
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    38
#include "interpreter/oopMapCache.hpp"
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
    39
#include "memory/heapInspection.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    40
#include "memory/metadataFactory.hpp"
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
    41
#include "memory/metaspaceShared.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    42
#include "memory/oopFactory.hpp"
37248
11a660dbbb8e 8132524: Missing includes to resourceArea.hpp
jprovino
parents: 37179
diff changeset
    43
#include "memory/resourceArea.hpp"
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    44
#include "oops/constMethod.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 29576
diff changeset
    45
#include "oops/method.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    46
#include "oops/methodData.hpp"
35498
392b50de06c6 8146401: Clean up oop.hpp: add inline directives and fix header files
goetz
parents: 35463
diff changeset
    47
#include "oops/objArrayOop.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    48
#include "oops/oop.inline.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
    49
#include "oops/symbol.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    50
#include "prims/jvmtiExport.hpp"
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
    51
#include "prims/methodHandles.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    52
#include "prims/nativeLookup.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    53
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    54
#include "runtime/compilationPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    55
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    56
#include "runtime/handles.inline.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 23872
diff changeset
    57
#include "runtime/orderAccess.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    58
#include "runtime/relocator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    59
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    60
#include "runtime/signature.hpp"
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9134
diff changeset
    61
#include "utilities/quickSort.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6771
diff changeset
    62
#include "utilities/xmlstream.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    64
// Implementation of Method
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    65
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    66
Method* Method::allocate(ClassLoaderData* loader_data,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    67
                         int byte_code_size,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    68
                         AccessFlags access_flags,
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
    69
                         InlineTableSizes* sizes,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    70
                         ConstMethod::MethodType method_type,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    71
                         TRAPS) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    72
  assert(!access_flags.is_native() || byte_code_size == 0,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    73
         "native methods should not contain byte codes");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    74
  ConstMethod* cm = ConstMethod::allocate(loader_data,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    75
                                          byte_code_size,
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
    76
                                          sizes,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    77
                                          method_type,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
    78
                                          CHECK_NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    79
  int size = Method::size(access_flags.is_native());
33209
43d7a2139756 8135284: Remove Method::_method_size field
minqi
parents: 33148
diff changeset
    80
  return new (loader_data, size, false, MetaspaceObj::MethodType, THREAD) Method(cm, access_flags);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    81
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
33209
43d7a2139756 8135284: Remove Method::_method_size field
minqi
parents: 33148
diff changeset
    83
Method::Method(ConstMethod* xconst, AccessFlags access_flags) {
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35463
diff changeset
    84
  NoSafepointVerifier no_safepoint;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    85
  set_constMethod(xconst);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    86
  set_access_flags(access_flags);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    87
#ifdef CC_INTERP
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    88
  set_result_index(T_VOID);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    89
#endif
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    90
  set_intrinsic_id(vmIntrinsics::_none);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    91
  set_jfr_towrite(false);
15931
c4fc378a132b 8009836: nsk/regression/b4222717 fails with empty stack trace
coleenp
parents: 15928
diff changeset
    92
  set_force_inline(false);
c4fc378a132b 8009836: nsk/regression/b4222717 fails with empty stack trace
coleenp
parents: 15928
diff changeset
    93
  set_hidden(false);
c4fc378a132b 8009836: nsk/regression/b4222717 fails with empty stack trace
coleenp
parents: 15928
diff changeset
    94
  set_dont_inline(false);
31228
8e427370cdd1 8074551: GWT can be marked non-compilable due to deopt count pollution
vlivanov
parents: 30764
diff changeset
    95
  set_has_injected_profile(false);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    96
  set_method_data(NULL);
26799
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26586
diff changeset
    97
  clear_method_counters();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    98
  set_vtable_index(Method::garbage_vtable_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
    99
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   100
  // Fix and bury in Method*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   101
  set_interpreter_entry(NULL); // sets i2i entry and from_int
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   102
  set_adapter_entry(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   103
  clear_code(); // from_c/from_i get set to c2i/i2i
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   104
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   105
  if (access_flags.is_native()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   106
    clear_native_function();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   107
    set_signature_handler(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   108
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   109
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   110
  NOT_PRODUCT(set_compiled_invocation_count(0);)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   111
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   112
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   113
// Release Method*.  The nmethod will be gone when we get here because
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   114
// we've walked the code cache.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   115
void Method::deallocate_contents(ClassLoaderData* loader_data) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   116
  MetadataFactory::free_metadata(loader_data, constMethod());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   117
  set_constMethod(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   118
  MetadataFactory::free_metadata(loader_data, method_data());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   119
  set_method_data(NULL);
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   120
  MetadataFactory::free_metadata(loader_data, method_counters());
26799
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26586
diff changeset
   121
  clear_method_counters();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   122
  // The nmethod will be gone when we get here.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   123
  if (code() != NULL) _code = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   124
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   125
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   126
address Method::get_i2c_entry() {
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   127
  assert(adapter() != NULL, "must have");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   128
  return adapter()->get_i2c_entry();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   131
address Method::get_c2i_entry() {
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   132
  assert(adapter() != NULL, "must have");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   133
  return adapter()->get_c2i_entry();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   136
address Method::get_c2i_unverified_entry() {
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   137
  assert(adapter() != NULL, "must have");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   138
  return adapter()->get_c2i_unverified_entry();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   141
char* Method::name_and_sig_as_C_string() const {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   142
  return name_and_sig_as_C_string(constants()->pool_holder(), name(), signature());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   145
char* Method::name_and_sig_as_C_string(char* buf, int size) const {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   146
  return name_and_sig_as_C_string(constants()->pool_holder(), name(), signature(), buf, size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   149
char* Method::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  const char* klass_name = klass->external_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  int klass_name_len  = (int)strlen(klass_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  int method_name_len = method_name->utf8_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  int len             = klass_name_len + 1 + method_name_len + signature->utf8_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  char* dest          = NEW_RESOURCE_ARRAY(char, len + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  strcpy(dest, klass_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  dest[klass_name_len] = '.';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  strcpy(&dest[klass_name_len + 1], method_name->as_C_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  strcpy(&dest[klass_name_len + 1 + method_name_len], signature->as_C_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  dest[len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  return dest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   163
char* Method::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   164
  Symbol* klass_name = klass->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  klass_name->as_klass_external_name(buf, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  int len = (int)strlen(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  if (len < size - 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    buf[len++] = '.';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    method_name->as_C_string(&(buf[len]), size - len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    len = (int)strlen(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    signature->as_C_string(&(buf[len]), size - len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
15109
088b1ea04490 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 14587
diff changeset
   180
int Method::fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // access exception table
15109
088b1ea04490 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 14587
diff changeset
   183
  ExceptionTable table(mh());
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   184
  int length = table.length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // iterate through all entries sequentially
15109
088b1ea04490 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 14587
diff changeset
   186
  constantPoolHandle pool(THREAD, mh->constants());
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   187
  for (int i = 0; i < length; i ++) {
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   188
    //reacquire the table in case a GC happened
15109
088b1ea04490 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 14587
diff changeset
   189
    ExceptionTable table(mh());
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   190
    int beg_bci = table.start_pc(i);
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   191
    int end_bci = table.end_pc(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    assert(beg_bci <= end_bci, "inconsistent exception table");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    if (beg_bci <= throw_bci && throw_bci < end_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
      // exception handler bci range covers throw_bci => investigate further
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   195
      int handler_bci = table.handler_pc(i);
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 12960
diff changeset
   196
      int klass_index = table.catch_type_index(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
      if (klass_index == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
        return handler_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      } else if (ex_klass.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
        return handler_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
        // we know the exception class => get the constraint class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
        // this may require loading of the constraint class; if verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
        // fails or some other exception occurs, return handler_bci
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   205
        Klass* k = pool->klass_at(klass_index, CHECK_(handler_bci));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
        KlassHandle klass = KlassHandle(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
        assert(klass.not_null(), "klass not loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
        if (ex_klass->is_subtype_of(klass())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
          return handler_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   218
void Method::mask_for(int bci, InterpreterOopMap* mask) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  Thread* myThread    = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  methodHandle h_this(myThread, this);
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
   222
#if defined(ASSERT) && !INCLUDE_JVMCI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  bool has_capability = myThread->is_VM_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
                        myThread->is_ConcurrentGC_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
                        myThread->is_GC_task_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  if (!has_capability) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    if (!VerifyStack && !VerifyLastFrame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
      // verify stack calls this outside VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
      warning("oopmap should only be accessed by the "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
              "VM, GC task or CMS threads (or during debugging)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
      InterpreterOopMap local_mask;
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
   233
      method_holder()->mask_for(h_this, bci, &local_mask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
      local_mask.print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
#endif
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
   238
  method_holder()->mask_for(h_this, bci, mask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   243
int Method::bci_from(address bcp) const {
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   244
  if (is_native() && bcp == 0) {
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   245
    return 0;
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   246
  }
13882
80d5d0d21b75 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 13738
diff changeset
   247
#ifdef ASSERT
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   248
  {
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   249
    ResourceMark rm;
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   250
    assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(),
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   251
           "bcp doesn't belong to this method: bcp: " INTPTR_FORMAT ", method: %s",
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
   252
           p2i(bcp), name_and_sig_as_C_string());
13882
80d5d0d21b75 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 13738
diff changeset
   253
  }
80d5d0d21b75 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 13738
diff changeset
   254
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  return bcp - code_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   259
int Method::validate_bci(int bci) const {
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   260
  return (bci == 0 || bci < code_size()) ? bci : -1;
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   261
}
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   262
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   263
// Return bci if it appears to be a valid bcp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
// Return -1 otherwise.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
// Used by profiling code, when invalid data is a possibility.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   266
// The caller is responsible for validating the Method* itself.
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   267
int Method::validate_bci_from_bcp(address bcp) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // keep bci as -1 if not a valid bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  int bci = -1;
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   270
  if (bcp == 0 || bcp == code_base()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    // code_size() may return 0 and we allow 0 here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    // the method may be native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    bci = 0;
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   274
  } else if (contains(bcp)) {
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 25057
diff changeset
   275
    bci = bcp - code_base();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // Assert that if we have dodged any asserts, bci is negative.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  assert(bci == -1 || bci == bci_from(bcp_from(bci)), "sane bci if >=0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  return bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   282
address Method::bcp_from(int bci) const {
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   283
  assert((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()), "illegal bci: %d", bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  address bcp = code_base() + bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  assert(is_native() && bcp == code_base() || contains(bcp), "bcp doesn't belong to this method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  return bcp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
25895
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   289
address Method::bcp_from(address bcp) const {
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   290
  if (is_native() && bcp == NULL) {
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   291
    return code_base();
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   292
  } else {
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   293
    return bcp;
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   294
  }
03808d9a48b2 8051398: jvmti tests fieldacc002, fieldmod002 fail in nightly with errors: (watch#0) wrong location
coleenp
parents: 25719
diff changeset
   295
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   297
int Method::size(bool is_native) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // If native, then include pointers for native_function and signature_handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  int extra_bytes = (is_native) ? 2*sizeof(address*) : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
35898
ddc274f0052f 8145628: hotspot metadata classes shouldn't use HeapWordSize or heap related macros like align_object_size
coleenp
parents: 35499
diff changeset
   301
  return align_metadata_size(header_size() + extra_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   305
Symbol* Method::klass_name() const {
33602
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33593
diff changeset
   306
  return method_holder()->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
// Attempt to return method oop to original state.  Clear any pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// (to objects outside the shared spaces).  We won't be able to predict
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// where they should point in a new JVM.  Further initialize some
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// entries now in order allow them to be write protected later.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   315
void Method::remove_unshareable_info() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  unlink_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   320
bool Method::was_executed_more_than(int n) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   321
  // Invocation counter is reset when the Method* is compiled.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // If the method has compiled code we therefore assume it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // be excuted more than n times.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  if (is_accessor() || is_empty_method() || (code() != NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    // interpreter doesn't bump invocation counter of trivial methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    // compiler does not bump invocation counter of compiled methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    return true;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   328
  }
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   329
  else if ((method_counters() != NULL &&
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   330
            method_counters()->invocation_counter()->carry()) ||
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   331
           (method_data() != NULL &&
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   332
            method_data()->invocation_counter()->carry())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    // The carry bit is set when the counter overflows and causes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    // a compilation to occur.  We don't know how many times
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    // the counter has been reset, so we simply assume it has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    // been executed more than n times.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    return invocation_count() > n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   343
void Method::print_invocation_count() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  if (is_static()) tty->print("static ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  if (is_final()) tty->print("final ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  if (is_synchronized()) tty->print("synchronized ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  if (is_native()) tty->print("native ");
23526
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23491
diff changeset
   348
  tty->print("%s::", method_holder()->external_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  name()->print_symbol_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  signature()->print_symbol_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  if (WizardMode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    // dump the size of the byte codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    tty->print(" {%d}", code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  tty->print_cr ("  interpreter_invocation_count: %8d ", interpreter_invocation_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  tty->print_cr ("  invocation_counter:           %8d ", invocation_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  tty->print_cr ("  backedge_counter:             %8d ", backedge_count());
23526
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23491
diff changeset
   361
#ifndef PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  if (CountCompiledCalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    tty->print_cr ("  compiled_invocation_count: %8d ", compiled_invocation_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  }
23526
6851d341ad52 8037970: make PrintMethodData a diagnostic options
roland
parents: 23491
diff changeset
   365
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   368
// Build a MethodData* object to hold information about this method
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
// collected in the interpreter.
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33230
diff changeset
   370
void Method::build_interpreter_method_data(const methodHandle& method, TRAPS) {
27461
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   371
  // Do not profile the method if metaspace has hit an OOM previously
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   372
  // allocating profiling data. Callers clear pending exception so don't
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   373
  // add one here.
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   374
  if (ClassLoaderDataGraph::has_metaspace_oom()) {
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   375
    return;
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   376
  }
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   377
7446
9193aa209467 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 7397
diff changeset
   378
  // Do not profile method if current thread holds the pending list lock,
9193aa209467 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 7397
diff changeset
   379
  // which avoids deadlock for acquiring the MethodData_lock.
37129
af29e306e50b 8151601: Cleanup locking of the Reference pending list
pliden
parents: 36350
diff changeset
   380
  if (ReferencePendingListLocker::is_locked_by_self()) {
7446
9193aa209467 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 7397
diff changeset
   381
    return;
9193aa209467 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 7397
diff changeset
   382
  }
9193aa209467 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 7397
diff changeset
   383
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  // Grab a lock here to prevent multiple
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   385
  // MethodData*s from being created.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  MutexLocker ml(MethodData_lock, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  if (method->method_data() == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   388
    ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
27461
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   389
    MethodData* method_data = MethodData::allocate(loader_data, method, THREAD);
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   390
    if (HAS_PENDING_EXCEPTION) {
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   391
      CompileBroker::log_metaspace_failure();
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   392
      ClassLoaderDataGraph::set_metaspace_oom(true);
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   393
      return;   // return the exception (which is cleared)
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   394
    }
36350
29d8bb1668f5 8151130: [BACKOUT] Remove Method::_method_data for C1
thartmann
parents: 36345
diff changeset
   395
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    method->set_method_data(method_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    if (PrintMethodData && (Verbose || WizardMode)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      tty->print("build_interpreter_method_data for ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
      method->print_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
      tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
      // At the end of the run, the MDO, full of data, will be dumped.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   407
MethodCounters* Method::build_method_counters(Method* m, TRAPS) {
27461
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   408
  // Do not profile the method if metaspace has hit an OOM previously
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   409
  if (ClassLoaderDataGraph::has_metaspace_oom()) {
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   410
    return NULL;
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   411
  }
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   412
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   413
  methodHandle mh(m);
28650
772aaab2582f 8059606: Enable per-method usage of CompileThresholdScaling (per-method compilation thresholds)
zmajo
parents: 28374
diff changeset
   414
  MethodCounters* counters = MethodCounters::allocate(mh, THREAD);
27461
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   415
  if (HAS_PENDING_EXCEPTION) {
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   416
    CompileBroker::log_metaspace_failure();
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   417
    ClassLoaderDataGraph::set_metaspace_oom(true);
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   418
    return NULL;   // return the exception (which is cleared)
90e9e0f9c0c5 8037842: Failing to allocate MethodCounters and MDO causes a serious performance drop
coleenp
parents: 27247
diff changeset
   419
  }
26799
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26586
diff changeset
   420
  if (!mh->init_method_counters(counters)) {
28650
772aaab2582f 8059606: Enable per-method usage of CompileThresholdScaling (per-method compilation thresholds)
zmajo
parents: 28374
diff changeset
   421
    MetadataFactory::free_metadata(mh->method_holder()->class_loader_data(), counters);
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   422
  }
31790
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
   423
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
   424
  if (LogTouchedMethods) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
   425
    mh->log_touched(CHECK_NULL);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
   426
  }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
   427
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   428
  return mh->method_counters();
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   429
}
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
   430
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   431
void Method::cleanup_inline_caches() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // The current system doesn't use inline caches in the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // => nothing to do (keep this method around for future use)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   437
int Method::extra_stack_words() {
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
   438
  // not an inline function, to avoid a header dependency on Interpreter
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 4756
diff changeset
   439
  return extra_stack_entries() * Interpreter::stackElementSize;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
   440
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
   441
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
   442
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   443
void Method::compute_size_of_parameters(Thread *thread) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   444
  ArgumentSizeComputer asc(signature());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  set_size_of_parameters(asc.size() + (is_static() ? 0 : 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
#ifdef CC_INTERP
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   449
void Method::set_result_index(BasicType type)          {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  _result_index = Interpreter::BasicType_as_index(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   454
BasicType Method::result_type() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  ResultTypeFinder rtf(signature());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  return rtf.type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   460
bool Method::is_empty_method() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  return  code_size() == 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
      && *code_base() == Bytecodes::_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   466
bool Method::is_vanilla_constructor() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // Returns true if this method is a vanilla constructor, i.e. an "<init>" "()V" method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  // which only calls the superclass vanilla constructor and possibly does stores of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  // zero constants to local fields:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  //   aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  //   invokespecial
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  //   indexbyte1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  //   indexbyte2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  // followed by an (optional) sequence of:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  //   aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  //   aconst_null / iconst_0 / fconst_0 / dconst_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  //   putfield
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  //   indexbyte1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  //   indexbyte2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  // followed by:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  //   return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  assert(name() == vmSymbols::object_initializer_name(),    "Should only be called for default constructors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  assert(signature() == vmSymbols::void_method_signature(), "Should only be called for default constructors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  int size = code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // Check if size match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  if (size == 0 || size % 5 != 0) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  address cb = code_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  int last = size - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  if (cb[0] != Bytecodes::_aload_0 || cb[1] != Bytecodes::_invokespecial || cb[last] != Bytecodes::_return) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    // Does not call superclass default constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  // Check optional sequence
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  for (int i = 4; i < last; i += 5) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    if (cb[i] != Bytecodes::_aload_0) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    if (!Bytecodes::is_zero_const(Bytecodes::cast(cb[i+1]))) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    if (cb[i+2] != Bytecodes::_putfield) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   509
bool Method::compute_has_loops_flag() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   510
  BytecodeStream bcs(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  Bytecodes::Code bc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  while ((bc = bcs.next()) >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    switch( bc ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
      case Bytecodes::_ifeq:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
      case Bytecodes::_ifnull:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
      case Bytecodes::_iflt:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
      case Bytecodes::_ifle:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
      case Bytecodes::_ifne:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
      case Bytecodes::_ifnonnull:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
      case Bytecodes::_ifgt:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
      case Bytecodes::_ifge:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
      case Bytecodes::_if_icmpeq:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
      case Bytecodes::_if_icmpne:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
      case Bytecodes::_if_icmplt:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
      case Bytecodes::_if_icmpgt:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
      case Bytecodes::_if_icmple:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      case Bytecodes::_if_icmpge:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
      case Bytecodes::_if_acmpeq:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
      case Bytecodes::_if_acmpne:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
      case Bytecodes::_goto:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
      case Bytecodes::_jsr:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
        if( bcs.dest() < bcs.next_bci() ) _access_flags.set_has_loops();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
      case Bytecodes::_goto_w:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
      case Bytecodes::_jsr_w:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
        if( bcs.dest_w() < bcs.next_bci() ) _access_flags.set_has_loops();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  _access_flags.set_loops_flag_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  return _access_flags.has_loops();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   546
bool Method::is_final_method(AccessFlags class_access_flags) const {
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   547
  // or "does_not_require_vtable_entry"
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   548
  // default method or overpass can occur, is not final (reuses vtable entry)
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   549
  // private methods get vtable entries for backward class compatibility.
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   550
  if (is_overpass() || is_default_method())  return false;
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   551
  return is_final() || class_access_flags.is_final();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   554
bool Method::is_final_method() const {
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   555
  return is_final_method(method_holder()->access_flags());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   558
bool Method::is_default_method() const {
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   559
  if (method_holder() != NULL &&
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   560
      method_holder()->is_interface() &&
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   561
      !is_abstract()) {
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   562
    return true;
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   563
  } else {
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   564
    return false;
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   565
  }
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   566
}
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   567
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   568
bool Method::can_be_statically_bound(AccessFlags class_access_flags) const {
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   569
  if (is_final_method(class_access_flags))  return true;
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   570
#ifdef ASSERT
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   571
  ResourceMark rm;
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   572
  bool is_nonv = (vtable_index() == nonvirtual_vtable_index);
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   573
  if (class_access_flags.is_interface()) {
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
   574
    assert(is_nonv == is_static(), "is_nonv=%s", name_and_sig_as_C_string());
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
   575
  }
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   576
#endif
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   577
  assert(valid_vtable_index() || valid_itable_index(), "method must be linked before we ask this question");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  return vtable_index() == nonvirtual_vtable_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   581
bool Method::can_be_statically_bound() const {
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   582
  return can_be_statically_bound(method_holder()->access_flags());
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
   583
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   585
bool Method::is_accessor() const {
34169
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   586
  return is_getter() || is_setter();
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   587
}
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   588
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   589
bool Method::is_getter() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  if (code_size() != 5) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  if (size_of_parameters() != 1) return false;
34169
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   592
  if (java_code_at(0) != Bytecodes::_aload_0)  return false;
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7446
diff changeset
   593
  if (java_code_at(1) != Bytecodes::_getfield) return false;
34169
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   594
  switch (java_code_at(4)) {
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   595
    case Bytecodes::_ireturn:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   596
    case Bytecodes::_lreturn:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   597
    case Bytecodes::_freturn:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   598
    case Bytecodes::_dreturn:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   599
    case Bytecodes::_areturn:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   600
      break;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   601
    default:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   602
      return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   603
  }
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   604
  return true;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   605
}
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   606
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   607
bool Method::is_setter() const {
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   608
  if (code_size() != 6) return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   609
  if (java_code_at(0) != Bytecodes::_aload_0) return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   610
  switch (java_code_at(1)) {
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   611
    case Bytecodes::_iload_1:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   612
    case Bytecodes::_aload_1:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   613
    case Bytecodes::_fload_1:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   614
      if (size_of_parameters() != 2) return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   615
      break;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   616
    case Bytecodes::_dload_1:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   617
    case Bytecodes::_lload_1:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   618
      if (size_of_parameters() != 3) return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   619
      break;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   620
    default:
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   621
      return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   622
  }
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   623
  if (java_code_at(2) != Bytecodes::_putfield) return false;
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33230
diff changeset
   624
  if (java_code_at(5) != Bytecodes::_return)   return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
27643
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   628
bool Method::is_constant_getter() const {
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   629
  int last_index = code_size() - 1;
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   630
  // Check if the first 1-3 bytecodes are a constant push
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   631
  // and the last bytecode is a return.
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   632
  return (2 <= code_size() && code_size() <= 4 &&
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   633
          Bytecodes::is_const(java_code_at(0)) &&
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   634
          Bytecodes::length_for(java_code_at(0)) == last_index &&
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   635
          Bytecodes::is_return(java_code_at(last_index)));
fe8f95a2d9bc 8056071: compiler/whitebox/IsMethodCompilableTest.java fails with 'method() is not compilable after 3 iterations'
thartmann
parents: 27480
diff changeset
   636
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   638
bool Method::is_initializer() const {
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   639
  return name() == vmSymbols::object_initializer_name() || is_static_initializer();
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   640
}
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   641
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   642
bool Method::has_valid_initializer_flags() const {
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   643
  return (is_static() ||
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
   644
          method_holder()->major_version() < 51);
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   645
}
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   646
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   647
bool Method::is_static_initializer() const {
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   648
  // For classfiles version 51 or greater, ensure that the clinit method is
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   649
  // static.  Non-static methods with the name "<clinit>" are not static
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   650
  // initializers. (older classfiles exempted for backward compatibility)
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   651
  return name() == vmSymbols::class_initializer_name() &&
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8334
diff changeset
   652
         has_valid_initializer_flags();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 21198
diff changeset
   656
objArrayHandle Method::resolved_checked_exceptions_impl(Method* method, TRAPS) {
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 21198
diff changeset
   657
  int length = method->checked_exceptions_length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  if (length == 0) {  // common case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
    return objArrayHandle(THREAD, Universe::the_empty_class_klass_array());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  } else {
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 21198
diff changeset
   661
    methodHandle h_this(THREAD, method);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4094
diff changeset
   662
    objArrayOop m_oop = oopFactory::new_objArray(SystemDictionary::Class_klass(), length, CHECK_(objArrayHandle()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
    objArrayHandle mirrors (THREAD, m_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
    for (int i = 0; i < length; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
      CheckedExceptionElement* table = h_this->checked_exceptions_start(); // recompute on each iteration, not gc safe
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   666
      Klass* k = h_this->constants()->klass_at(table[i].class_cp_index, CHECK_(objArrayHandle()));
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   667
      assert(k->is_subclass_of(SystemDictionary::Throwable_klass()), "invalid exception class");
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   668
      mirrors->obj_at_put(i, k->java_mirror());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    return mirrors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   675
int Method::line_number_from_bci(int bci) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  if (bci == SynchronizationEntryBCI) bci = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  assert(bci == 0 || 0 <= bci && bci < code_size(), "illegal bci");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  int best_bci  =  0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  int best_line = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  if (has_linenumber_table()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
    // The line numbers are a short array of 2-tuples [start_pc, line_number].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    // Not necessarily sorted and not necessarily one-to-one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
    CompressedLineNumberReadStream stream(compressed_linenumber_table());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
    while (stream.read_pair()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
      if (stream.bci() == bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
        // perfect match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
        return stream.line();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
        // update best_bci/line
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
        if (stream.bci() < bci && stream.bci() >= best_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
          best_bci  = stream.bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
          best_line = stream.line();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  return best_line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   702
bool Method::is_klass_loaded_by_klass_index(int klass_index) const {
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   703
  if( constants()->tag_at(klass_index).is_unresolved_klass() ) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    Thread *thread = Thread::current();
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   705
    Symbol* klass_name = constants()->klass_name_at(klass_index);
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
   706
    Handle loader(thread, method_holder()->class_loader());
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
   707
    Handle prot  (thread, method_holder()->protection_domain());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    return SystemDictionary::find(klass_name, loader, prot, thread) != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   715
bool Method::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
12937
0032fb2caff6 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 11637
diff changeset
   716
  int klass_index = constants()->klass_ref_index_at(refinfo_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  if (must_be_resolved) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
    // Make sure klass is resolved in constantpool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    if (constants()->tag_at(klass_index).is_unresolved_klass()) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  return is_klass_loaded_by_klass_index(klass_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   725
void Method::set_native_function(address function, bool post_event_flag) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  assert(function != NULL, "use clear_native_function to unregister natives");
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
   727
  assert(!is_method_handle_intrinsic() || function == SharedRuntime::native_method_throw_unsatisfied_link_error_entry(), "");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  address* native_function = native_function_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  // We can see racers trying to place the same native function into place. Once
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  // is plenty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  address current = *native_function;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  if (current == function) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  if (post_event_flag && JvmtiExport::should_post_native_method_bind() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
      function != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    // native_method_throw_unsatisfied_link_error_entry() should only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
    // be passed when post_event_flag is false.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    assert(function !=
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
      SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
      "post_event_flag mis-match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
    // post the bind event, and possible change the bind function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
    JvmtiExport::post_native_method_bind(this, &function);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  *native_function = function;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  // This function can be called more than once. We must make sure that we always
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  // use the latest registered method -> check if a stub already has been generated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  // If so, we have to make it not_entrant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  nmethod* nm = code(); // Put it into local variable to guard against concurrent updates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  if (nm != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    nm->make_not_entrant();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   756
bool Method::has_native_function() const {
13392
1ef07ae0723d 7187290: nightly failures after JSR 292 lazy method handle update
twisti
parents: 13391
diff changeset
   757
  if (is_method_handle_intrinsic())
1ef07ae0723d 7187290: nightly failures after JSR 292 lazy method handle update
twisti
parents: 13391
diff changeset
   758
    return false;  // special-cased in SharedRuntime::generate_native_wrapper
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  address func = native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  return (func != NULL && func != SharedRuntime::native_method_throw_unsatisfied_link_error_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   764
void Method::clear_native_function() {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
   765
  // Note: is_method_handle_intrinsic() is allowed here.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  set_native_function(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
    !native_bind_event_is_interesting);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  clear_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   772
address Method::critical_native_function() {
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10537
diff changeset
   773
  methodHandle mh(this);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10537
diff changeset
   774
  return NativeLookup::lookup_critical_entry(mh);
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10537
diff changeset
   775
}
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 10537
diff changeset
   776
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   778
void Method::set_signature_handler(address handler) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  address* signature_handler =  signature_handler_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  *signature_handler = handler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   784
void Method::print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason) {
4756
da88c27a9241 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 4754
diff changeset
   785
  if (PrintCompilation && report) {
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   786
    ttyLocker ttyl;
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   787
    tty->print("made not %scompilable on ", is_osr ? "OSR " : "");
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   788
    if (comp_level == CompLevel_all) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   789
      tty->print("all levels ");
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   790
    } else {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   791
      tty->print("levels ");
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   792
      for (int i = (int)CompLevel_none; i <= comp_level; i++) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   793
        tty->print("%d ", i);
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   794
      }
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   795
    }
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   796
    this->print_short_name(tty);
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   797
    int size = this->code_size();
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   798
    if (size > 0) {
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   799
      tty->print(" (%d bytes)", size);
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   800
    }
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   801
    if (reason != NULL) {
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   802
      tty->print("   %s", reason);
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   803
    }
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   804
    tty->cr();
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4750
diff changeset
   805
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    ttyLocker ttyl;
25643
4ff52a1e3a23 8049529: LogCompilation: annotate make_not_compilable with compilation level
vlivanov
parents: 25057
diff changeset
   808
    xtty->begin_elem("make_not_compilable thread='" UINTX_FORMAT "' osr='%d' level='%d'",
4ff52a1e3a23 8049529: LogCompilation: annotate make_not_compilable with compilation level
vlivanov
parents: 25057
diff changeset
   809
                     os::current_thread_id(), is_osr, comp_level);
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   810
    if (reason != NULL) {
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   811
      xtty->print(" reason=\'%s\'", reason);
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   812
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   813
    xtty->method(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    xtty->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
    xtty->end_elem();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  }
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   817
}
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   818
19720
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   819
bool Method::is_always_compilable() const {
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   820
  // Generated adapters must be compiled
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   821
  if (is_method_handle_intrinsic() && is_synthetic()) {
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   822
    assert(!is_not_c1_compilable(), "sanity check");
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   823
    assert(!is_not_c2_compilable(), "sanity check");
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   824
    return true;
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   825
  }
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   826
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   827
  return false;
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   828
}
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   829
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   830
bool Method::is_not_compilable(int comp_level) const {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   831
  if (number_of_breakpoints() > 0)
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   832
    return true;
19720
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   833
  if (is_always_compilable())
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   834
    return false;
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   835
  if (comp_level == CompLevel_any)
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   836
    return is_not_c1_compilable() || is_not_c2_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   837
  if (is_c1_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   838
    return is_not_c1_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   839
  if (is_c2_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   840
    return is_not_c2_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   841
  return false;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   842
}
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   843
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   844
// call this when compiler finds that this method is not compilable
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   845
void Method::set_not_compilable(int comp_level, bool report, const char* reason) {
19720
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   846
  if (is_always_compilable()) {
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   847
    // Don't mark a method which should be always compilable
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   848
    return;
1f9f216fa43e 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 19335
diff changeset
   849
  }
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   850
  print_made_not_compilable(comp_level, /*is_osr*/ false, report, reason);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   851
  if (comp_level == CompLevel_all) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   852
    set_not_c1_compilable();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   853
    set_not_c2_compilable();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   854
  } else {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   855
    if (is_c1_compile(comp_level))
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   856
      set_not_c1_compilable();
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   857
    if (is_c2_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   858
      set_not_c2_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   859
  }
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   860
  CompilationPolicy::policy()->disable_compilation(this);
19332
ee4c8c2af356 8022832: Add WB APIs for OSR compilation
iignatyev
parents: 18951
diff changeset
   861
  assert(!CompilationPolicy::can_be_compiled(this, comp_level), "sanity check");
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   862
}
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   863
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   864
bool Method::is_not_osr_compilable(int comp_level) const {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   865
  if (is_not_compilable(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   866
    return true;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   867
  if (comp_level == CompLevel_any)
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   868
    return is_not_c1_osr_compilable() || is_not_c2_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   869
  if (is_c1_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   870
    return is_not_c1_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   871
  if (is_c2_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   872
    return is_not_c2_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   873
  return false;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   874
}
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   875
15479
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   876
void Method::set_not_osr_compilable(int comp_level, bool report, const char* reason) {
e3c00ec80145 8006613: adding reason to made_not_compilable
vlivanov
parents: 15110
diff changeset
   877
  print_made_not_compilable(comp_level, /*is_osr*/ true, report, reason);
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   878
  if (comp_level == CompLevel_all) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   879
    set_not_c1_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   880
    set_not_c2_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   881
  } else {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   882
    if (is_c1_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   883
      set_not_c1_osr_compilable();
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   884
    if (is_c2_compile(comp_level))
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13882
diff changeset
   885
      set_not_c2_osr_compilable();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   887
  CompilationPolicy::policy()->disable_compilation(this);
19332
ee4c8c2af356 8022832: Add WB APIs for OSR compilation
iignatyev
parents: 18951
diff changeset
   888
  assert(!CompilationPolicy::can_be_osr_compiled(this, comp_level), "sanity check");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
// Revert to using the interpreter and clear out the nmethod
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   892
void Method::clear_code() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // this may be NULL if c2i adapters have not been made yet
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  // Only should happen at allocate time.
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   896
  if (adapter() == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
    _from_compiled_entry    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  } else {
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   899
    _from_compiled_entry    = adapter()->get_c2i_entry();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  OrderAccess::storestore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  _from_interpreted_entry = _i2i_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  OrderAccess::storestore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  _code = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   907
#if INCLUDE_CDS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
// Called by class data sharing to remove any entry points (which are not shared)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   909
void Method::unlink_method() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  _code = NULL;
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   911
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   912
  assert(DumpSharedSpaces, "dump time only");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   913
  // Set the values to what they should be at run time. Note that
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   914
  // this Method can no longer be executed during dump time.
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   915
  _i2i_entry = Interpreter::entry_for_cds_method(this);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   916
  _from_interpreted_entry = _i2i_entry;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   917
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  if (is_native()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    *native_function_addr() = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
    set_signature_handler(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  NOT_PRODUCT(set_compiled_invocation_count(0);)
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   923
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   924
  CDSAdapterHandlerEntry* cds_adapter = (CDSAdapterHandlerEntry*)adapter();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   925
  constMethod()->set_adapter_trampoline(cds_adapter->get_adapter_trampoline());
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   926
  _from_compiled_entry = cds_adapter->get_c2i_entry_trampoline();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   927
  assert(*((int*)_from_compiled_entry) == 0, "must be NULL during dump time, to be initialized at run time");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   928
16352
1ff72c6eaa70 8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents: 15931
diff changeset
   929
1ff72c6eaa70 8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents: 15931
diff changeset
   930
  // In case of DumpSharedSpaces, _method_data should always be NULL.
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   931
  assert(_method_data == NULL, "unexpected method data?");
16352
1ff72c6eaa70 8007725: NPG: Klass::restore_unshareable_info() triggers assert(k->java_mirror() == NULL)
coleenp
parents: 15931
diff changeset
   932
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  set_method_data(NULL);
26799
0c349e16bbe8 8058564: Tiered compilation performance drop in PIT
iveresov
parents: 26586
diff changeset
   934
  clear_method_counters();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
}
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   936
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
// Called when the method_holder is getting linked. Setup entrypoints so the method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
// is ready to be called from interpreter, compiler, and vtables.
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33230
diff changeset
   940
void Method::link_method(const methodHandle& h_method, TRAPS) {
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 9134
diff changeset
   941
  // If the code cache is full, we may reenter this function for the
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 9134
diff changeset
   942
  // leftover methods that weren't linked.
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   943
  if (is_shared()) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   944
    if (adapter() != NULL) return;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   945
  } else {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   946
    if (_i2i_entry != NULL) return;
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 9134
diff changeset
   947
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   948
    assert(adapter() == NULL, "init'd to NULL" );
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   949
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  assert( _code == NULL, "nothing compiled yet" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  // Setup interpreter entrypoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  assert(this == h_method(), "wrong h_method()" );
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   954
  address entry;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   955
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   956
  if (this->is_shared()) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   957
    entry = Interpreter::entry_for_cds_method(h_method);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   958
  } else {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   959
    entry = Interpreter::entry_for_method(h_method);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   960
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  assert(entry != NULL, "interpreter entry must be non-null");
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   962
  if (is_shared()) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   963
    assert(entry == _i2i_entry && entry == _from_interpreted_entry,
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   964
           "should be correctly set during dump time");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   965
  } else {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   966
    // Sets both _i2i_entry and _from_interpreted_entry
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   967
    set_interpreter_entry(entry);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
   968
  }
17381
a53ac5bf4850 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 17132
diff changeset
   969
a53ac5bf4850 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 17132
diff changeset
   970
  // Don't overwrite already registered native entries.
a53ac5bf4850 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact
twisti
parents: 17132
diff changeset
   971
  if (is_native() && !has_native_function()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
    set_native_function(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
      SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
      !native_bind_event_is_interesting);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  // Setup compiler entrypoint.  This is made eagerly, so we do not need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  // special handling of vtables.  An alternative is to make adapters more
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  // lazily by calling make_adapter() from from_compiled_entry() for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  // normal calls.  For vtable calls life gets more complicated.  When a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  // call-site goes mega-morphic we need adapters in all methods which can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  // called from the vtable.  We need adapters on such methods that get loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  // later.  Ditto for mega-morphic itable calls.  If this proves to be a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  // problem we'll make these lazily later.
9972
a91e8e564b52 7049928: VM crashes with "assert(_adapter != NULL) failed: must have" at methodOop.cpp:63
coleenp
parents: 9971
diff changeset
   985
  (void) make_adapters(h_method, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  // ONLY USE the h_method now as make_adapter may have blocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
   991
address Method::make_adapters(methodHandle mh, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // Adapters for compiled code are made eagerly here.  They are fairly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  // small (generally < 100 bytes) and quick to make (and cached and shared)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  // so making them eagerly shouldn't be too expensive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  AdapterHandlerEntry* adapter = AdapterHandlerLibrary::get_adapter(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  if (adapter == NULL ) {
27920
b34081fac06c 8066448: SmallCodeCacheStartup.java exits with exit code 1
thartmann
parents: 27643
diff changeset
   997
    THROW_MSG_NULL(vmSymbols::java_lang_VirtualMachineError(), "Out of space in CodeCache for adapters");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1000
  if (mh->is_shared()) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1001
    assert(mh->adapter() == adapter, "must be");
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1002
    assert(mh->_from_compiled_entry != NULL, "must be"); // FIXME, the instructions also not NULL
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1003
  } else {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1004
    mh->set_adapter_entry(adapter);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1005
    mh->_from_compiled_entry = adapter->get_c2i_entry();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1006
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  return adapter->get_c2i_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
23872
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1010
void Method::restore_unshareable_info(TRAPS) {
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1011
  // Since restore_unshareable_info can be called more than once for a method, don't
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1012
  // redo any work.   If this field is restored, there is nothing to do.
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1013
  if (_from_compiled_entry == NULL) {
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1014
    // restore method's vtable by calling a virtual function
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1015
    restore_vtable();
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1016
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1017
    methodHandle mh(THREAD, this);
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1018
    link_method(mh, CHECK);
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1019
  }
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1020
}
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1021
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1022
volatile address Method::from_compiled_entry_no_trampoline() const {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1023
  nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1024
  if (code) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1025
    return code->verified_entry_point();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1026
  } else {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1027
    return adapter()->get_c2i_entry();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1028
  }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 37267
diff changeset
  1029
}
23872
536c66fc43d3 8028497: SIGSEGV at ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool)
coleenp
parents: 23534
diff changeset
  1030
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
// The verified_code_entry() must be called when a invoke is resolved
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
// on this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
// It returns the compiled code entry point, after asserting not null.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
// This function is called after potential safepoints so that nmethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
// or adapter that it points to is still live and valid.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
// This function must not hit a safepoint!
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1038
address Method::verified_code_entry() {
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35463
diff changeset
  1039
  debug_only(NoSafepointVerifier nsv;)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  assert(_from_compiled_entry != NULL, "must be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  return _from_compiled_entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
// Check that if an nmethod ref exists, it has a backlink to this or no backlink at all
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
// (could be racing a deopt).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
// Not inline to avoid circular ref.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1047
bool Method::check_code() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  // cached in a register or local.  There's a race on the value of the field.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1050
  return code == NULL || (code->method() == NULL) || (code->method() == (Method*)this && !code->is_osr_method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
// Install compiled code.  Instantly it can execute.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1054
void Method::set_code(methodHandle mh, nmethod *code) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  assert( code, "use clear_code to remove code" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
  assert( mh->check_code(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  guarantee(mh->adapter() != NULL, "Adapter blob must already exist!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  // These writes must happen in this order, because the interpreter will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  // directly jump to from_interpreted_entry which jumps to an i2c adapter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  // which jumps to _from_compiled_entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  mh->_code = code;             // Assign before allowing compiled code to exec
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  int comp_level = code->comp_level();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  // In theory there could be a race here. In practice it is unlikely
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  // and not worth worrying about.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1068
  if (comp_level > mh->highest_comp_level()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1069
    mh->set_highest_comp_level(comp_level);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  OrderAccess::storestore();
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
  1073
#ifdef SHARK
6771
3f9a5f169070 6990549: Zero and Shark fixes after 6978355 and 6953144
twisti
parents: 6463
diff changeset
  1074
  mh->_from_interpreted_entry = code->insts_begin();
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1075
#else //!SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  mh->_from_compiled_entry = code->verified_entry_point();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  OrderAccess::storestore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  // Instantly compiled code can execute.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1079
  if (!mh->is_method_handle_intrinsic())
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1080
    mh->_from_interpreted_entry = mh->get_i2c_entry();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1081
#endif //!SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
}
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: 13392
diff changeset
  1085
bool Method::is_overridden_in(Klass* k) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1086
  InstanceKlass* ik = InstanceKlass::cast(k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  if (ik->is_interface()) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  // If method is an interface, we skip it - except if it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  // is a miranda method
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1092
  if (method_holder()->is_interface()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
    // Check that method is not a miranda method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
    if (ik->lookup_method(name(), signature()) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
      // No implementation exist - so miranda method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  assert(ik->is_subclass_of(method_holder()), "should be subklass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  assert(ik->vtable() != NULL, "vtable should exist");
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
  1103
  if (!has_vtable_index()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1106
    Method* vt_m = ik->method_at_vtable(vtable_index());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1107
    return vt_m != this;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1112
// give advice about whether this Method* should be cached or not
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1113
bool Method::should_not_be_cached() const {
221
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1114
  if (is_old()) {
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1115
    // This method has been redefined. It is either EMCP or obsolete
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1116
    // and we don't want to cache it because that would pin the method
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1117
    // down and prevent it from being collectible if and when it
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1118
    // finishes executing.
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1119
    return true;
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1120
  }
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1121
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1122
  // caching this method should be just fine
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1123
  return false;
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1124
}
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1125
16617
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1126
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1127
/**
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1128
 *  Returns true if this is one of the specially treated methods for
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1129
 *  security related stack walks (like Reflection.getCallerClass).
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1130
 */
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1131
bool Method::is_ignored_by_security_stack_walk() const {
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1132
  if (intrinsic_id() == vmIntrinsics::_invoke) {
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1133
    // This is Method.invoke() -- ignore it
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1134
    return true;
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1135
  }
25057
f38210f84f8c 8031819: Remove legacy jdk checks and code
hseigel
parents: 24457
diff changeset
  1136
  if (method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) {
16617
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1137
    // This is an auxilary frame -- ignore it
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1138
    return true;
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1139
  }
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1140
  if (is_method_handle_intrinsic() || is_compiled_lambda_form()) {
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1141
    // This is an internal adapter frame for method handles -- ignore it
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1142
    return true;
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1143
  }
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1144
  return false;
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1145
}
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1146
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1147
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1148
// Constant pool structure for invoke methods:
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1149
enum {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1150
  _imcp_invoke_name = 1,        // utf8: 'invokeExact', etc.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1151
  _imcp_invoke_signature,       // utf8: (variable Symbol*)
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1152
  _imcp_limit
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1153
};
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1154
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1155
// Test if this method is an MH adapter frame generated by Java code.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1156
// Cf. java/lang/invoke/InvokerBytecodeGenerator
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1157
bool Method::is_compiled_lambda_form() const {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1158
  return intrinsic_id() == vmIntrinsics::_compiledLambdaForm;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1159
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1160
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1161
// Test if this method is an internal MH primitive method.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1162
bool Method::is_method_handle_intrinsic() const {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1163
  vmIntrinsics::ID iid = intrinsic_id();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1164
  return (MethodHandles::is_signature_polymorphic(iid) &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1165
          MethodHandles::is_signature_polymorphic_intrinsic(iid));
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4571
diff changeset
  1166
}
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4571
diff changeset
  1167
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1168
bool Method::has_member_arg() const {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1169
  vmIntrinsics::ID iid = intrinsic_id();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1170
  return (MethodHandles::is_signature_polymorphic(iid) &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1171
          MethodHandles::has_member_arg(iid));
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1172
}
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1173
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1174
// Make an instance of a signature-polymorphic internal MH primitive.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1175
methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid,
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1176
                                                         Symbol* signature,
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1177
                                                         TRAPS) {
10500
0f9de4fc106e 7082949: JSR 292: missing ResourceMark in methodOopDesc::make_invoke_method
never
parents: 10018
diff changeset
  1178
  ResourceMark rm;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1179
  methodHandle empty;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1180
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1181
  KlassHandle holder = SystemDictionary::MethodHandle_klass();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1182
  Symbol* name = MethodHandles::signature_polymorphic_intrinsic_name(iid);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1183
  assert(iid == MethodHandles::signature_polymorphic_name_id(name), "");
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1184
  if (TraceMethodHandles) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1185
    tty->print_cr("make_method_handle_intrinsic MH.%s%s", name->as_C_string(), signature->as_C_string());
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1186
  }
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1187
9134
189a8c094016 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 9116
diff changeset
  1188
  // invariant:   cp->symbol_at_put is preceded by a refcount increment (more usually a lookup)
189a8c094016 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 9116
diff changeset
  1189
  name->increment_refcount();
189a8c094016 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 9116
diff changeset
  1190
  signature->increment_refcount();
189a8c094016 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 9116
diff changeset
  1191
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1192
  int cp_length = _imcp_limit;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1193
  ClassLoaderData* loader_data = holder->class_loader_data();
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1194
  constantPoolHandle cp;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1195
  {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1196
    ConstantPool* cp_oop = ConstantPool::allocate(loader_data, cp_length, CHECK_(empty));
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1197
    cp = constantPoolHandle(THREAD, cp_oop);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1198
  }
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1199
  cp->set_pool_holder(InstanceKlass::cast(holder()));
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1200
  cp->symbol_at_put(_imcp_invoke_name,       name);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1201
  cp->symbol_at_put(_imcp_invoke_signature,  signature);
15430
7c35f12cf1e5 8006040: NPG: on_stack processing wastes space in ConstantPool
coleenp
parents: 15110
diff changeset
  1202
  cp->set_has_preresolution();
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1203
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1204
  // decide on access bits:  public or not?
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1205
  int flags_bits = (JVM_ACC_NATIVE | JVM_ACC_SYNTHETIC | JVM_ACC_FINAL);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1206
  bool must_be_static = MethodHandles::is_signature_polymorphic_static(iid);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1207
  if (must_be_static)  flags_bits |= JVM_ACC_STATIC;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1208
  assert((flags_bits & JVM_ACC_PUBLIC) == 0, "do not expose these methods");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1209
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1210
  methodHandle m;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1211
  {
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1212
    InlineTableSizes sizes;
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1213
    Method* m_oop = Method::allocate(loader_data, 0,
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1214
                                     accessFlags_from(flags_bits), &sizes,
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 15097
diff changeset
  1215
                                     ConstMethod::NORMAL, CHECK_(empty));
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1216
    m = methodHandle(THREAD, m_oop);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1217
  }
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1218
  m->set_constants(cp());
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1219
  m->set_name_index(_imcp_invoke_name);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1220
  m->set_signature_index(_imcp_invoke_signature);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1221
  assert(MethodHandles::is_signature_polymorphic_name(m->name()), "");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1222
  assert(m->signature() == signature, "");
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1223
#ifdef CC_INTERP
8326
752682831ac6 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 8076
diff changeset
  1224
  ResultTypeFinder rtf(signature);
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1225
  m->set_result_index(rtf.type());
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1226
#endif
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1227
  m->compute_size_of_parameters(THREAD);
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6453
diff changeset
  1228
  m->init_intrinsic_id();
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1229
  assert(m->is_method_handle_intrinsic(), "");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1230
#ifdef ASSERT
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1231
  if (!MethodHandles::is_signature_polymorphic(m->intrinsic_id()))  m->print();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1232
  assert(MethodHandles::is_signature_polymorphic(m->intrinsic_id()), "must be an invoker");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1233
  assert(m->intrinsic_id() == iid, "correctly predicted iid");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1234
#endif //ASSERT
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1235
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1236
  // Finally, set up its entry points.
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1237
  assert(m->can_be_statically_bound(), "");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1238
  m->set_vtable_index(Method::nonvirtual_vtable_index);
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1239
  m->link_method(m, CHECK_(empty));
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1240
35543
0961315f4016 8140659: C1: invokedynamic call patching violates JVMS-6.5.invokedynamic
vlivanov
parents: 34666
diff changeset
  1241
  if (TraceMethodHandles && (Verbose || WizardMode)) {
0961315f4016 8140659: C1: invokedynamic call patching violates JVMS-6.5.invokedynamic
vlivanov
parents: 34666
diff changeset
  1242
    ttyLocker ttyl;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1243
    m->print_on(tty);
35543
0961315f4016 8140659: C1: invokedynamic call patching violates JVMS-6.5.invokedynamic
vlivanov
parents: 34666
diff changeset
  1244
  }
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1245
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1246
  return m;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1247
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1248
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1249
Klass* Method::check_non_bcp_klass(Klass* klass) {
14488
ab48109f7d1b 8001471: Klass::cast() does nothing
hseigel
parents: 14391
diff changeset
  1250
  if (klass != NULL && klass->class_loader() != NULL) {
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
  1251
    if (klass->is_objArray_klass())
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13891
diff changeset
  1252
      klass = ObjArrayKlass::cast(klass)->bottom_klass();
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9972
diff changeset
  1253
    return klass;
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9972
diff changeset
  1254
  }
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9972
diff changeset
  1255
  return NULL;
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 9972
diff changeset
  1256
}
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2105
diff changeset
  1257
221
ec745a0fe922 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 1
diff changeset
  1258
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1259
methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
                                                u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  // Code below does not work for native methods - they should never get rewritten anyway
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
  assert(!m->is_native(), "cannot rewrite native methods");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1263
  // Allocate new Method*
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  AccessFlags flags = m->access_flags();
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1265
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1266
  ConstMethod* cm = m->constMethod();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1267
  int checked_exceptions_len = cm->checked_exceptions_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1268
  int localvariable_len = cm->localvariable_table_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1269
  int exception_table_len = cm->exception_table_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1270
  int method_parameters_len = cm->method_parameters_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1271
  int method_annotations_len = cm->method_annotations_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1272
  int parameter_annotations_len = cm->parameter_annotations_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1273
  int type_annotations_len = cm->type_annotations_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1274
  int default_annotations_len = cm->default_annotations_length();
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1275
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1276
  InlineTableSizes sizes(
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1277
      localvariable_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1278
      new_compressed_linenumber_size,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1279
      exception_table_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1280
      checked_exceptions_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1281
      method_parameters_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1282
      cm->generic_signature_index(),
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1283
      method_annotations_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1284
      parameter_annotations_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1285
      type_annotations_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1286
      default_annotations_len,
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1287
      0);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1288
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
  1289
  ClassLoaderData* loader_data = m->method_holder()->class_loader_data();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1290
  Method* newm_oop = Method::allocate(loader_data,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
  1291
                                      new_code_length,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
  1292
                                      flags,
15601
df8faef6efaf 8007320: NPG: move method annotations
coleenp
parents: 15595
diff changeset
  1293
                                      &sizes,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
  1294
                                      m->method_type(),
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13974
diff changeset
  1295
                                      CHECK_(methodHandle()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
  methodHandle newm (THREAD, newm_oop);
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 670
diff changeset
  1297
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1298
  // Create a shallow copy of Method part, but be careful to preserve the new ConstMethod*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1299
  ConstMethod* newcm = newm->constMethod();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1300
  int new_const_method_size = newm->constMethod()->size();
8296
b1c2163e4e59 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 8076
diff changeset
  1301
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1302
  memcpy(newm(), m(), sizeof(Method));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1303
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1304
  // Create shallow copy of ConstMethod.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1305
  memcpy(newcm, m->constMethod(), sizeof(ConstMethod));
8296
b1c2163e4e59 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 8076
diff changeset
  1306
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  // Reset correct method/const method, method size, and parameter info
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  newm->set_constMethod(newcm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
  newm->constMethod()->set_code_size(new_code_length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
  newm->constMethod()->set_constMethod_size(new_const_method_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
  assert(newm->code_size() == new_code_length, "check");
18951
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1312
  assert(newm->method_parameters_length() == method_parameters_len, "check");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
  assert(newm->checked_exceptions_length() == checked_exceptions_len, "check");
13285
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1314
  assert(newm->exception_table_length() == exception_table_len, "check");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
  assert(newm->localvariable_table_length() == localvariable_len, "check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
  // Copy new byte codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
  memcpy(newm->code_base(), new_code, new_code_length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  // Copy line number table
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
  if (new_compressed_linenumber_size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
    memcpy(newm->compressed_linenumber_table(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
           new_compressed_linenumber_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
           new_compressed_linenumber_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  }
18951
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1324
  // Copy method_parameters
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1325
  if (method_parameters_len > 0) {
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1326
    memcpy(newm->method_parameters_start(),
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1327
           m->method_parameters_start(),
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1328
           method_parameters_len * sizeof(MethodParametersElement));
eb19defdc889 8019632: Method parameters are not copied in clone_with_new_data
emc
parents: 18439
diff changeset
  1329
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  // Copy checked_exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  if (checked_exceptions_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
    memcpy(newm->checked_exceptions_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
           m->checked_exceptions_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
           checked_exceptions_len * sizeof(CheckedExceptionElement));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  }
13285
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1336
  // Copy exception table
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1337
  if (exception_table_len > 0) {
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1338
    memcpy(newm->exception_table_start(),
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1339
           m->exception_table_start(),
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1340
           exception_table_len * sizeof(ExceptionTableElement));
5c78ade8d6a3 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 13282
diff changeset
  1341
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  // Copy local variable number table
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
  if (localvariable_len > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
    memcpy(newm->localvariable_table_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
           m->localvariable_table_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
           localvariable_len * sizeof(LocalVariableTableElement));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1348
  // Copy stackmap table
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1349
  if (m->has_stackmap_table()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1350
    int code_attribute_length = m->stackmap_data()->length();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1351
    Array<u1>* stackmap_data =
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1352
      MetadataFactory::new_array<u1>(loader_data, code_attribute_length, 0, CHECK_NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1353
    memcpy((void*)stackmap_data->adr_at(0),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1354
           (void*)m->stackmap_data()->adr_at(0), code_attribute_length);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1355
    newm->set_stackmap_data(stackmap_data);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1356
  }
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 670
diff changeset
  1357
16588
7e90e795813e 8009531: Crash when redefining class with annotated method
coleenp
parents: 16352
diff changeset
  1358
  // copy annotations over to new method
7e90e795813e 8009531: Crash when redefining class with annotated method
coleenp
parents: 16352
diff changeset
  1359
  newcm->copy_annotations_from(cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
  return newm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 34185
diff changeset
  1363
vmSymbols::SID Method::klass_id_for_intrinsics(const Klass* holder) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  // because we are not loading from core libraries
14132
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
  1366
  // exception: the AES intrinsics come from lib/ext/sunjce_provider.jar
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
  1367
  // which does not use the class default class loader so we check for its loader here
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 34185
diff changeset
  1368
  const InstanceKlass* ik = InstanceKlass::cast(holder);
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 36350
diff changeset
  1369
  if ((ik->class_loader() != NULL) && !SystemDictionary::is_platform_class_loader(ik->class_loader())) {
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1370
    return vmSymbols::NO_SID;   // regardless of name, no intrinsics here
14132
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
  1371
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  // see if the klass name is well-known:
16617
6235d2c7549f 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 16352
diff changeset
  1374
  Symbol* klass_name = ik->name();
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1375
  return vmSymbols::find_sid(klass_name);
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1376
}
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1377
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1378
void Method::init_intrinsic_id() {
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1379
  assert(_intrinsic_id == vmIntrinsics::_none, "do this just once");
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1380
  const uintptr_t max_id_uint = right_n_bits((int)(sizeof(_intrinsic_id) * BitsPerByte));
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1381
  assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size");
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6453
diff changeset
  1382
  assert(intrinsic_id_size_in_bytes() == sizeof(_intrinsic_id), "");
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1383
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1384
  // the klass name is well-known:
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1385
  vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder());
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1386
  assert(klass_id != vmSymbols::NO_SID, "caller responsibility");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  // ditto for method and signature:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
  vmSymbols::SID  name_id = vmSymbols::find_sid(name());
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1390
  if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle)
36819
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1391
      && klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_VarHandle)
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1392
      && name_id == vmSymbols::NO_SID) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1393
    return;
36819
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1394
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
  vmSymbols::SID   sig_id = vmSymbols::find_sid(signature());
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8675
diff changeset
  1396
  if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle)
36819
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1397
      && klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_VarHandle)
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1398
      && sig_id == vmSymbols::NO_SID) {
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1399
    return;
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1400
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
  jshort flags = access_flags().as_short();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1403
  vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1404
  if (id != vmIntrinsics::_none) {
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1405
    set_intrinsic_id(id);
27450
603dbcf4f547 8054492: Casting can result in redundant null checks in generated code
kvn
parents: 27247
diff changeset
  1406
    if (id == vmIntrinsics::_Class_cast) {
603dbcf4f547 8054492: Casting can result in redundant null checks in generated code
kvn
parents: 27247
diff changeset
  1407
      // Even if the intrinsic is rejected, we want to inline this simple method.
603dbcf4f547 8054492: Casting can result in redundant null checks in generated code
kvn
parents: 27247
diff changeset
  1408
      set_force_inline(true);
603dbcf4f547 8054492: Casting can result in redundant null checks in generated code
kvn
parents: 27247
diff changeset
  1409
    }
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1410
    return;
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1411
  }
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1412
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  // A few slightly irregular cases:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
  switch (klass_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
    // Second chance: check in regular Math.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
    switch (name_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
    case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
    case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
    case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
      // pretend it is the corresponding method in the non-strict class:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
      klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1423
      id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
    }
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 5419
diff changeset
  1426
    break;
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 5419
diff changeset
  1427
36819
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1428
  // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*., VarHandle
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8675
diff changeset
  1429
  case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle):
36819
bca375d368ed 8149644: Integrate VarHandles
psandoz
parents: 36551
diff changeset
  1430
  case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_VarHandle):
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1431
    if (!is_native())  break;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1432
    id = MethodHandles::signature_polymorphic_name_id(method_holder(), name());
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1433
    if (is_static() != MethodHandles::is_signature_polymorphic_static(id))
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1434
      id = vmIntrinsics::_none;
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 5419
diff changeset
  1435
    break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
3273
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1438
  if (id != vmIntrinsics::_none) {
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1439
    // Set up its iid.  It is an alias method.
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1440
    set_intrinsic_id(id);
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1441
    return;
6acf7084b1d3 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 2570
diff changeset
  1442
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1445
// These two methods are static since a GC may move the Method
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1446
bool Method::load_signature_classes(methodHandle m, TRAPS) {
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1447
  if (!THREAD->can_call_java()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1448
    // There is nothing useful this routine can do from within the Compile thread.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1449
    // Hopefully, the signature contains only well-known classes.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1450
    // We could scan for this and return true/false, but the caller won't care.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1451
    return false;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1452
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  bool sig_is_loaded = true;
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1454
  Handle class_loader(THREAD, m->method_holder()->class_loader());
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1455
  Handle protection_domain(THREAD, m->method_holder()->protection_domain());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1456
  ResourceMark rm(THREAD);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1457
  Symbol*  signature = m->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
  for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
    if (ss.is_object()) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1460
      Symbol* sym = ss.as_symbol(CHECK_(false));
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1461
      Symbol*  name  = sym;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1462
      Klass* klass = SystemDictionary::resolve_or_null(name, class_loader,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
                                             protection_domain, THREAD);
351
74ef5746f624 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 221
diff changeset
  1464
      // We are loading classes eagerly. If a ClassNotFoundException or
74ef5746f624 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 221
diff changeset
  1465
      // a LinkageError was generated, be sure to ignore it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
      if (HAS_PENDING_EXCEPTION) {
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4094
diff changeset
  1467
        if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass()) ||
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4094
diff changeset
  1468
            PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
          CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
          return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
      if( klass == NULL) { sig_is_loaded = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  return sig_is_loaded;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1480
bool Method::has_unloaded_classes_in_signature(methodHandle m, TRAPS) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1481
  Handle class_loader(THREAD, m->method_holder()->class_loader());
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1482
  Handle protection_domain(THREAD, m->method_holder()->protection_domain());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1483
  ResourceMark rm(THREAD);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1484
  Symbol*  signature = m->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    if (ss.type() == T_OBJECT) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1487
      Symbol* name = ss.as_symbol_or_null();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1488
      if (name == NULL) return true;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1489
      Klass* klass = SystemDictionary::find(name, class_loader, protection_domain, THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
      if (klass == NULL) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
// Exposed so field engineers can debug VM
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1497
void Method::print_short_name(outputStream* st) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
#ifdef PRODUCT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1500
  st->print(" %s::", method_holder()->external_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
#else
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1502
  st->print(" %s::", method_holder()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  name()->print_symbol_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  if (WizardMode) signature()->print_symbol_on(st);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1506
  else if (MethodHandles::is_signature_polymorphic(intrinsic_id()))
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13285
diff changeset
  1507
    MethodHandles::print_as_basic_type_signature_on(st, signature(), true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9134
diff changeset
  1510
// Comparer for sorting an object array containing
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1511
// Method*s.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1512
static int method_comparator(Method* a, Method* b) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1513
  return a->name()->fast_compare(b->name());
10537
23539f11e110 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 10500
diff changeset
  1514
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
// This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1517
// default_methods also uses this without the ordering for fast find_method
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1518
void Method::sort_methods(Array<Method*>* methods, bool idempotent, bool set_idnums) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  int length = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  if (length > 1) {
10002
2d83be3a0927 7016112: CMS: crash during promotion testing
brutisso
parents: 9134
diff changeset
  1521
    {
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35463
diff changeset
  1522
      NoSafepointVerifier nsv;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1523
      QuickSort::sort<Method*>(methods->data(), length, method_comparator, idempotent);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
    // Reset method ordering
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1526
    if (set_idnums) {
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1527
      for (int i = 0; i < length; i++) {
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1528
        Method* m = methods->at(i);
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1529
        m->set_method_idnum(i);
29316
5287df8a8972 8046246: the constantPoolCacheOopDesc::adjust_method_entries() used in RedefineClasses does not scale
sspitsyn
parents: 28650
diff changeset
  1530
        m->set_orig_method_idnum(i);
20391
7b146c5ebb18 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 20290
diff changeset
  1531
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
//-----------------------------------------------------------------------------------
15591
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15437
diff changeset
  1537
// Non-product code unless JVM/TI needs it
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
15591
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15437
diff changeset
  1539
#if !defined(PRODUCT) || INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
class SignatureTypePrinter : public SignatureTypeNames {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
  outputStream* _st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
  bool _use_separator;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
  void type_name(const char* name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
    if (_use_separator) _st->print(", ");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
  1547
    _st->print("%s", name);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
    _use_separator = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
 public:
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
  1552
  SignatureTypePrinter(Symbol* signature, outputStream* st) : SignatureTypeNames(signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
    _st = st;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
    _use_separator = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  void print_parameters()              { _use_separator = false; iterate_parameters(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
  void print_returntype()              { _use_separator = false; iterate_returntype(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1562
void Method::print_name(outputStream* st) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
  st->print("%s ", is_static() ? "static" : "virtual");
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1566
  if (WizardMode) {
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1567
    st->print("%s.", method_holder()->internal_name());
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1568
    name()->print_symbol_on(st);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1569
    signature()->print_symbol_on(st);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1570
  } else {
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1571
    SignatureTypePrinter sig(signature(), st);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1572
    sig.print_returntype();
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1573
    st->print(" %s.", method_holder()->internal_name());
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1574
    name()->print_symbol_on(st);
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1575
    st->print("(");
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1576
    sig.print_parameters();
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1577
    st->print(")");
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 31790
diff changeset
  1578
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
}
15591
b8aa0577f137 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 15437
diff changeset
  1580
#endif // !PRODUCT || INCLUDE_JVMTI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1583
void Method::print_codes_on(outputStream* st) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  print_codes_on(0, code_size(), st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1587
void Method::print_codes_on(int from, int to, outputStream* st) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  ResourceMark rm(thread);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1590
  methodHandle mh (thread, (Method*)this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  BytecodeStream s(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  s.set_interval(from, to);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
  BytecodeTracer::set_closure(BytecodeTracer::std_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
  while (s.next() >= 0) BytecodeTracer::trace(mh, s.bcp(), st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
// Simple compression of line number tables. We use a regular compressed stream, except that we compress deltas
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
// between (bci,line) pairs since they are smaller. If (bci delta, line delta) fits in (5-bit unsigned, 3-bit unsigned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
// we save it as one byte, otherwise we write a 0xFF escape character and use regular compression. 0x0 is used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
// as end-of-stream terminator.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
void CompressedLineNumberWriteStream::write_pair_regular(int bci_delta, int line_delta) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
  // bci and line number does not compress into single byte.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
  // Write out escape character and use regular compression for bci and line number.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  write_byte((jubyte)0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
  write_signed_int(bci_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
  write_signed_int(line_delta);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1611
// See comment in method.hpp which explains why this exists.
8303
81a0b8663748 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 8076
diff changeset
  1612
#if defined(_M_AMD64) && _MSC_VER >= 1400
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
#pragma optimize("", off)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
void CompressedLineNumberWriteStream::write_pair(int bci, int line) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
  write_pair_inline(bci, line);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
#pragma optimize("", on)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
CompressedLineNumberReadStream::CompressedLineNumberReadStream(u_char* buffer) : CompressedReadStream(buffer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
  _bci = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  _line = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
bool CompressedLineNumberReadStream::read_pair() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
  jubyte next = read_byte();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
  // Check for terminator
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  if (next == 0) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  if (next == 0xFF) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
    // Escape character, regular compression used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
    _bci  += read_signed_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
    _line += read_signed_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
    // Single byte compression used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
    _bci  += next >> 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
    _line += next & 0x7;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1643
Bytecodes::Code Method::orig_bytecode_at(int bci) const {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1644
  BreakpointInfo* bp = method_holder()->breakpoints();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  for (; bp != NULL; bp = bp->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
    if (bp->match(this, bci)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
      return bp->orig_bytecode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  }
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 20391
diff changeset
  1650
  {
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 20391
diff changeset
  1651
    ResourceMark rm;
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 31790
diff changeset
  1652
    fatal("no original bytecode found in %s at bci %d", name_and_sig_as_C_string(), bci);
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 20391
diff changeset
  1653
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  return Bytecodes::_shouldnotreachhere;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1657
void Method::set_orig_bytecode_at(int bci, Bytecodes::Code code) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
  assert(code != Bytecodes::_breakpoint, "cannot patch breakpoints this way");
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1659
  BreakpointInfo* bp = method_holder()->breakpoints();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  for (; bp != NULL; bp = bp->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
    if (bp->match(this, bci)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
      bp->set_orig_bytecode(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
      // and continue, in case there is more than one
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1668
void Method::set_breakpoint(int bci) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1669
  InstanceKlass* ik = method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
  BreakpointInfo *bp = new BreakpointInfo(this, bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  bp->set_next(ik->breakpoints());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
  ik->set_breakpoints(bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  // do this last:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
  bp->set(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1677
static void clear_matches(Method* m, int bci) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  1678
  InstanceKlass* ik = m->method_holder();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
  BreakpointInfo* prev_bp = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
  BreakpointInfo* next_bp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
  for (BreakpointInfo* bp = ik->breakpoints(); bp != NULL; bp = next_bp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
    next_bp = bp->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
    // bci value of -1 is used to delete all breakpoints in method m (ex: clear_all_breakpoint).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
    if (bci >= 0 ? bp->match(m, bci) : bp->match(m)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
      // do this first:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
      bp->clear(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
      // unhook it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
      if (prev_bp != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
        prev_bp->set_next(next_bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
      else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
        ik->set_breakpoints(next_bp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
      delete bp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
      // When class is redefined JVMTI sets breakpoint in all versions of EMCP methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
      // at same location. So we have multiple matching (method_index and bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
      // BreakpointInfo nodes in BreakpointInfo list. We should just delete one
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
      // breakpoint for clear_breakpoint request and keep all other method versions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
      // BreakpointInfo for future clear_breakpoint request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
      // bcivalue of -1 is used to clear all breakpoints (see clear_all_breakpoints)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
      // which is being called when class is unloaded. We delete all the Breakpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
      // information for all versions of method. We may not correctly restore the original
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
      // bytecode in all method versions, but that is ok. Because the class is being unloaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
      // so these methods won't be used anymore.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
      if (bci >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
      // This one is a keeper.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
      prev_bp = bp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1713
void Method::clear_breakpoint(int bci) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  assert(bci >= 0, "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  clear_matches(this, bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1718
void Method::clear_all_breakpoints() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  clear_matches(this, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1723
int Method::invocation_count() {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1724
  MethodCounters *mcs = method_counters();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1725
  if (TieredCompilation) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1726
    MethodData* const mdo = method_data();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1727
    if (((mcs != NULL) ? mcs->invocation_counter()->carry() : false) ||
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1728
        ((mdo != NULL) ? mdo->invocation_counter()->carry() : false)) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1729
      return InvocationCounter::count_limit;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1730
    } else {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1731
      return ((mcs != NULL) ? mcs->invocation_counter()->count() : 0) +
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1732
             ((mdo != NULL) ? mdo->invocation_counter()->count() : 0);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1733
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1734
  } else {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1735
    return (mcs == NULL) ? 0 : mcs->invocation_counter()->count();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1736
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1737
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1738
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1739
int Method::backedge_count() {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1740
  MethodCounters *mcs = method_counters();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1741
  if (TieredCompilation) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1742
    MethodData* const mdo = method_data();
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1743
    if (((mcs != NULL) ? mcs->backedge_counter()->carry() : false) ||
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1744
        ((mdo != NULL) ? mdo->backedge_counter()->carry() : false)) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1745
      return InvocationCounter::count_limit;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1746
    } else {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1747
      return ((mcs != NULL) ? mcs->backedge_counter()->count() : 0) +
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1748
             ((mdo != NULL) ? mdo->backedge_counter()->count() : 0);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1749
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1750
  } else {
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1751
    return (mcs == NULL) ? 0 : mcs->backedge_counter()->count();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1752
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1753
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1754
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1755
int Method::highest_comp_level() const {
26586
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1756
  const MethodCounters* mcs = method_counters();
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1757
  if (mcs != NULL) {
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1758
    return mcs->highest_comp_level();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1759
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1760
    return CompLevel_none;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1761
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1762
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1763
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1764
int Method::highest_osr_comp_level() const {
26586
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1765
  const MethodCounters* mcs = method_counters();
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1766
  if (mcs != NULL) {
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1767
    return mcs->highest_osr_comp_level();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1768
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1769
    return CompLevel_none;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1770
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1771
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1772
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1773
void Method::set_highest_comp_level(int level) {
26586
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1774
  MethodCounters* mcs = method_counters();
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1775
  if (mcs != NULL) {
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1776
    mcs->set_highest_comp_level(level);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1777
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1778
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1779
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1780
void Method::set_highest_osr_comp_level(int level) {
26586
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1781
  MethodCounters* mcs = method_counters();
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1782
  if (mcs != NULL) {
992efa57514f 8058184: Move _highest_comp_level and _highest_osr_comp_level from MethodData to MethodCounters
iveresov
parents: 25895
diff changeset
  1783
    mcs->set_highest_osr_comp_level(level);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1784
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1785
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
  1786
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1787
BreakpointInfo::BreakpointInfo(Method* m, int bci) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  _bci = bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  _name_index = m->name_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
  _signature_index = m->signature_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  _orig_bytecode = (Bytecodes::Code) *m->bcp_from(_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  if (_orig_bytecode == Bytecodes::_breakpoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
    _orig_bytecode = m->orig_bytecode_at(_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
  _next = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1797
void BreakpointInfo::set(Method* method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
    Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    if (code == Bytecodes::_breakpoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
      code = method->orig_bytecode_at(_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
    assert(orig_bytecode() == code, "original bytecode must be the same");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
#endif
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1806
  Thread *thread = Thread::current();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
  *method->bcp_from(_bci) = Bytecodes::_breakpoint;
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1808
  method->incr_number_of_breakpoints(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  SystemDictionary::notice_modification();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
    // Deoptimize all dependents on this method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
    HandleMark hm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
    methodHandle mh(thread, method);
28374
0558e321c027 8067836: The Universe::flush_foo methods belong in CodeCache.
coleenp
parents: 27923
diff changeset
  1814
    CodeCache::flush_dependents_on_method(mh);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1818
void BreakpointInfo::clear(Method* method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  *method->bcp_from(_bci) = orig_bytecode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
  assert(method->number_of_breakpoints() > 0, "must not go negative");
17000
11bf92e571a2 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 16631
diff changeset
  1821
  method->decr_number_of_breakpoints(Thread::current());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
}
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1823
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1824
// jmethodID handling
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1825
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1826
// This is a block allocating object, sort of like JNIHandleBlock, only a
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1827
// lot simpler.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1828
// It's allocated on the CHeap because once we allocate a jmethodID, we can
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1829
// never get rid of it.
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1830
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1831
static const int min_block_size = 8;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1832
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1833
class JNIMethodBlockNode : public CHeapObj<mtClass> {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1834
  friend class JNIMethodBlock;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1835
  Method**        _methods;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1836
  int             _number_of_methods;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1837
  int             _top;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1838
  JNIMethodBlockNode* _next;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1839
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1840
 public:
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1841
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1842
  JNIMethodBlockNode(int num_methods = min_block_size);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1843
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27643
diff changeset
  1844
  ~JNIMethodBlockNode() { FREE_C_HEAP_ARRAY(Method*, _methods); }
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1845
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1846
  void ensure_methods(int num_addl_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1847
    if (_top < _number_of_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1848
      num_addl_methods -= _number_of_methods - _top;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1849
      if (num_addl_methods <= 0) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1850
        return;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1851
      }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1852
    }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1853
    if (_next == NULL) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1854
      _next = new JNIMethodBlockNode(MAX2(num_addl_methods, min_block_size));
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1855
    } else {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1856
      _next->ensure_methods(num_addl_methods);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1857
    }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1858
  }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1859
};
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1860
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1861
class JNIMethodBlock : public CHeapObj<mtClass> {
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1862
  JNIMethodBlockNode _head;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1863
  JNIMethodBlockNode *_last_free;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1864
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1865
  static Method* const _free_method;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1866
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1867
  JNIMethodBlock(int initial_capacity = min_block_size)
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1868
      : _head(initial_capacity), _last_free(&_head) {}
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1869
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1870
  void ensure_methods(int num_addl_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1871
    _last_free->ensure_methods(num_addl_methods);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1872
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1873
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1874
  Method** add_method(Method* m) {
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1875
    for (JNIMethodBlockNode* b = _last_free; b != NULL; b = b->_next) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1876
      if (b->_top < b->_number_of_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1877
        // top points to the next free entry.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1878
        int i = b->_top;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1879
        b->_methods[i] = m;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1880
        b->_top++;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1881
        _last_free = b;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1882
        return &(b->_methods[i]);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1883
      } else if (b->_top == b->_number_of_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1884
        // if the next free entry ran off the block see if there's a free entry
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1885
        for (int i = 0; i < b->_number_of_methods; i++) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1886
          if (b->_methods[i] == _free_method) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1887
            b->_methods[i] = m;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1888
            _last_free = b;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1889
            return &(b->_methods[i]);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1890
          }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1891
        }
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1892
        // Only check each block once for frees.  They're very unlikely.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1893
        // Increment top past the end of the block.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1894
        b->_top++;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1895
      }
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1896
      // need to allocate a next block.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1897
      if (b->_next == NULL) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1898
        b->_next = _last_free = new JNIMethodBlockNode();
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1899
      }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1900
    }
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1901
    guarantee(false, "Should always allocate a free block");
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1902
    return NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1903
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1904
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1905
  bool contains(Method** m) {
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1906
    if (m == NULL) return false;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1907
    for (JNIMethodBlockNode* b = &_head; b != NULL; b = b->_next) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1908
      if (b->_methods <= m && m < b->_methods + b->_number_of_methods) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1909
        // This is a bit of extra checking, for two reasons.  One is
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1910
        // that contains() deals with pointers that are passed in by
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1911
        // JNI code, so making sure that the pointer is aligned
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1912
        // correctly is valuable.  The other is that <= and > are
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1913
        // technically not defined on pointers, so the if guard can
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1914
        // pass spuriously; no modern compiler is likely to make that
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1915
        // a problem, though (and if one did, the guard could also
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1916
        // fail spuriously, which would be bad).
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1917
        ptrdiff_t idx = m - b->_methods;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1918
        if (b->_methods + idx == m) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1919
          return true;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1920
        }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1921
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1922
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1923
    return false;  // not found
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1924
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1925
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1926
  // Doesn't really destroy it, just marks it as free so it can be reused.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1927
  void destroy_method(Method** m) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1928
#ifdef ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1929
    assert(contains(m), "should be a methodID");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1930
#endif // ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1931
    *m = _free_method;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1932
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1933
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1934
  // During class unloading the methods are cleared, which is different
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1935
  // than freed.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1936
  void clear_all_methods() {
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1937
    for (JNIMethodBlockNode* b = &_head; b != NULL; b = b->_next) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1938
      for (int i = 0; i< b->_number_of_methods; i++) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1939
        b->_methods[i] = NULL;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1940
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1941
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1942
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1943
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1944
  int count_methods() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1945
    // count all allocated methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1946
    int count = 0;
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1947
    for (JNIMethodBlockNode* b = &_head; b != NULL; b = b->_next) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1948
      for (int i = 0; i< b->_number_of_methods; i++) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1949
        if (b->_methods[i] != _free_method) count++;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1950
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1951
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1952
    return count;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1953
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1954
#endif // PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1955
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1956
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1957
// Something that can't be mistaken for an address or a markOop
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1958
Method* const JNIMethodBlock::_free_method = (Method*)55;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1959
27478
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1960
JNIMethodBlockNode::JNIMethodBlockNode(int num_methods) : _next(NULL), _top(0) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1961
  _number_of_methods = MAX2(num_methods, min_block_size);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1962
  _methods = NEW_C_HEAP_ARRAY(Method*, _number_of_methods, mtInternal);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1963
  for (int i = 0; i < _number_of_methods; i++) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1964
    _methods[i] = JNIMethodBlock::_free_method;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1965
  }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1966
}
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1967
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1968
void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1969
  ClassLoaderData* cld = loader_data;
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1970
  if (!SafepointSynchronize::is_at_safepoint()) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1971
    // Have to add jmethod_ids() to class loader data thread-safely.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1972
    // Also have to add the method to the list safely, which the cld lock
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1973
    // protects as well.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1974
    MutexLockerEx ml(cld->metaspace_lock(),  Mutex::_no_safepoint_check_flag);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1975
    if (cld->jmethod_ids() == NULL) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1976
      cld->set_jmethod_ids(new JNIMethodBlock(capacity));
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1977
    } else {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1978
      cld->jmethod_ids()->ensure_methods(capacity);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1979
    }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1980
  } else {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1981
    // At safepoint, we are single threaded and can set this.
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1982
    if (cld->jmethod_ids() == NULL) {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1983
      cld->set_jmethod_ids(new JNIMethodBlock(capacity));
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1984
    } else {
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1985
      cld->jmethod_ids()->ensure_methods(capacity);
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1986
    }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1987
  }
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1988
}
0eedae0228ac 8062116: JVMTI GetClassMethods is Slow
jmanson
parents: 27461
diff changeset
  1989
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1990
// Add a method id to the jmethod_ids
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1991
jmethodID Method::make_jmethod_id(ClassLoaderData* loader_data, Method* m) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1992
  ClassLoaderData* cld = loader_data;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1993
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1994
  if (!SafepointSynchronize::is_at_safepoint()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1995
    // Have to add jmethod_ids() to class loader data thread-safely.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1996
    // Also have to add the method to the list safely, which the cld lock
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1997
    // protects as well.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1998
    MutexLockerEx ml(cld->metaspace_lock(),  Mutex::_no_safepoint_check_flag);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  1999
    if (cld->jmethod_ids() == NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2000
      cld->set_jmethod_ids(new JNIMethodBlock());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2001
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2002
    // jmethodID is a pointer to Method*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2003
    return (jmethodID)cld->jmethod_ids()->add_method(m);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2004
  } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2005
    // At safepoint, we are single threaded and can set this.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2006
    if (cld->jmethod_ids() == NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2007
      cld->set_jmethod_ids(new JNIMethodBlock());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2008
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2009
    // jmethodID is a pointer to Method*
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2010
    return (jmethodID)cld->jmethod_ids()->add_method(m);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2011
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2012
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2013
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2014
// Mark a jmethodID as free.  This is called when there is a data race in
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2015
// InstanceKlass while creating the jmethodID cache.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2016
void Method::destroy_jmethod_id(ClassLoaderData* loader_data, jmethodID m) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2017
  ClassLoaderData* cld = loader_data;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2018
  Method** ptr = (Method**)m;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2019
  assert(cld->jmethod_ids() != NULL, "should have method handles");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2020
  cld->jmethod_ids()->destroy_method(ptr);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2021
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2022
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2023
void Method::change_method_associated_with_jmethod_id(jmethodID jmid, Method* new_method) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2024
  // Can't assert the method_holder is the same because the new method has the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2025
  // scratch method holder.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2026
  assert(resolve_jmethod_id(jmid)->method_holder()->class_loader()
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2027
           == new_method->method_holder()->class_loader(),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2028
         "changing to a different class loader");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2029
  // Just change the method in place, jmethodID pointer doesn't change.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2030
  *((Method**)jmid) = new_method;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2031
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2032
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2033
bool Method::is_method_id(jmethodID mid) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2034
  Method* m = resolve_jmethod_id(mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2035
  assert(m != NULL, "should be called with non-null method");
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 14386
diff changeset
  2036
  InstanceKlass* ik = m->method_holder();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2037
  ClassLoaderData* cld = ik->class_loader_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2038
  if (cld->jmethod_ids() == NULL) return false;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2039
  return (cld->jmethod_ids()->contains((Method**)mid));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2040
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2041
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2042
Method* Method::checked_resolve_jmethod_id(jmethodID mid) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2043
  if (mid == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2044
  Method* o = resolve_jmethod_id(mid);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2045
  if (o == NULL || o == JNIMethodBlock::_free_method || !((Metadata*)o)->is_method()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2046
    return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2047
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2048
  return o;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2049
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2050
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2051
void Method::set_on_stack(const bool value) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2052
  // Set both the method itself and its constant pool.  The constant pool
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2053
  // on stack means some method referring to it is also on the stack.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2054
  constants()->set_on_stack(value);
27247
99db666dbe8e 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 26799
diff changeset
  2055
29576
c223b0a9872e 8061205: MetadataOnStackMark only needs to walk code cache during class redefinition
coleenp
parents: 29316
diff changeset
  2056
  bool already_set = on_stack();
c223b0a9872e 8061205: MetadataOnStackMark only needs to walk code cache during class redefinition
coleenp
parents: 29316
diff changeset
  2057
  _access_flags.set_on_stack(value);
c223b0a9872e 8061205: MetadataOnStackMark only needs to walk code cache during class redefinition
coleenp
parents: 29316
diff changeset
  2058
  if (value && !already_set) {
c223b0a9872e 8061205: MetadataOnStackMark only needs to walk code cache during class redefinition
coleenp
parents: 29316
diff changeset
  2059
    MetadataOnStackMark::record(this);
27247
99db666dbe8e 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 26799
diff changeset
  2060
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2061
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2062
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2063
// Called when the class loader is unloaded to make all methods weak.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2064
void Method::clear_jmethod_ids(ClassLoaderData* loader_data) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2065
  loader_data->jmethod_ids()->clear_all_methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2066
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2067
24457
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24456
diff changeset
  2068
bool Method::has_method_vptr(const void* ptr) {
35937
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2069
  Method m;
24457
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24456
diff changeset
  2070
  // This assumes that the vtbl pointer is the first word of a C++ object.
35937
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2071
  // This assumption is also in universe.cpp patch_klass_vtble
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2072
  return dereference_vptr(&m) == dereference_vptr(ptr);
24457
0e20b36df5c4 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 24456
diff changeset
  2073
}
14579
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2074
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2075
// Check that this pointer is valid by checking that the vtbl pointer matches
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2076
bool Method::is_valid_method() const {
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2077
  if (this == NULL) {
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2078
    return false;
35937
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2079
  } else if ((intptr_t(this) & (wordSize-1)) != 0) {
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2080
    // Quick sanity check on pointer.
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2081
    return false;
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2082
  } else if (!is_metaspace_object()) {
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2083
    return false;
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2084
  } else {
ee146fa2923b 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
coleenp
parents: 35920
diff changeset
  2085
    return has_method_vptr((const void*)this);
35920
a107472364cc 8146984: SIGBUS: bool Method::has_method_vptr(const void*)+0xc
coleenp
parents: 35913
diff changeset
  2086
  }
14579
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2087
}
7f6ce6e3dd80 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 14488
diff changeset
  2088
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2089
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2090
void Method::print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2091
  out->print_cr("jni_method_id count = %d", loader_data->jmethod_ids()->count_methods());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2092
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2093
#endif // PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2094
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2095
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2096
// Printing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2097
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2098
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2099
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2100
void Method::print_on(outputStream* st) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2101
  ResourceMark rm;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2102
  assert(is_method(), "must be method");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
  2103
  st->print_cr("%s", internal_name());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2104
  // get the effect of PrintOopAddress, always, for methods:
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2105
  st->print_cr(" - this oop:          " INTPTR_FORMAT, p2i(this));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2106
  st->print   (" - method holder:     "); method_holder()->print_value_on(st); st->cr();
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2107
  st->print   (" - constants:         " INTPTR_FORMAT " ", p2i(constants()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2108
  constants()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2109
  st->print   (" - access:            0x%x  ", access_flags().as_int()); access_flags().print_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2110
  st->print   (" - name:              ");    name()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2111
  st->print   (" - signature:         ");    signature()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2112
  st->print_cr(" - max stack:         %d",   max_stack());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2113
  st->print_cr(" - max locals:        %d",   max_locals());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2114
  st->print_cr(" - size of params:    %d",   size_of_parameters());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2115
  st->print_cr(" - method size:       %d",   method_size());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2116
  if (intrinsic_id() != vmIntrinsics::_none)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2117
    st->print_cr(" - intrinsic id:      %d %s", intrinsic_id(), vmIntrinsics::name_at(intrinsic_id()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2118
  if (highest_comp_level() != CompLevel_none)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2119
    st->print_cr(" - highest level:     %d", highest_comp_level());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2120
  st->print_cr(" - vtable index:      %d",   _vtable_index);
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2121
  st->print_cr(" - i2i entry:         " INTPTR_FORMAT, p2i(interpreter_entry()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2122
  st->print(   " - adapters:          ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2123
  AdapterHandlerEntry* a = ((Method*)this)->adapter();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2124
  if (a == NULL)
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2125
    st->print_cr(INTPTR_FORMAT, p2i(a));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2126
  else
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2127
    a->print_adapter_on(st);
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2128
  st->print_cr(" - compiled entry     " INTPTR_FORMAT, p2i(from_compiled_entry()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2129
  st->print_cr(" - code size:         %d",   code_size());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2130
  if (code_size() != 0) {
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2131
    st->print_cr(" - code start:        " INTPTR_FORMAT, p2i(code_base()));
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2132
    st->print_cr(" - code end (excl):   " INTPTR_FORMAT, p2i(code_base() + code_size()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2133
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2134
  if (method_data() != NULL) {
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2135
    st->print_cr(" - method data:       " INTPTR_FORMAT, p2i(method_data()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2136
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2137
  st->print_cr(" - checked ex length: %d",   checked_exceptions_length());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2138
  if (checked_exceptions_length() > 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2139
    CheckedExceptionElement* table = checked_exceptions_start();
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2140
    st->print_cr(" - checked ex start:  " INTPTR_FORMAT, p2i(table));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2141
    if (Verbose) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2142
      for (int i = 0; i < checked_exceptions_length(); i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2143
        st->print_cr("   - throws %s", constants()->printable_name_at(table[i].class_cp_index));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2144
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2145
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2146
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2147
  if (has_linenumber_table()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2148
    u_char* table = compressed_linenumber_table();
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2149
    st->print_cr(" - linenumber start:  " INTPTR_FORMAT, p2i(table));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2150
    if (Verbose) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2151
      CompressedLineNumberReadStream stream(table);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2152
      while (stream.read_pair()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2153
        st->print_cr("   - line %d: %d", stream.line(), stream.bci());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2154
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2155
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2156
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2157
  st->print_cr(" - localvar length:   %d",   localvariable_table_length());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2158
  if (localvariable_table_length() > 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2159
    LocalVariableTableElement* table = localvariable_table_start();
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2160
    st->print_cr(" - localvar start:    " INTPTR_FORMAT, p2i(table));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2161
    if (Verbose) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2162
      for (int i = 0; i < localvariable_table_length(); i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2163
        int bci = table[i].start_bci;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2164
        int len = table[i].length;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2165
        const char* name = constants()->printable_name_at(table[i].name_cp_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2166
        const char* desc = constants()->printable_name_at(table[i].descriptor_cp_index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2167
        int slot = table[i].slot;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2168
        st->print_cr("   - %s %s bci=%d len=%d slot=%d", desc, name, bci, len, slot);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2169
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2170
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2171
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2172
  if (code() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2173
    st->print   (" - compiled code: ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2174
    code()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2175
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2176
  if (is_native()) {
33148
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2177
    st->print_cr(" - native function:   " INTPTR_FORMAT, p2i(native_function()));
68fa8b6c4340 8042893: compiler: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 33105
diff changeset
  2178
    st->print_cr(" - signature handler: " INTPTR_FORMAT, p2i(signature_handler()));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2179
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2180
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2181
35463
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2182
void Method::print_linkage_flags(outputStream* st) {
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2183
  access_flags().print_on(st);
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2184
  if (is_default_method()) {
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2185
    st->print("default ");
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2186
  }
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2187
  if (is_overpass()) {
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2188
    st->print("overpass ");
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2189
  }
b32e362563bb 8141564: Convert TraceItables and PrintVtables to Unified Logging
rprotacio
parents: 34666
diff changeset
  2190
}
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2191
#endif //PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2192
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2193
void Method::print_value_on(outputStream* st) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2194
  assert(is_method(), "must be method");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
  2195
  st->print("%s", internal_name());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2196
  print_address_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2197
  st->print(" ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2198
  name()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2199
  st->print(" ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2200
  signature()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2201
  st->print(" in ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2202
  method_holder()->print_value_on(st);
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19720
diff changeset
  2203
  if (WizardMode) st->print("#%d", _vtable_index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2204
  if (WizardMode) st->print("[%d,%d]", size_of_parameters(), max_locals());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2205
  if (WizardMode && code() != NULL) st->print(" ((nmethod*)%p)", code());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2206
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2207
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2208
#if INCLUDE_SERVICES
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2209
// Size Statistics
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2210
void Method::collect_statistics(KlassSizeStats *sz) const {
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2211
  int mysize = sz->count(this);
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2212
  sz->_method_bytes += mysize;
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2213
  sz->_method_all_bytes += mysize;
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2214
  sz->_rw_bytes += mysize;
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2215
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2216
  if (constMethod()) {
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2217
    constMethod()->collect_statistics(sz);
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2218
  }
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2219
  if (method_data()) {
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2220
    method_data()->collect_statistics(sz);
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2221
  }
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2222
}
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 15430
diff changeset
  2223
#endif // INCLUDE_SERVICES
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2224
31790
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2225
// LogTouchedMethods and PrintTouchedMethods
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2226
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2227
// TouchedMethodRecord -- we can't use a HashtableEntry<Method*> because
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2228
// the Method may be garbage collected. Let's roll our own hash table.
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2229
class TouchedMethodRecord : CHeapObj<mtTracing> {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2230
public:
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2231
  // It's OK to store Symbols here because they will NOT be GC'ed if
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2232
  // LogTouchedMethods is enabled.
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2233
  TouchedMethodRecord* _next;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2234
  Symbol* _class_name;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2235
  Symbol* _method_name;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2236
  Symbol* _method_signature;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2237
};
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2238
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2239
static const int TOUCHED_METHOD_TABLE_SIZE = 20011;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2240
static TouchedMethodRecord** _touched_method_table = NULL;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2241
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2242
void Method::log_touched(TRAPS) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2243
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2244
  const int table_size = TOUCHED_METHOD_TABLE_SIZE;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2245
  Symbol* my_class = klass_name();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2246
  Symbol* my_name  = name();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2247
  Symbol* my_sig   = signature();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2248
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2249
  unsigned int hash = my_class->identity_hash() +
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2250
                      my_name->identity_hash() +
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2251
                      my_sig->identity_hash();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2252
  juint index = juint(hash) % table_size;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2253
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2254
  MutexLocker ml(TouchedMethodLog_lock, THREAD);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2255
  if (_touched_method_table == NULL) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2256
    _touched_method_table = NEW_C_HEAP_ARRAY2(TouchedMethodRecord*, table_size,
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2257
                                              mtTracing, CURRENT_PC);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2258
    memset(_touched_method_table, 0, sizeof(TouchedMethodRecord*)*table_size);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2259
  }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2260
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2261
  TouchedMethodRecord* ptr = _touched_method_table[index];
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2262
  while (ptr) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2263
    if (ptr->_class_name       == my_class &&
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2264
        ptr->_method_name      == my_name &&
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2265
        ptr->_method_signature == my_sig) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2266
      return;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2267
    }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2268
    if (ptr->_next == NULL) break;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2269
    ptr = ptr->_next;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2270
  }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2271
  TouchedMethodRecord* nptr = NEW_C_HEAP_OBJ(TouchedMethodRecord, mtTracing);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2272
  my_class->set_permanent();  // prevent reclaimed by GC
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2273
  my_name->set_permanent();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2274
  my_sig->set_permanent();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2275
  nptr->_class_name         = my_class;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2276
  nptr->_method_name        = my_name;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2277
  nptr->_method_signature   = my_sig;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2278
  nptr->_next               = NULL;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2279
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2280
  if (ptr == NULL) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2281
    // first
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2282
    _touched_method_table[index] = nptr;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2283
  } else {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2284
    ptr->_next = nptr;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2285
  }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2286
}
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2287
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2288
void Method::print_touched_methods(outputStream* out) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2289
  MutexLockerEx ml(Thread::current()->is_VM_thread() ? NULL : TouchedMethodLog_lock);
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2290
  out->print_cr("# Method::print_touched_methods version 1");
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2291
  if (_touched_method_table) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2292
    for (int i = 0; i < TOUCHED_METHOD_TABLE_SIZE; i++) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2293
      TouchedMethodRecord* ptr = _touched_method_table[i];
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2294
      while(ptr) {
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2295
        ptr->_class_name->print_symbol_on(out);       out->print(".");
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2296
        ptr->_method_name->print_symbol_on(out);      out->print(":");
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2297
        ptr->_method_signature->print_symbol_on(out); out->cr();
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2298
        ptr = ptr->_next;
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2299
      }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2300
    }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2301
  }
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2302
}
4a08476437e8 8025692: Log what methods are touched at run-time
minqi
parents: 31593
diff changeset
  2303
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2304
// Verification
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2305
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2306
void Method::verify_on(outputStream* st) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2307
  guarantee(is_method(), "object must be method");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2308
  guarantee(constants()->is_constantPool(), "should be constant pool");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2309
  guarantee(constMethod()->is_constMethod(), "should be ConstMethod*");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2310
  MethodData* md = method_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2311
  guarantee(md == NULL ||
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2312
      md->is_methodData(), "should be method data");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13392
diff changeset
  2313
}