hotspot/src/share/vm/oops/klass.hpp
author tschatzl
Thu, 28 Jan 2016 13:30:12 +0100
changeset 35877 a2a62511d0f8
parent 35135 dd2ce9021031
child 35898 ddc274f0052f
permissions -rw-r--r--
8146987: Improve Parallel GC Full GC by caching results of live_words_in_range() Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value. Reviewed-by: tschatzl, mgerdin, jmasa Contributed-by: ray alex <sky1young@gmail.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35135
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: 4584
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4584
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: 4584
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    25
#ifndef SHARE_VM_OOPS_KLASS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    26
#define SHARE_VM_OOPS_KLASS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30150
diff changeset
    28
#include "gc/shared/specialized_oop_closures.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    29
#include "memory/iterator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    30
#include "memory/memRegion.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    31
#include "oops/metadata.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    32
#include "oops/oop.hpp"
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 8725
diff changeset
    33
#include "trace/traceMacros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    34
#include "utilities/accessFlags.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14816
diff changeset
    35
#include "utilities/macros.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    36
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    37
//
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    38
// A Klass provides:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//  1: language level class object (method dictionary etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//  2: provide vm dispatch behavior for the object
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    41
// Both functions are combined into one C++ class.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// One reason for the oop/klass dichotomy in the implementation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// that we don't want a C++ vtbl pointer in every object.  Thus,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// normal oops don't have any virtual functions.  Instead, they
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// forward all "virtual" functions to their klass, which does have
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// a vtbl and does the C++ dispatch depending on the object's
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// actual type.  (See oop.inline.hpp for some of the forwarding code.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// ALL FUNCTIONS IMPLEMENTING THIS DISPATCH ARE PREFIXED WITH "oop_"!
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// Forward declarations.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    52
template <class T> class Array;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    53
template <class T> class GrowableArray;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    54
class ClassLoaderData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class klassVtable;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    56
class ParCompactionManager;
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
    57
class PSPromotionManager;
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 14816
diff changeset
    58
class KlassSizeStats;
27020
a7c8010446c2 8036805: Correct linker method lookup.
lfoltan
parents: 26412
diff changeset
    59
class fieldDescriptor;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    61
class Klass : public Metadata {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  friend class VMStructs;
35123
b0b89d83bcf5 8134994: use separate VMStructs databases for SA and JVMCI
twisti
parents: 33611
diff changeset
    63
  friend class JVMCIVMStructs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  // note: put frequently-used fields together at start of klass structure
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // for better cache behavior (may not make much of a difference but sure won't hurt)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  enum { _primary_super_limit = 8 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  // The "layout helper" is a combined descriptor of object layout.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // For klasses which are neither instance nor array, the value is zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  // For instances, layout helper is a positive number, the instance size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // This size is already passed through align_object_size and scaled to bytes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // The low order bit is set if instances of this class cannot be
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // allocated using the fastpath.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // For arrays, layout helper is a negative number, containing four
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // distinct bytes, as follows:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  //    MSB:[tag, hsz, ebt, log2(esz)]:LSB
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // where:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  //    tag is 0x80 if the elements are oops, 0xC0 if non-oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  //    hsz is array header size in bytes (i.e., offset of first element)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  //    ebt is the BasicType of the elements
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  //    esz is the element size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // This packed word is arranged so as to be quickly unpacked by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // various fast paths that use the various subfields.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // The esz bits can be used directly by a SLL instruction, without masking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // Note that the array-kind tag looks like 0x00 for instance klasses,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // since their length in bytes is always less than 24Mb.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  //
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
    93
  // Final note:  This comes first, immediately after C++ vtable,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // because it is frequently queried.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  jint        _layout_helper;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // The fields _super_check_offset, _secondary_super_cache, _secondary_supers
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // and _primary_supers all help make fast subtype checks.  See big discussion
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // in doc/server_compiler/checktype.txt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  // Where to look to observe a supertype (it is &_secondary_super_cache for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // secondary supers, else is &_primary_supers[depth()].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  juint       _super_check_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   105
  // Class name.  Instance classes: java/lang/String, etc.  Array classes: [I,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   106
  // [Ljava/lang/String;, etc.  Set to zero for all other kinds of classes.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   107
  Symbol*     _name;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   108
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Cache of last observed secondary supertype
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   110
  Klass*      _secondary_super_cache;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // Array of all secondary supertypes
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   112
  Array<Klass*>* _secondary_supers;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // Ordered list of all primary supertypes
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   114
  Klass*      _primary_supers[_primary_super_limit];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // java/lang/Class instance mirroring this class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  oop       _java_mirror;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // Superclass
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   118
  Klass*      _super;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // First subclass (NULL if none); _subklass->next_sibling() is next one
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   120
  Klass*      _subklass;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Sibling link (or NULL); links all subklasses of a klass
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   122
  Klass*      _next_sibling;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   124
  // All klasses loaded by a class loader are chained through these links
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   125
  Klass*      _next_link;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   126
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   127
  // The VM's representation of the ClassLoader used to load this class.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   128
  // Provide access the corresponding instance java.lang.ClassLoader.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   129
  ClassLoaderData* _class_loader_data;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  jint        _modifier_flags;  // Processed access flags, for use by Class.getModifiers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  AccessFlags _access_flags;    // Access flags. The class/interface distinction is stored here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
15449
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   134
  // Biased locking implementation and statistics
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   135
  // (the 64-bit chunk goes first, to avoid some fragmentation)
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   136
  jlong    _last_biased_lock_bulk_revocation_time;
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   137
  markOop  _prototype_header;   // Used when biased locking is both enabled and disabled for this type
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   138
  jint     _biased_lock_revocation_count;
262003a04c6f 8006280: Need to reorder metadata structures to reduce size (64-bit)
iklam
parents: 14816
diff changeset
   139
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 8725
diff changeset
   140
  TRACE_DEFINE_KLASS_TRACE_ID;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   141
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   142
  // Remembered sets support for the oops in the klasses.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   143
  jbyte _modified_oops;             // Card Table Equivalent (YC/CMS support)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   144
  jbyte _accumulated_modified_oops; // Mod Union Equivalent (CMS support)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   146
private:
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   147
  // This is an index into FileMapHeader::_classpath_entry_table[], to
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   148
  // associate this class with the JAR file where it's loaded from during
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   149
  // dump time. If a class is not loaded from the shared archive, this field is
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   150
  // -1.
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   151
  jshort _shared_class_path_index;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   152
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   153
  friend class SharedClassUtil;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   154
protected:
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   155
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   156
  // Constructor
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   157
  Klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   158
19696
bd5a0131bde1 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 19348
diff changeset
   159
  void* operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
 public:
28731
f7339cba0a6a 8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest.
lfoltan
parents: 27020
diff changeset
   162
  enum DefaultsLookupMode { find_defaults, skip_defaults };
f7339cba0a6a 8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest.
lfoltan
parents: 27020
diff changeset
   163
  enum OverpassLookupMode { find_overpass, skip_overpass };
f7339cba0a6a 8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest.
lfoltan
parents: 27020
diff changeset
   164
  enum StaticLookupMode   { find_static,   skip_static };
32189
5264b560ab1b 8087342: Crash in klassItable::initialize_itable_for_interface
acorn
parents: 30880
diff changeset
   165
  enum PrivateLookupMode  { find_private,  skip_private };
23999
22eb7be3d99d 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 23515
diff changeset
   166
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   167
  bool is_klass() const volatile { return true; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // super
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   170
  Klass* super() const               { return _super; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   171
  void set_super(Klass* k)           { _super = k; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // initializes _super link, _primary_supers & _secondary_supers arrays
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   174
  void initialize_supers(Klass* k, TRAPS);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   175
  void initialize_supers_impl1(Klass* k);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   176
  void initialize_supers_impl2(Klass* k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // klass-specific helper for initializing _secondary_supers
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   179
  virtual GrowableArray<Klass*>* compute_secondary_supers(int num_extra_slots);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // java_super is the Java-level super type as specified by Class.getSuperClass.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   182
  virtual Klass* java_super() const  { return NULL; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  juint    super_check_offset() const  { return _super_check_offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  void set_super_check_offset(juint o) { _super_check_offset = o; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   187
  Klass* secondary_super_cache() const     { return _secondary_super_cache; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   188
  void set_secondary_super_cache(Klass* k) { _secondary_super_cache = k; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   190
  Array<Klass*>* secondary_supers() const { return _secondary_supers; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   191
  void set_secondary_supers(Array<Klass*>* k) { _secondary_supers = k; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Return the element of the _super chain of the given depth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // If there is no such element, return either NULL or this.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   195
  Klass* primary_super_of_depth(juint i) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    assert(i < primary_super_limit(), "oob");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   197
    Klass* super = _primary_supers[i];
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   198
    assert(super == NULL || super->super_depth() == i, "correct display");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    return super;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // Can this klass be a primary super?  False for interfaces and arrays of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // interfaces.  False also for arrays or classes with long super chains.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  bool can_be_primary_super() const {
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 8725
diff changeset
   205
    const juint secondary_offset = in_bytes(secondary_super_cache_offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    return super_check_offset() != secondary_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  virtual bool can_be_primary_super_slow() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Returns number of primary supers; may be a number in the inclusive range [0, primary_super_limit].
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  juint super_depth() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    if (!can_be_primary_super()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
      return primary_super_limit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   215
      juint d = (super_check_offset() - in_bytes(primary_supers_offset())) / sizeof(Klass*);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
      assert(d < primary_super_limit(), "oob");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   217
      assert(_primary_supers[d] == this, "proper init");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
      return d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   222
  // store an oop into a field of a Klass
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   223
  void klass_oop_store(oop* p, oop v);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   224
  void klass_oop_store(volatile oop* p, oop v);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   225
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  // java mirror
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  oop java_mirror() const              { return _java_mirror; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   228
  void set_java_mirror(oop m) { klass_oop_store(&_java_mirror, m); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // modifier flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  jint modifier_flags() const          { return _modifier_flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  void set_modifier_flags(jint flags)  { _modifier_flags = flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // size helper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  int layout_helper() const            { return _layout_helper; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  void set_layout_helper(int lh)       { _layout_helper = lh; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // Note: for instances layout_helper() may include padding.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   239
  // Use InstanceKlass::contains_field_offset to classify field offsets.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // sub/superklass links
23515
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 22908
diff changeset
   242
  Klass* subklass() const              { return _subklass; }
f4872ef5df09 8031820: NPG: Fix remaining references to metadata as oops in comments
coleenp
parents: 22908
diff changeset
   243
  Klass* next_sibling() const          { return _next_sibling; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   244
  InstanceKlass* superklass() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  void append_to_sibling_list();           // add newly created receiver to superklass' subklass list
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   246
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   247
  void set_next_link(Klass* k) { _next_link = k; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   248
  Klass* next_link() const { return _next_link; }   // The next klass defined by the class loader.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   249
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   250
  // class loader data
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   251
  ClassLoaderData* class_loader_data() const               { return _class_loader_data; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   252
  void set_class_loader_data(ClassLoaderData* loader_data) {  _class_loader_data = loader_data; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   254
  // The Klasses are not placed in the Heap, so the Card Table or
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   255
  // the Mod Union Table can't be used to mark when klasses have modified oops.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   256
  // The CT and MUT bits saves this information for the individual Klasses.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   257
  void record_modified_oops()            { _modified_oops = 1; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   258
  void clear_modified_oops()             { _modified_oops = 0; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   259
  bool has_modified_oops()               { return _modified_oops == 1; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   260
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   261
  void accumulate_modified_oops()        { if (has_modified_oops()) _accumulated_modified_oops = 1; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   262
  void clear_accumulated_modified_oops() { _accumulated_modified_oops = 0; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   263
  bool has_accumulated_modified_oops()   { return _accumulated_modified_oops == 1; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   264
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   265
  int shared_classpath_index() const   {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   266
    return _shared_class_path_index;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   267
  };
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   268
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   269
  void set_shared_classpath_index(int index) {
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   270
    _shared_class_path_index = index;
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   271
  };
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   272
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   273
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   274
 protected:                                // internal accessors
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   275
  void     set_subklass(Klass* s);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   276
  void     set_next_sibling(Klass* s);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // Compiler support
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   281
  static ByteSize super_offset()                 { return in_ByteSize(offset_of(Klass, _super)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   282
  static ByteSize super_check_offset_offset()    { return in_ByteSize(offset_of(Klass, _super_check_offset)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   283
  static ByteSize primary_supers_offset()        { return in_ByteSize(offset_of(Klass, _primary_supers)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   284
  static ByteSize secondary_super_cache_offset() { return in_ByteSize(offset_of(Klass, _secondary_super_cache)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   285
  static ByteSize secondary_supers_offset()      { return in_ByteSize(offset_of(Klass, _secondary_supers)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   286
  static ByteSize java_mirror_offset()           { return in_ByteSize(offset_of(Klass, _java_mirror)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   287
  static ByteSize modifier_flags_offset()        { return in_ByteSize(offset_of(Klass, _modifier_flags)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   288
  static ByteSize layout_helper_offset()         { return in_ByteSize(offset_of(Klass, _layout_helper)); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   289
  static ByteSize access_flags_offset()          { return in_ByteSize(offset_of(Klass, _access_flags)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // Unpacking layout_helper:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    _lh_neutral_value           = 0,  // neutral non-array non-instance value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    _lh_instance_slow_path_bit  = 0x01,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    _lh_log2_element_size_shift = BitsPerByte*0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
    _lh_log2_element_size_mask  = BitsPerLong-1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    _lh_element_type_shift      = BitsPerByte*1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    _lh_element_type_mask       = right_n_bits(BitsPerByte),  // shifted mask
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    _lh_header_size_shift       = BitsPerByte*2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    _lh_header_size_mask        = right_n_bits(BitsPerByte),  // shifted mask
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    _lh_array_tag_bits          = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    _lh_array_tag_shift         = BitsPerInt - _lh_array_tag_bits,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    _lh_array_tag_type_value    = ~0x00,  // 0xC0000000 >> 30
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    _lh_array_tag_obj_value     = ~0x01   // 0x80000000 >> 30
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  static int layout_helper_size_in_bytes(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    assert(lh > (jint)_lh_neutral_value, "must be instance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    return (int) lh & ~_lh_instance_slow_path_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  static bool layout_helper_needs_slow_path(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    assert(lh > (jint)_lh_neutral_value, "must be instance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    return (lh & _lh_instance_slow_path_bit) != 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  static bool layout_helper_is_instance(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    return (jint)lh > (jint)_lh_neutral_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   318
  static bool layout_helper_is_array(jint lh) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    return (jint)lh < (jint)_lh_neutral_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  static bool layout_helper_is_typeArray(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    // _lh_array_tag_type_value == (lh >> _lh_array_tag_shift);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    return (juint)lh >= (juint)(_lh_array_tag_type_value << _lh_array_tag_shift);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  static bool layout_helper_is_objArray(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    // _lh_array_tag_obj_value == (lh >> _lh_array_tag_shift);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    return (jint)lh < (jint)(_lh_array_tag_type_value << _lh_array_tag_shift);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  static int layout_helper_header_size(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    assert(lh < (jint)_lh_neutral_value, "must be array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    int hsize = (lh >> _lh_header_size_shift) & _lh_header_size_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    assert(hsize > 0 && hsize < (int)sizeof(oopDesc)*3, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    return hsize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  static BasicType layout_helper_element_type(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    assert(lh < (jint)_lh_neutral_value, "must be array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    int btvalue = (lh >> _lh_element_type_shift) & _lh_element_type_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    assert(btvalue >= T_BOOLEAN && btvalue <= T_OBJECT, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    return (BasicType) btvalue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  static int layout_helper_log2_element_size(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    assert(lh < (jint)_lh_neutral_value, "must be array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    int l2esz = (lh >> _lh_log2_element_size_shift) & _lh_log2_element_size_mask;
19342
f3957eba8935 8023227: Enhance layout_helper_log2_element_size assert
stefank
parents: 18687
diff changeset
   344
    assert(l2esz <= LogBitsPerLong,
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 32606
diff changeset
   345
           "sanity. l2esz: 0x%x for lh: 0x%x", (uint)l2esz, (uint)lh);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    return l2esz;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  static jint array_layout_helper(jint tag, int hsize, BasicType etype, int log2_esize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    return (tag        << _lh_array_tag_shift)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      |    (hsize      << _lh_header_size_shift)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      |    ((int)etype << _lh_element_type_shift)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
      |    (log2_esize << _lh_log2_element_size_shift);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  static jint instance_layout_helper(jint size, bool slow_path_flag) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    return (size << LogHeapWordSize)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
      |    (slow_path_flag ? _lh_instance_slow_path_bit : 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  static int layout_helper_to_size_helper(jint lh) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    assert(lh > (jint)_lh_neutral_value, "must be instance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    // Note that the following expression discards _lh_instance_slow_path_bit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    return lh >> LogHeapWordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // Out-of-line version computes everything based on the etype:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  static jint array_layout_helper(BasicType etype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  // What is the maximum number of primary superclasses any klass can have?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
#ifdef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  static juint primary_super_limit()         { return _primary_super_limit; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  static juint primary_super_limit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    assert(FastSuperclassLimit <= _primary_super_limit, "parameter oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    return FastSuperclassLimit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  // vtables
33602
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33151
diff changeset
   377
  virtual klassVtable* vtable() const = 0;
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33151
diff changeset
   378
  virtual int vtable_length() const = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  // subclass check
17370
59a0620561fa 8003557: NPG: Klass* const k should be const Klass* k.
minqi
parents: 15928
diff changeset
   381
  bool is_subclass_of(const Klass* k) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  // subtype check: true if is_subclass_of, or if k is interface and receiver implements it
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   383
  bool is_subtype_of(Klass* k) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   384
    juint    off = k->super_check_offset();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   385
    Klass* sup = *(Klass**)( (address)this + off );
11430
718fc06da49a 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 8725
diff changeset
   386
    const juint secondary_offset = in_bytes(secondary_super_cache_offset());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    if (sup == k) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
    } else if (off != secondary_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      return search_secondary_supers(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   395
  bool search_secondary_supers(Klass* k) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1894
diff changeset
   397
  // Find LCA in class hierarchy
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  Klass *LCA( Klass *k );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  // Check whether reflection/jni/jvm code is allowed to instantiate this class;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // if not, throw either an Error or an Exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  virtual void check_valid_for_instantiation(bool throwError, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  // array copying
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  virtual void  copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // tells if the class should be initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  virtual bool should_be_initialized() const    { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // initializes the klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  virtual void initialize(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // lookup operation for MethodLookupCache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  friend class MethodLookupCache;
27020
a7c8010446c2 8036805: Correct linker method lookup.
lfoltan
parents: 26412
diff changeset
   413
  virtual Klass* find_field(Symbol* name, Symbol* signature, fieldDescriptor* fd) const;
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33611
diff changeset
   414
  virtual Method* uncached_lookup_method(const Symbol* name, const Symbol* signature, OverpassLookupMode overpass_mode) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
 public:
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33611
diff changeset
   416
  Method* lookup_method(const Symbol* name, const Symbol* signature) const {
28731
f7339cba0a6a 8067480: Crash in klassItable::initialize_itable_for_interface when running vm.runtime.defmeth.StaticMethodsTest.
lfoltan
parents: 27020
diff changeset
   417
    return uncached_lookup_method(name, signature, find_overpass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  // array class with specific rank
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   421
  Klass* array_klass(int rank, TRAPS)         {  return array_klass_impl(false, rank, THREAD); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // array class with this klass as element type
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   424
  Klass* array_klass(TRAPS)                   {  return array_klass_impl(false, THREAD); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // These will return NULL instead of allocating on the heap:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // NB: these can block for a mutex, like other functions with TRAPS arg.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   428
  Klass* array_klass_or_null(int rank);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   429
  Klass* array_klass_or_null();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
17826
9ad5cd464a75 8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents: 17373
diff changeset
   431
  virtual oop protection_domain() const = 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   432
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   433
  oop class_loader() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
14816
f2935b95cb54 8004883: NPG: clean up anonymous class fix
coleenp
parents: 14588
diff changeset
   435
  virtual oop klass_holder() const      { return class_loader(); }
f2935b95cb54 8004883: NPG: clean up anonymous class fix
coleenp
parents: 14588
diff changeset
   436
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
 protected:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   438
  virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   439
  virtual Klass* array_klass_impl(bool or_null, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
 public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   442
  // CDS support - remove and restore oops from metadata. Oops are not shared.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  virtual void remove_unshareable_info();
26135
82b516c550f7 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 25492
diff changeset
   444
  virtual void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // computes the subtype relationship
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   448
  virtual bool compute_is_subtype_of(Klass* k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // subclass accessor (here for convenience; undefined for non-klass objects)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  virtual bool is_leaf_class() const { fatal("not a class"); return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // ALL FUNCTIONS BELOW THIS POINT ARE DISPATCHED FROM AN OOP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  // These functions describe behavior for the oop not the KLASS.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // actual oop size of obj in memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  virtual int oop_size(oop obj) const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   459
  // Size of klass in word size.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   460
  virtual int size() const = 0;
15437
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 14816
diff changeset
   461
#if INCLUDE_SERVICES
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 14816
diff changeset
   462
  virtual void collect_statistics(KlassSizeStats *sz) const;
eabd4555d072 6479360: PrintClassHistogram improvements
acorn
parents: 14816
diff changeset
   463
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  // Returns the Java name for a class (Resource allocated)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  // For arrays, this returns the name of the element with a leading '['.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // For classes, this returns the name with the package separators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  //     turned into '.'s.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  const char* external_name() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // Returns the name for a class (Resource allocated) as the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  // would appear in a signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  // For arrays, this returns the name of the element with a leading '['.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  // For classes, this returns the name with a leading 'L' and a trailing ';'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  //     and the package separators as '/'.
4094
1f424b2b2171 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 2154
diff changeset
   475
  virtual const char* signature_name() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   477
  // type testing operations
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   478
#ifdef ASSERT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   479
 protected:
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   480
  virtual bool is_instance_klass_slow()     const { return false; }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   481
  virtual bool is_array_klass_slow()        const { return false; }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   482
  virtual bool is_objArray_klass_slow()     const { return false; }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   483
  virtual bool is_typeArray_klass_slow()    const { return false; }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   484
#endif // ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   487
  // Fast non-virtual versions
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  #ifndef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  #define assert_same_query(xval, xcheck) xval
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  #else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  static bool assert_same_query(bool xval, bool xslow) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    assert(xval == xslow, "slow and fast queries agree");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    return xval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  #endif
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   498
  inline  bool is_instance_klass()            const { return assert_same_query(
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   499
                                                      layout_helper_is_instance(layout_helper()),
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   500
                                                      is_instance_klass_slow()); }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   501
  inline  bool is_array_klass()               const { return assert_same_query(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   502
                                                    layout_helper_is_array(layout_helper()),
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   503
                                                    is_array_klass_slow()); }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   504
  inline  bool is_objArray_klass()            const { return assert_same_query(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
                                                    layout_helper_is_objArray(layout_helper()),
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   506
                                                    is_objArray_klass_slow()); }
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   507
  inline  bool is_typeArray_klass()           const { return assert_same_query(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
                                                    layout_helper_is_typeArray(layout_helper()),
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
   509
                                                    is_typeArray_klass_slow()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  #undef assert_same_query
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  // Access flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  AccessFlags access_flags() const         { return _access_flags;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  void set_access_flags(AccessFlags flags) { _access_flags = flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  bool is_public() const                { return _access_flags.is_public(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  bool is_final() const                 { return _access_flags.is_final(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  bool is_interface() const             { return _access_flags.is_interface(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  bool is_abstract() const              { return _access_flags.is_abstract(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  bool is_super() const                 { return _access_flags.is_super(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  bool is_synthetic() const             { return _access_flags.is_synthetic(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  void set_is_synthetic()               { _access_flags.set_is_synthetic(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  bool has_finalizer() const            { return _access_flags.has_finalizer(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  bool has_final_method() const         { return _access_flags.has_final_method(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  void set_has_finalizer()              { _access_flags.set_has_finalizer(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  void set_has_final_method()           { _access_flags.set_has_final_method(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  bool is_cloneable() const             { return _access_flags.is_cloneable(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  void set_is_cloneable()               { _access_flags.set_is_cloneable(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  bool has_vanilla_constructor() const  { return _access_flags.has_vanilla_constructor(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  void set_has_vanilla_constructor()    { _access_flags.set_has_vanilla_constructor(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  bool has_miranda_methods () const     { return access_flags().has_miranda_methods(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  void set_has_miranda_methods()        { _access_flags.set_has_miranda_methods(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // Biased locking support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // Note: the prototype header is always set up to be at least the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // prototype markOop. If biased locking is enabled it may further be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  // biasable and have an epoch.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  markOop prototype_header() const      { return _prototype_header; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // NOTE: once instances of this klass are floating around in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // system, this header must only be updated at a safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // NOTE 2: currently we only ever set the prototype header to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  // biasable prototype for instanceKlasses. There is no technical
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  // reason why it could not be done for arrayKlasses aside from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // wanting to reduce the initial scope of this optimization. There
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // are potential problems in setting the bias pattern for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // JVM-internal oops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  inline void set_prototype_header(markOop header);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   548
  static ByteSize prototype_header_offset() { return in_ByteSize(offset_of(Klass, _prototype_header)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  int  biased_lock_revocation_count() const { return (int) _biased_lock_revocation_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  // Atomically increments biased_lock_revocation_count and returns updated value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  int atomic_incr_biased_lock_revocation_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  void set_biased_lock_revocation_count(int val) { _biased_lock_revocation_count = (jint) val; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  jlong last_biased_lock_bulk_revocation_time() { return _last_biased_lock_bulk_revocation_time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  void  set_last_biased_lock_bulk_revocation_time(jlong cur_time) { _last_biased_lock_bulk_revocation_time = cur_time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
11480
1bf714e8adb4 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 8725
diff changeset
   557
  TRACE_DEFINE_KLASS_METHODS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  // garbage collection support
26412
80741eb33ba2 8049105: Move array component mirror to instance of java/lang/Class (hotspot part 2)
coleenp
parents: 26135
diff changeset
   560
  void oops_do(OopClosure* cl);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   561
14588
8ec26d2d9339 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 14488
diff changeset
   562
  // Iff the class loader (or mirror for anonymous classes) is alive the
8ec26d2d9339 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 14488
diff changeset
   563
  // Klass is considered alive.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   564
  // The is_alive closure passed in depends on the Garbage Collector used.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   565
  bool is_loader_alive(BoolObjectClosure* is_alive);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   566
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   567
  static void clean_weak_klass_links(BoolObjectClosure* is_alive, bool clean_alive_klasses = true);
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   568
  static void clean_subklass_tree(BoolObjectClosure* is_alive) {
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   569
    clean_weak_klass_links(is_alive, false /* clean_alive_klasses */);
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   570
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   572
  // GC specific object visitors
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   573
  //
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   574
  // Mark Sweep
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   575
  virtual int  oop_ms_adjust_pointers(oop obj) = 0;
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   576
#if INCLUDE_ALL_GCS
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   577
  // Parallel Scavenge
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   578
  virtual void oop_ps_push_contents(  oop obj, PSPromotionManager* pm)   = 0;
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   579
  // Parallel Compact
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   580
  virtual void oop_pc_follow_contents(oop obj, ParCompactionManager* cm) = 0;
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35135
diff changeset
   581
  virtual void oop_pc_update_pointers(oop obj, ParCompactionManager* cm) = 0;
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   582
#endif
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   583
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   584
  // Iterators specialized to particular subtypes
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   585
  // of ExtendedOopClosure, to avoid closure virtual calls.
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   586
#define Klass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix)                                           \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   587
  virtual void oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) = 0;                        \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   588
  /* Iterates "closure" over all the oops in "obj" (of type "this") within "mr". */                     \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   589
  virtual void oop_oop_iterate_bounded##nv_suffix(oop obj, OopClosureType* closure, MemRegion mr) = 0;
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   590
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   591
  ALL_OOP_OOP_ITERATE_CLOSURES_1(Klass_OOP_OOP_ITERATE_DECL)
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 28731
diff changeset
   592
  ALL_OOP_OOP_ITERATE_CLOSURES_2(Klass_OOP_OOP_ITERATE_DECL)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14816
diff changeset
   594
#if INCLUDE_ALL_GCS
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   595
#define Klass_OOP_OOP_ITERATE_DECL_BACKWARDS(OopClosureType, nv_suffix)                     \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   596
  virtual void oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   598
  ALL_OOP_OOP_ITERATE_CLOSURES_1(Klass_OOP_OOP_ITERATE_DECL_BACKWARDS)
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   599
  ALL_OOP_OOP_ITERATE_CLOSURES_2(Klass_OOP_OOP_ITERATE_DECL_BACKWARDS)
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14816
diff changeset
   600
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   602
  virtual void array_klasses_do(void f(Klass* k)) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  // Return self, except for abstract classes with exactly 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  // implementor.  Then return the 1 concrete implementation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  Klass *up_cast_abstract();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  // klass name
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   609
  Symbol* name() const                   { return _name; }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   610
  void set_name(Symbol* n);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  // jvm support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  virtual jint compute_modifier_flags(TRAPS) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  // JVMTI support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  virtual jint jvmti_class_status() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  // Printing
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   620
  virtual void print_on(outputStream* st) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   621
4584
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 4094
diff changeset
   622
  virtual void oop_print_value_on(oop obj, outputStream* st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  virtual void oop_print_on      (oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   625
  virtual const char* internal_name() const = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   626
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // Verification
22794
f1c014ad3754 8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents: 20017
diff changeset
   628
  virtual void verify_on(outputStream* st);
f1c014ad3754 8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents: 20017
diff changeset
   629
  void verify() { verify_on(tty); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
#ifndef PRODUCT
20017
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19696
diff changeset
   632
  bool verify_vtable_index(int index);
81eba62e9048 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 19696
diff changeset
   633
  bool verify_itable_index(int index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
#endif
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   635
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   636
  virtual void oop_verify_on(oop obj, outputStream* st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   637
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   638
  static bool is_null(narrowKlass obj);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   639
  static bool is_null(Klass* obj);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   640
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   641
  // klass encoding for klass pointer in objects.
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   642
  static narrowKlass encode_klass_not_null(Klass* v);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   643
  static narrowKlass encode_klass(Klass* v);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   644
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   645
  static Klass* decode_klass_not_null(narrowKlass v);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   646
  static Klass* decode_klass(narrowKlass v);
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18687
diff changeset
   647
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   648
 private:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   649
  // barriers used by klass_oop_store
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   650
  void klass_update_barrier_set(oop v);
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   651
  void klass_update_barrier_set_pre(oop* p, oop v);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
   653
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   654
// Helper to convert the oop iterate macro suffixes into bool values that can be used by template functions.
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   655
#define nvs_nv_to_bool true
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   656
#define nvs_v_to_bool  false
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   657
#define nvs_to_bool(nv_suffix) nvs##nv_suffix##_to_bool
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   658
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   659
// Oop iteration macros for declarations.
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   660
// Used to generate declarations in the *Klass header files.
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   661
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   662
#define OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix)                                    \
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   663
  void oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure);                        \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   664
  void oop_oop_iterate_bounded##nv_suffix(oop obj, OopClosureType* closure, MemRegion mr);
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   665
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   666
#if INCLUDE_ALL_GCS
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   667
#define OOP_OOP_ITERATE_DECL_BACKWARDS(OopClosureType, nv_suffix)               \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   668
  void oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure);
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   669
#endif // INCLUDE_ALL_GCS
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   670
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   671
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   672
// Oop iteration macros for definitions.
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   673
// Used to generate definitions in the *Klass.inline.hpp files.
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   674
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   675
#define OOP_OOP_ITERATE_DEFN(KlassType, OopClosureType, nv_suffix)              \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   676
void KlassType::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) {  \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   677
  oop_oop_iterate<nvs_to_bool(nv_suffix)>(obj, closure);                        \
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   678
}
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   679
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   680
#if INCLUDE_ALL_GCS
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   681
#define OOP_OOP_ITERATE_DEFN_BACKWARDS(KlassType, OopClosureType, nv_suffix)              \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   682
void KlassType::oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) {  \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   683
  oop_oop_iterate_reverse<nvs_to_bool(nv_suffix)>(obj, closure);                          \
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   684
}
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   685
#else
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   686
#define OOP_OOP_ITERATE_DEFN_BACKWARDS(KlassType, OopClosureType, nv_suffix)
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   687
#endif
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   688
32606
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   689
#define OOP_OOP_ITERATE_DEFN_BOUNDED(KlassType, OopClosureType, nv_suffix)                            \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   690
void KlassType::oop_oop_iterate_bounded##nv_suffix(oop obj, OopClosureType* closure, MemRegion mr) {  \
fdaa30d06ada 8129417: Oop iteration clean-up to remove oop_ms_follow_contents
sjohanss
parents: 32189
diff changeset
   691
  oop_oop_iterate_bounded<nvs_to_bool(nv_suffix)>(obj, closure, mr);                                  \
30880
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   692
}
efe35e08179f 8080746: Refactor oop iteration macros to be more general
sjohanss
parents: 30764
diff changeset
   693
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
   694
#endif // SHARE_VM_OOPS_KLASS_HPP