hotspot/src/share/vm/c1/c1_Compilation.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7397 5b173b4ca846
child 7722 f0bd3dd3192f
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5353
diff changeset
     2
 * Copyright (c) 1999, 2010, 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: 7100
diff changeset
    25
#ifndef SHARE_VM_C1_C1_COMPILATION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    26
#define SHARE_VM_C1_C1_COMPILATION_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    28
#include "ci/ciEnv.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    29
#include "code/exceptionHandlerTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    30
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
    31
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
class CompilationResourceObj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class XHandlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class ExceptionInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class DebugInformationRecorder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class FrameMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class IR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class IRScope;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class Instruction;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class LinearScan;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class OopMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
class LIR_Emitter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class LIR_Assembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
class CodeEmitInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class ciEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
class ciMethod;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class ValueStack;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
class LIR_OprDesc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
class C1_MacroAssembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class CFGPrinter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
typedef LIR_OprDesc* LIR_Opr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
define_array(BasicTypeArray, BasicType)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
define_stack(BasicTypeList, BasicTypeArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
define_array(ExceptionInfoArray, ExceptionInfo*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
define_stack(ExceptionInfoList,  ExceptionInfoArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class Compilation: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  friend class CompilationResourceObj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  // compilation specifics
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
    64
  Arena* _arena;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
    65
  int _next_id;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
    66
  int _next_block_id;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  AbstractCompiler*  _compiler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  ciEnv*             _env;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  ciMethod*          _method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  int                _osr_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  IR*                _hir;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  int                _max_spills;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  FrameMap*          _frame_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  C1_MacroAssembler* _masm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  bool               _has_exception_handlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  bool               _has_fpu_code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  bool               _has_unsafe_access;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
    78
  bool               _would_profile;
6186
7eef4cda471c 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 6176
diff changeset
    79
  bool               _has_method_handle_invokes;  // True if this method has MethodHandle invokes.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  const char*        _bailout_msg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  ExceptionInfoList* _exception_info_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  ExceptionHandlerTable _exception_handler_table;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  ImplicitExceptionTable _implicit_exception_table;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  LinearScan*        _allocator;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  CodeOffsets        _offsets;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  CodeBuffer         _code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // compilation helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  void initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  void build_hir();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  void emit_lir();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  void emit_code_epilog(LIR_Assembler* assembler);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  int  emit_code_body();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  int  compile_java_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  void install_code(int frame_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  void compile_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  void generate_exception_handler_table();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  ExceptionInfoList* exception_info_list() const { return _exception_info_list; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  ExceptionHandlerTable* exception_handler_table() { return &_exception_handler_table; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  LinearScan* allocator()                          { return _allocator;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  void        set_allocator(LinearScan* allocator) { _allocator = allocator; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  Instruction*       _current_instruction;       // the instruction currently being processed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  Instruction*       _last_instruction_printed;  // the last instruction printed during traversal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // creation
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   115
  Compilation(AbstractCompiler* compiler, ciEnv* env, ciMethod* method,
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   116
              int osr_bci, BufferBlob* buffer_blob);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  ~Compilation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   119
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   120
  static Compilation* current() {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   121
    return (Compilation*) ciEnv::current()->compiler_data();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   122
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  ciEnv* env() const                             { return _env; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  AbstractCompiler* compiler() const             { return _compiler; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  bool has_exception_handlers() const            { return _has_exception_handlers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  bool has_fpu_code() const                      { return _has_fpu_code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  bool has_unsafe_access() const                 { return _has_unsafe_access; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  ciMethod* method() const                       { return _method; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  int osr_bci() const                            { return _osr_bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  bool is_osr_compile() const                    { return osr_bci() >= 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  IR* hir() const                                { return _hir; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  int max_spills() const                         { return _max_spills; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  FrameMap* frame_map() const                    { return _frame_map; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  CodeBuffer* code()                             { return &_code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  C1_MacroAssembler* masm() const                { return _masm; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  CodeOffsets* offsets()                         { return &_offsets; }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   139
  Arena* arena()                                 { return _arena; }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   140
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   141
  // Instruction ids
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   142
  int get_next_id()                              { return _next_id++; }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   143
  int number_of_instructions() const             { return _next_id; }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   144
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   145
  // BlockBegin ids
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   146
  int get_next_block_id()                        { return _next_block_id++; }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   147
  int number_of_blocks() const                   { return _next_block_id; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // setters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  void set_has_exception_handlers(bool f)        { _has_exception_handlers = f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  void set_has_fpu_code(bool f)                  { _has_fpu_code = f; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  void set_has_unsafe_access(bool f)             { _has_unsafe_access = f; }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   153
  void set_would_profile(bool f)                 { _would_profile = f; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // Add a set of exception handlers covering the given PC offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  void add_exception_handlers_for_pco(int pco, XHandlers* exception_handlers);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // Statistics gathering
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  void notice_inlined_method(ciMethod* method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
6186
7eef4cda471c 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 6176
diff changeset
   159
  // JSR 292
7eef4cda471c 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 6176
diff changeset
   160
  bool     has_method_handle_invokes() const { return _has_method_handle_invokes;     }
7eef4cda471c 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 6176
diff changeset
   161
  void set_has_method_handle_invokes(bool z) {        _has_method_handle_invokes = z; }
7eef4cda471c 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 6176
diff changeset
   162
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  DebugInformationRecorder* debug_info_recorder() const; // = _env->debug_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  Dependencies* dependency_recorder() const; // = _env->dependencies()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  ImplicitExceptionTable* implicit_exception_table()     { return &_implicit_exception_table; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  Instruction* current_instruction() const       { return _current_instruction; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  Instruction* set_current_instruction(Instruction* instr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    Instruction* previous = _current_instruction;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    _current_instruction = instr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    return previous;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  void maybe_print_current_instruction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // error handling
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  void bailout(const char* msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  bool bailed_out() const                        { return _bailout_msg != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  const char* bailout_msg() const                { return _bailout_msg; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   183
  static int desired_max_code_buffer_size() {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5707
diff changeset
   184
#ifndef PPC
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   185
    return (int) NMethodSizeLimit;  // default 256K or 512K
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5707
diff changeset
   186
#else
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5707
diff changeset
   187
    // conditional branches on PPC are restricted to 16 bit signed
7100
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6745
diff changeset
   188
    return MIN2((unsigned int)NMethodSizeLimit,32*K);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5707
diff changeset
   189
#endif
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   190
  }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   191
  static int desired_max_constant_size() {
7100
6bcf9255d470 6991577: add IfOp optimization to C1
roland
parents: 6745
diff changeset
   192
    return desired_max_code_buffer_size() / 10;
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   193
  }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   194
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   195
  static void setup_code_buffer(CodeBuffer* cb, int call_stub_estimate);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   196
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // timers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  static void print_timers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // debugging support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // produces a file named c1compileonly in the current directory with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // directives to compile only the current method and it's inlines.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // The file can be passed to the command line option -XX:Flags=<filename>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  void compile_only_this_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  void compile_only_this_scope(outputStream* st, IRScope* scope);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  void exclude_this_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
#endif // PRODUCT
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   209
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   210
  bool is_profiling() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   211
    return env()->comp_level() == CompLevel_full_profile ||
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   212
           env()->comp_level() == CompLevel_limited_profile;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   213
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   214
  bool count_invocations() { return is_profiling(); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   215
  bool count_backedges()   { return is_profiling(); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   216
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   217
  // Helpers for generation of profile information
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   218
  bool profile_branches() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   219
    return env()->comp_level() == CompLevel_full_profile &&
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   220
      C1UpdateMethodData && C1ProfileBranches;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   221
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   222
  bool profile_calls() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   223
    return env()->comp_level() == CompLevel_full_profile &&
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   224
      C1UpdateMethodData && C1ProfileCalls;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   225
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   226
  bool profile_inlined_calls() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   227
    return profile_calls() && C1ProfileInlinedCalls;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   228
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   229
  bool profile_checkcasts() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   230
    return env()->comp_level() == CompLevel_full_profile &&
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   231
      C1UpdateMethodData && C1ProfileCheckcasts;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6186
diff changeset
   232
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
// Macro definitions for unified bailout-support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
// The methods bailout() and bailed_out() are present in all classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
// that might bailout, but forward all calls to Compilation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
#define BAILOUT(msg)               { bailout(msg); return;              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
#define BAILOUT_(msg, res)         { bailout(msg); return res;          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
#define CHECK_BAILOUT()            { if (bailed_out()) return;          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
#define CHECK_BAILOUT_(res)        { if (bailed_out()) return res;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
class InstructionMark: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  Compilation* _compilation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  Instruction*  _previous;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  InstructionMark(Compilation* compilation, Instruction* instr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    _compilation = compilation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    _previous = _compilation->set_current_instruction(instr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  ~InstructionMark() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    _compilation->set_current_instruction(_previous);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
//----------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
// Base class for objects allocated by the compiler in the compilation arena
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
class CompilationResourceObj ALLOCATION_SUPER_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
 public:
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   266
  void* operator new(size_t size) { return Compilation::current()->arena()->Amalloc(size); }
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   267
  void* operator new(size_t size, Arena* arena) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   268
    return arena->Amalloc(size);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   269
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  void  operator delete(void* p) {} // nothing to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
//----------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
// Class for aggregating exception handler information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
// Effectively extends XHandlers class with PC offset of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
// potentially exception-throwing instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
// This class is used at the end of the compilation to build the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
// ExceptionHandlerTable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
class ExceptionInfo: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  int             _pco;                // PC of potentially exception-throwing instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  XHandlers*      _exception_handlers; // flat list of exception handlers covering this PC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  ExceptionInfo(int pco, XHandlers* exception_handlers)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    : _pco(pco)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    , _exception_handlers(exception_handlers)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  int pco()                                      { return _pco; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  XHandlers* exception_handlers()                { return _exception_handlers; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
   295
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7100
diff changeset
   296
#endif // SHARE_VM_C1_C1_COMPILATION_HPP