hotspot/src/share/vm/ci/ciEnv.hpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13883 6979b9850feb
child 17121 e40a97c700d9
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
     2
 * Copyright (c) 1999, 2012, 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: 5353
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5353
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: 5353
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: 5882
diff changeset
    25
#ifndef SHARE_VM_CI_CIENV_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    26
#define SHARE_VM_CI_CIENV_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    28
#include "ci/ciClassList.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    29
#include "ci/ciObjectFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    30
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    31
#include "code/debugInfoRec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    32
#include "code/dependencies.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    33
#include "code/exceptionHandlerTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    34
#include "compiler/oopMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    35
#include "runtime/thread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
    36
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class CompileTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// ciEnv
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// This class is the top level broker for requests from the compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// to the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class ciEnv : StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  CI_PACKAGE_ACCESS_TO
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  friend class CompileBroker;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  friend class Dependencies;  // for get_object, during logging
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
    49
  static fileStream* _replay_data_stream;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
    50
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  Arena*           _arena;       // Alias for _ciEnv_arena except in init_shared_objects()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  Arena            _ciEnv_arena;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  int              _system_dictionary_modification_counter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  ciObjectFactory* _factory;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  OopRecorder*     _oop_recorder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  DebugInformationRecorder* _debug_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  Dependencies*    _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  const char*      _failure_reason;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  int              _compilable;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  bool             _break_at_compile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  int              _num_inlined_bytecodes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  CompileTask*     _task;           // faster access to CompilerThread::task
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  CompileLog*      _log;            // faster access to CompilerThread::log
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  void*            _compiler_data;  // compiler-specific stuff, if any
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  char* _name_buffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  int   _name_buffer_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    70
  // Cache Jvmti state
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    71
  bool  _jvmti_can_hotswap_or_post_breakpoint;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    72
  bool  _jvmti_can_access_local_variables;
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
    73
  bool  _jvmti_can_post_on_exceptions;
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    74
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    75
  // Cache DTrace flags
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    76
  bool  _dtrace_extended_probes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    77
  bool  _dtrace_monitor_probes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    78
  bool  _dtrace_method_probes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    79
  bool  _dtrace_alloc_probes;
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
    80
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // Distinguished instances of certain ciObjects..
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  static ciObject*              _null_object_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    84
#define WK_KLASS_DECL(name, ignore_s, ignore_o) static ciInstanceKlass* _##name;
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    85
  WK_KLASSES_DO(WK_KLASS_DECL)
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
    86
#undef WK_KLASS_DECL
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  static ciSymbol*        _unloaded_cisymbol;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  static ciInstanceKlass* _unloaded_ciinstance_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  static ciObjArrayKlass* _unloaded_ciobjarrayklass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  static jobject _ArrayIndexOutOfBoundsException_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  static jobject _ArrayStoreException_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  static jobject _ClassCastException_handle;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  ciInstance* _NullPointerException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  ciInstance* _ArithmeticException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  ciInstance* _ArrayIndexOutOfBoundsException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  ciInstance* _ArrayStoreException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  ciInstance* _ClassCastException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   102
  ciInstance* _the_null_string;      // The Java string "null"
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   103
  ciInstance* _the_min_jint_string; // The Java string "-2147483648"
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   104
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Look up a klass by name from a particular class loader (the accessor's).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // If require_local, result must be defined in that class loader, or NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // If !require_local, a result from remote class loader may be reported,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // if sufficient class loader constraints exist such that initiating
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // a class loading request from the given loader is bound to return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  // the class defined in the remote loader (or throw an error).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // Return an unloaded klass if !require_local and no class at all is found.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // The CI treats a klass as loaded if it is consistently defined in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // another loader, even if it hasn't yet been loaded in all loaders
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // that could potentially see it via delegation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  ciKlass* get_klass_by_name(ciKlass* accessing_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
                             ciSymbol* klass_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
                             bool require_local);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Constant pool access.
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   122
  ciKlass*   get_klass_by_index(constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
                                int klass_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   124
                                bool& is_accessible,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   125
                                ciInstanceKlass* loading_klass);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   126
  ciConstant get_constant_by_index(constantPoolHandle cpool,
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   127
                                   int pool_index, int cache_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   128
                                   ciInstanceKlass* accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  ciField*   get_field_by_index(ciInstanceKlass* loading_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
                                int field_index);
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   131
  ciMethod*  get_method_by_index(constantPoolHandle cpool,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   132
                                 int method_index, Bytecodes::Code bc,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   133
                                 ciInstanceKlass* loading_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  // Implementation methods for loading and constant pool access.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  ciKlass* get_klass_by_name_impl(ciKlass* accessing_klass,
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 8921
diff changeset
   137
                                  constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
                                  ciSymbol* klass_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
                                  bool require_local);
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   140
  ciKlass*   get_klass_by_index_impl(constantPoolHandle cpool,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
                                     int klass_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   142
                                     bool& is_accessible,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   143
                                     ciInstanceKlass* loading_klass);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   144
  ciConstant get_constant_by_index_impl(constantPoolHandle cpool,
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   145
                                        int pool_index, int cache_index,
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   146
                                        ciInstanceKlass* loading_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  ciField*   get_field_by_index_impl(ciInstanceKlass* loading_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
                                     int field_index);
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   149
  ciMethod*  get_method_by_index_impl(constantPoolHandle cpool,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   150
                                      int method_index, Bytecodes::Code bc,
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   151
                                      ciInstanceKlass* loading_klass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Helper methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  bool       check_klass_accessibility(ciKlass* accessing_klass,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   155
                                      Klass* resolved_klass);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   156
  Method*    lookup_method(InstanceKlass*  accessor,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   157
                           InstanceKlass*  holder,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   158
                           Symbol*         name,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   159
                           Symbol*         sig,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
                           Bytecodes::Code bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // Get a ciObject from the object factory.  Ensures uniqueness
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // of ciObjects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  ciObject* get_object(oop o) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    if (o == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
      return _null_object_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
      return _factory->get(o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   172
  ciSymbol* get_symbol(Symbol* o) {
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   173
    if (o == NULL) {
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   174
      ShouldNotReachHere();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   175
      return NULL;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   176
    } else {
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   177
      return _factory->get_symbol(o);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   178
    }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   179
  }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   180
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   181
  ciMetadata* get_metadata(Metadata* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   182
    if (o == NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   183
      return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   184
    } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   185
      return _factory->get_metadata(o);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   186
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   187
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   188
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   189
  ciInstance* get_instance(oop o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   190
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   191
    return get_object(o)->as_instance();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   192
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   193
  ciObjArrayKlass* get_obj_array_klass(Klass* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   194
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   195
    return get_metadata(o)->as_obj_array_klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   196
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   197
  ciTypeArrayKlass* get_type_array_klass(Klass* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   198
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   199
    return get_metadata(o)->as_type_array_klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   200
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   201
  ciKlass* get_klass(Klass* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   202
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   203
    return get_metadata(o)->as_klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   204
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   205
  ciInstanceKlass* get_instance_klass(Klass* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   206
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   207
    return get_metadata(o)->as_instance_klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   208
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   209
  ciMethod* get_method(Method* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   210
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   211
    return get_metadata(o)->as_method();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   212
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   213
  ciMethodData* get_method_data(MethodData* o) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   214
    if (o == NULL) return NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   215
    return get_metadata(o)->as_method_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   216
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   217
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   218
  ciMethod* get_method_from_handle(Method* method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   220
  ciInstance* get_or_create_exception(jobject& handle, Symbol* name);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  // Get a ciMethod representing either an unfound method or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  // a method with an unloaded holder.  Ensures uniqueness of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // the result.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  ciMethod* get_unloaded_method(ciInstanceKlass* holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
                                ciSymbol*        name,
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10508
diff changeset
   227
                                ciSymbol*        signature,
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10508
diff changeset
   228
                                ciInstanceKlass* accessor) {
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10508
diff changeset
   229
    return _factory->get_unloaded_method(holder, name, signature, accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // Get a ciKlass representing an unloaded klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // Ensures uniqueness of the result.
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10508
diff changeset
   234
  ciKlass* get_unloaded_klass(ciKlass*  accessing_klass,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
                              ciSymbol* name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    return _factory->get_unloaded_klass(accessing_klass, name, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   239
  // Get a ciKlass representing an unloaded klass mirror.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   240
  // Result is not necessarily unique, but will be unloaded.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   241
  ciInstance* get_unloaded_klass_mirror(ciKlass* type) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   242
    return _factory->get_unloaded_klass_mirror(type);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   243
  }
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   244
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   245
  // Get a ciInstance representing an unresolved method handle constant.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   246
  ciInstance* get_unloaded_method_handle_constant(ciKlass*  holder,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   247
                                                  ciSymbol* name,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   248
                                                  ciSymbol* signature,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   249
                                                  int       ref_kind) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   250
    return _factory->get_unloaded_method_handle_constant(holder, name, signature, ref_kind);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   251
  }
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   252
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   253
  // Get a ciInstance representing an unresolved method type constant.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   254
  ciInstance* get_unloaded_method_type_constant(ciSymbol* signature) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   255
    return _factory->get_unloaded_method_type_constant(signature);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   256
  }
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5547
diff changeset
   257
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  // See if we already have an unloaded klass for the given name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  // or return NULL if not.
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10508
diff changeset
   260
  ciKlass *check_get_unloaded_klass(ciKlass*  accessing_klass, ciSymbol* name) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    return _factory->get_unloaded_klass(accessing_klass, name, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  // Get a ciReturnAddress corresponding to the given bci.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  // Ensures uniqueness of the result.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  ciReturnAddress* get_return_address(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    return _factory->get_return_address(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // Get a ciMethodData representing the methodData for a method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // with none.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  ciMethodData* get_empty_methodData() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    return _factory->get_empty_methodData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // General utility : get a buffer of some required length.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // Used in symbol creation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  char* name_buffer(int req_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // Is this thread currently in the VM state?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  static bool is_in_vm();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
10503
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   283
  // Helper routine for determining the validity of a compilation with
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   284
  // respect to method dependencies (e.g. concurrent class loading).
04b74421bdea 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 10008
diff changeset
   285
  void validate_compile_task_dependencies(ciMethod* target);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    MethodCompilable,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    MethodCompilable_not_at_tier,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    MethodCompilable_never
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  ciEnv(CompileTask* task, int system_dictionary_modification_counter);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // Used only during initialization of the ci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  ciEnv(Arena* arena);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  ~ciEnv();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  OopRecorder* oop_recorder() { return _oop_recorder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  DebugInformationRecorder* debug_info() { return _debug_info; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  void set_debug_info(DebugInformationRecorder* i) { _debug_info = i; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  Dependencies* dependencies() { return _dependencies; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  void set_dependencies(Dependencies* d) { _dependencies = d; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // This is true if the compilation is not going to produce code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // (It is reasonable to retry failed compilations.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  bool failing() { return _failure_reason != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // Reason this compilation is failing, such as "too many basic blocks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  const char* failure_reason() { return _failure_reason; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // Return state of appropriate compilability
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  int compilable() { return _compilable; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   318
  const char* retry_message() const {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   319
    switch (_compilable) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   320
      case ciEnv::MethodCompilable_not_at_tier:
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   321
        return "retry at different tier";
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   322
      case ciEnv::MethodCompilable_never:
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   323
        return "not retryable";
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   324
      case ciEnv::MethodCompilable:
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   325
        return NULL;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   326
      default:
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   327
        ShouldNotReachHere();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   328
        return NULL;
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   329
    }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   330
  }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 10734
diff changeset
   331
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  bool break_at_compile() { return _break_at_compile; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  void set_break_at_compile(bool z) { _break_at_compile = z; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   335
  // Cache Jvmti state
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   336
  void  cache_jvmti_state();
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   337
  bool  jvmti_can_hotswap_or_post_breakpoint() const { return _jvmti_can_hotswap_or_post_breakpoint; }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   338
  bool  jvmti_can_access_local_variables()     const { return _jvmti_can_access_local_variables; }
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   339
  bool  jvmti_can_post_on_exceptions()         const { return _jvmti_can_post_on_exceptions; }
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   340
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   341
  // Cache DTrace flags
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   342
  void  cache_dtrace_flags();
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   343
  bool  dtrace_extended_probes() const { return _dtrace_extended_probes; }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   344
  bool  dtrace_monitor_probes()  const { return _dtrace_monitor_probes; }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   345
  bool  dtrace_method_probes()   const { return _dtrace_method_probes; }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   346
  bool  dtrace_alloc_probes()    const { return _dtrace_alloc_probes; }
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 1
diff changeset
   347
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // The compiler task which has created this env.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // May be useful to find out compile_id, comp_level, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  CompileTask* task() { return _task; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  // Handy forwards to the task:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  int comp_level();   // task()->comp_level()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  uint compile_id();  // task()->compile_id()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  // Register the result of a compilation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  void register_method(ciMethod*                 target,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
                       int                       entry_bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
                       CodeOffsets*              offsets,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
                       int                       orig_pc_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
                       CodeBuffer*               code_buffer,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
                       int                       frame_words,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
                       OopMapSet*                oop_map_set,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
                       ExceptionHandlerTable*    handler_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
                       ImplicitExceptionTable*   inc_table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
                       AbstractCompiler*         compiler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
                       int                       comp_level,
13883
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   367
                       bool                      has_unsafe_access,
6979b9850feb 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 13728
diff changeset
   368
                       bool                      has_wide_vectors);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // Access to certain well known ciObjects.
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   372
#define WK_KLASS_FUNC(name, ignore_s, ignore_o) \
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   373
  ciInstanceKlass* name() { \
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   374
    return _##name;\
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  }
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   376
  WK_KLASSES_DO(WK_KLASS_FUNC)
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   377
#undef WK_KLASS_FUNC
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4567
diff changeset
   378
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  ciInstance* NullPointerException_instance() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    assert(_NullPointerException_instance != NULL, "initialization problem");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    return _NullPointerException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  ciInstance* ArithmeticException_instance() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    assert(_ArithmeticException_instance != NULL, "initialization problem");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    return _ArithmeticException_instance;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // Lazy constructors:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  ciInstance* ArrayIndexOutOfBoundsException_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  ciInstance* ArrayStoreException_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  ciInstance* ClassCastException_instance();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
4450
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   393
  ciInstance* the_null_string();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   394
  ciInstance* the_min_jint_string();
6d700b859b3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 3908
diff changeset
   395
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  static ciSymbol* unloaded_cisymbol() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    return _unloaded_cisymbol;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  static ciObjArrayKlass* unloaded_ciobjarrayklass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    return _unloaded_ciobjarrayklass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  static ciInstanceKlass* unloaded_ciinstance_klass() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    return _unloaded_ciinstance_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  ciKlass*  find_system_klass(ciSymbol* klass_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // Note:  To find a class from its name string, use ciSymbol::make,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // but consider adding to vmSymbols.hpp instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // converts the ciKlass* representing the holder of a method into a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // ciInstanceKlass*.  This is needed since the holder of a method in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // the bytecodes could be an array type.  Basically this converts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // array types into java/lang/Object and other types stay as they are.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  static ciInstanceKlass* get_instance_klass_for_declared_method_holder(ciKlass* klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // Return the machine-level offset of o, which must be an element of a.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // This may be used to form constant-loading expressions in lieu of simpler encodings.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  int       array_element_offset_in_bytes(ciArray* a, ciObject* o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  // Access to the compile-lifetime allocation arena.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  Arena*    arena() { return _arena; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // What is the current compilation environment?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  static ciEnv* current() { return CompilerThread::current()->env(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // Overload with current thread argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  static ciEnv* current(CompilerThread *thread) { return thread->env(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // Per-compiler data.  (Used by C2 to publish the Compile* pointer.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  void* compiler_data() { return _compiler_data; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  void set_compiler_data(void* x) { _compiler_data = x; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // Notice that a method has been inlined in the current compile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // used only for statistics.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  void notice_inlined_method(ciMethod* method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  // Total number of bytecodes in inlined methods in this compile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  int num_inlined_bytecodes() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // Output stream for logging compilation info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  CompileLog* log() { return _log; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  void set_log(CompileLog* log) { _log = log; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // Check for changes to the system dictionary during compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  bool system_dictionary_modification_counter_changed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  void record_failure(const char* reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  void record_method_not_compilable(const char* reason, bool all_tiers = true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  void record_out_of_memory_failure();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   450
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   451
  // RedefineClasses support
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   452
  void metadata_do(void f(Metadata*)) { _factory->metadata_do(f); }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   453
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   454
  // Dump the compilation replay data for this ciEnv to
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   455
  // ReplayDataFile, creating the file if needed.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   456
  void  dump_replay_data();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   457
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   458
  // Dump the compilation replay data for the ciEnv to the stream.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13883
diff changeset
   459
  void dump_replay_data(outputStream* out);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
   461
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5882
diff changeset
   462
#endif // SHARE_VM_CI_CIENV_HPP