compileBroker.hpp revision 8266:4cf3113c8f42
1/*
2 * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_COMPILER_COMPILEBROKER_HPP
26#define SHARE_VM_COMPILER_COMPILEBROKER_HPP
27
28#include "ci/compilerInterface.hpp"
29#include "compiler/abstractCompiler.hpp"
30#include "runtime/perfData.hpp"
31
32class nmethod;
33class nmethodLocker;
34
35// CompileTask
36//
37// An entry in the compile queue.  It represents a pending or current
38// compilation.
39class CompileTask : public CHeapObj<mtCompiler> {
40  friend class VMStructs;
41
42 private:
43  static CompileTask* _task_free_list;
44#ifdef ASSERT
45  static int          _num_allocated_tasks;
46#endif
47
48  Monitor*     _lock;
49  uint         _compile_id;
50  Method*      _method;
51  jobject      _method_holder;
52  int          _osr_bci;
53  bool         _is_complete;
54  bool         _is_success;
55  bool         _is_blocking;
56  int          _comp_level;
57  int          _num_inlined_bytecodes;
58  nmethodLocker* _code_handle;  // holder of eventual result
59  CompileTask* _next, *_prev;
60  bool         _is_free;
61  // Fields used for logging why the compilation was initiated:
62  jlong        _time_queued;  // in units of os::elapsed_counter()
63  Method*      _hot_method;   // which method actually triggered this task
64  jobject      _hot_method_holder;
65  int          _hot_count;    // information about its invocation counter
66  const char*  _comment;      // more info about the task
67  const char*  _failure_reason;
68
69 public:
70  CompileTask() {
71    _lock = new Monitor(Mutex::nonleaf+2, "CompileTaskLock");
72  }
73
74  void initialize(int compile_id, methodHandle method, int osr_bci, int comp_level,
75                  methodHandle hot_method, int hot_count, const char* comment,
76                  bool is_blocking);
77
78  static CompileTask* allocate();
79  static void         free(CompileTask* task);
80
81  int          compile_id() const                { return _compile_id; }
82  Method*      method() const                    { return _method; }
83  int          osr_bci() const                   { return _osr_bci; }
84  bool         is_complete() const               { return _is_complete; }
85  bool         is_blocking() const               { return _is_blocking; }
86  bool         is_success() const                { return _is_success; }
87
88  nmethodLocker* code_handle() const             { return _code_handle; }
89  void         set_code_handle(nmethodLocker* l) { _code_handle = l; }
90  nmethod*     code() const;                     // _code_handle->code()
91  void         set_code(nmethod* nm);            // _code_handle->set_code(nm)
92
93  Monitor*     lock() const                      { return _lock; }
94
95  void         mark_complete()                   { _is_complete = true; }
96  void         mark_success()                    { _is_success = true; }
97
98  int          comp_level()                      { return _comp_level;}
99  void         set_comp_level(int comp_level)    { _comp_level = comp_level;}
100
101  int          num_inlined_bytecodes() const     { return _num_inlined_bytecodes; }
102  void         set_num_inlined_bytecodes(int n)  { _num_inlined_bytecodes = n; }
103
104  CompileTask* next() const                      { return _next; }
105  void         set_next(CompileTask* next)       { _next = next; }
106  CompileTask* prev() const                      { return _prev; }
107  void         set_prev(CompileTask* prev)       { _prev = prev; }
108  bool         is_free() const                   { return _is_free; }
109  void         set_is_free(bool val)             { _is_free = val; }
110
111private:
112  static void  print_compilation_impl(outputStream* st, Method* method, int compile_id, int comp_level,
113                                      bool is_osr_method = false, int osr_bci = -1, bool is_blocking = false,
114                                      const char* msg = NULL, bool short_form = false, bool cr = true);
115
116public:
117  void         print_compilation(outputStream* st = tty, const char* msg = NULL, bool short_form = false, bool cr = true);
118  static void  print_compilation(outputStream* st, const nmethod* nm, const char* msg = NULL, bool short_form = false, bool cr = true) {
119    print_compilation_impl(st, nm->method(), nm->compile_id(), nm->comp_level(),
120                           nm->is_osr_method(), nm->is_osr_method() ? nm->osr_entry_bci() : -1, /*is_blocking*/ false,
121                           msg, short_form, cr);
122  }
123
124  static void  print_inlining(outputStream* st, ciMethod* method, int inline_level, int bci, const char* msg = NULL);
125  static void  print_inlining(ciMethod* method, int inline_level, int bci, const char* msg = NULL) {
126    print_inlining(tty, method, inline_level, bci, msg);
127  }
128
129  // Redefine Classes support
130  void mark_on_stack();
131
132  static void  print_inline_indent(int inline_level, outputStream* st = tty);
133
134  void         print_tty();
135  void         print_line_on_error(outputStream* st, char* buf, int buflen);
136
137  void         log_task(xmlStream* log);
138  void         log_task_queued();
139  void         log_task_start(CompileLog* log);
140  void         log_task_done(CompileLog* log);
141
142  void         set_failure_reason(const char* reason) {
143    _failure_reason = reason;
144  }
145};
146
147// CompilerCounters
148//
149// Per Compiler Performance Counters.
150//
151class CompilerCounters : public CHeapObj<mtCompiler> {
152
153  public:
154    enum {
155      cmname_buffer_length = 160
156    };
157
158  private:
159
160    char _current_method[cmname_buffer_length];
161    PerfStringVariable* _perf_current_method;
162
163    int  _compile_type;
164    PerfVariable* _perf_compile_type;
165
166    PerfCounter* _perf_time;
167    PerfCounter* _perf_compiles;
168
169  public:
170    CompilerCounters(const char* name, int instance, TRAPS);
171
172    // these methods should be called in a thread safe context
173
174    void set_current_method(const char* method) {
175      strncpy(_current_method, method, (size_t)cmname_buffer_length-1);
176      _current_method[cmname_buffer_length-1] = '\0';
177      if (UsePerfData) _perf_current_method->set_value(method);
178    }
179
180    char* current_method()                  { return _current_method; }
181
182    void set_compile_type(int compile_type) {
183      _compile_type = compile_type;
184      if (UsePerfData) _perf_compile_type->set_value((jlong)compile_type);
185    }
186
187    int compile_type()                       { return _compile_type; }
188
189    PerfCounter* time_counter()              { return _perf_time; }
190    PerfCounter* compile_counter()           { return _perf_compiles; }
191};
192
193// CompileQueue
194//
195// A list of CompileTasks.
196class CompileQueue : public CHeapObj<mtCompiler> {
197 private:
198  const char* _name;
199
200  CompileTask* _first;
201  CompileTask* _last;
202
203  CompileTask* _first_stale;
204
205  int _size;
206
207  void purge_stale_tasks();
208 public:
209  CompileQueue(const char* name) {
210    _name = name;
211    _first = NULL;
212    _last = NULL;
213    _size = 0;
214    _first_stale = NULL;
215  }
216
217  const char*  name() const                      { return _name; }
218
219  void         add(CompileTask* task);
220  void         remove(CompileTask* task);
221  void         remove_and_mark_stale(CompileTask* task);
222  CompileTask* first()                           { return _first; }
223  CompileTask* last()                            { return _last;  }
224
225  CompileTask* get();
226
227  bool         is_empty() const                  { return _first == NULL; }
228  int          size()     const                  { return _size;          }
229
230
231  // Redefine Classes support
232  void mark_on_stack();
233  void free_all();
234  void print_tty();
235  void print(outputStream* st = tty);
236
237  ~CompileQueue() {
238    assert (is_empty(), " Compile Queue must be empty");
239  }
240};
241
242// CompileTaskWrapper
243//
244// Assign this task to the current thread.  Deallocate the task
245// when the compilation is complete.
246class CompileTaskWrapper : StackObj {
247public:
248  CompileTaskWrapper(CompileTask* task);
249  ~CompileTaskWrapper();
250};
251
252
253// Compilation
254//
255// The broker for all compilation requests.
256class CompileBroker: AllStatic {
257 friend class Threads;
258  friend class CompileTaskWrapper;
259
260 public:
261  enum {
262    name_buffer_length = 100
263  };
264
265  // Compile type Information for print_last_compile() and CompilerCounters
266  enum { no_compile, normal_compile, osr_compile, native_compile };
267  static int assign_compile_id (methodHandle method, int osr_bci);
268
269
270 private:
271  static bool _initialized;
272  static volatile bool _should_block;
273
274  // This flag can be used to stop compilation or turn it back on
275  static volatile jint _should_compile_new_jobs;
276
277  // The installed compiler(s)
278  static AbstractCompiler* _compilers[2];
279
280  // These counters are used for assigning id's to each compilation
281  static volatile jint _compilation_id;
282  static volatile jint _osr_compilation_id;
283
284  static int  _last_compile_type;
285  static int  _last_compile_level;
286  static char _last_method_compiled[name_buffer_length];
287
288  static CompileQueue* _c2_compile_queue;
289  static CompileQueue* _c1_compile_queue;
290
291  // performance counters
292  static PerfCounter* _perf_total_compilation;
293  static PerfCounter* _perf_native_compilation;
294  static PerfCounter* _perf_osr_compilation;
295  static PerfCounter* _perf_standard_compilation;
296
297  static PerfCounter* _perf_total_bailout_count;
298  static PerfCounter* _perf_total_invalidated_count;
299  static PerfCounter* _perf_total_compile_count;
300  static PerfCounter* _perf_total_native_compile_count;
301  static PerfCounter* _perf_total_osr_compile_count;
302  static PerfCounter* _perf_total_standard_compile_count;
303
304  static PerfCounter* _perf_sum_osr_bytes_compiled;
305  static PerfCounter* _perf_sum_standard_bytes_compiled;
306  static PerfCounter* _perf_sum_nmethod_size;
307  static PerfCounter* _perf_sum_nmethod_code_size;
308
309  static PerfStringVariable* _perf_last_method;
310  static PerfStringVariable* _perf_last_failed_method;
311  static PerfStringVariable* _perf_last_invalidated_method;
312  static PerfVariable*       _perf_last_compile_type;
313  static PerfVariable*       _perf_last_compile_size;
314  static PerfVariable*       _perf_last_failed_type;
315  static PerfVariable*       _perf_last_invalidated_type;
316
317  // Timers and counters for generating statistics
318  static elapsedTimer _t_total_compilation;
319  static elapsedTimer _t_osr_compilation;
320  static elapsedTimer _t_standard_compilation;
321  static elapsedTimer _t_invalidated_compilation;
322  static elapsedTimer _t_bailedout_compilation;
323
324  static int _total_compile_count;
325  static int _total_bailout_count;
326  static int _total_invalidated_count;
327  static int _total_native_compile_count;
328  static int _total_osr_compile_count;
329  static int _total_standard_compile_count;
330  static int _sum_osr_bytes_compiled;
331  static int _sum_standard_bytes_compiled;
332  static int _sum_nmethod_size;
333  static int _sum_nmethod_code_size;
334  static long _peak_compilation_time;
335
336  static volatile jint _print_compilation_warning;
337
338  static JavaThread* make_thread(const char* name, CompileQueue* queue, CompilerCounters* counters, AbstractCompiler* comp, bool compiler_thread, TRAPS);
339  static void init_compiler_sweeper_threads(int c1_compiler_count, int c2_compiler_count);
340  static bool compilation_is_complete  (methodHandle method, int osr_bci, int comp_level);
341  static bool compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level);
342  static bool is_compile_blocking();
343  static void preload_classes          (methodHandle method, TRAPS);
344
345  static CompileTask* create_compile_task(CompileQueue* queue,
346                                          int           compile_id,
347                                          methodHandle  method,
348                                          int           osr_bci,
349                                          int           comp_level,
350                                          methodHandle  hot_method,
351                                          int           hot_count,
352                                          const char*   comment,
353                                          bool          blocking);
354  static void wait_for_completion(CompileTask* task);
355
356  static void invoke_compiler_on_method(CompileTask* task);
357  static void set_last_compile(CompilerThread *thread, methodHandle method, bool is_osr, int comp_level);
358  static void push_jni_handle_block();
359  static void pop_jni_handle_block();
360  static bool check_break_at(methodHandle method, int compile_id, bool is_osr);
361  static void collect_statistics(CompilerThread* thread, elapsedTimer time, CompileTask* task);
362
363  static void compile_method_base(methodHandle method,
364                                  int osr_bci,
365                                  int comp_level,
366                                  methodHandle hot_method,
367                                  int hot_count,
368                                  const char* comment,
369                                  Thread* thread);
370
371  static CompileQueue* compile_queue(int comp_level);
372  static bool init_compiler_runtime();
373  static void shutdown_compiler_runtime(AbstractCompiler* comp, CompilerThread* thread);
374
375 public:
376  enum {
377    // The entry bci used for non-OSR compilations.
378    standard_entry_bci = InvocationEntryBci
379  };
380
381  static AbstractCompiler* compiler(int comp_level) {
382    if (is_c2_compile(comp_level)) return _compilers[1]; // C2
383    if (is_c1_compile(comp_level)) return _compilers[0]; // C1
384    return NULL;
385  }
386
387  static bool compilation_is_in_queue(methodHandle method);
388  static void print_compile_queues(outputStream* st);
389  static int queue_size(int comp_level) {
390    CompileQueue *q = compile_queue(comp_level);
391    return q != NULL ? q->size() : 0;
392  }
393  static void compilation_init();
394  static void init_compiler_thread_log();
395  static nmethod* compile_method(methodHandle method,
396                                 int osr_bci,
397                                 int comp_level,
398                                 methodHandle hot_method,
399                                 int hot_count,
400                                 const char* comment, Thread* thread);
401
402  static void compiler_thread_loop();
403  static uint get_compilation_id() { return _compilation_id; }
404
405  // Set _should_block.
406  // Call this from the VM, with Threads_lock held and a safepoint requested.
407  static void set_should_block();
408
409  // Call this from the compiler at convenient points, to poll for _should_block.
410  static void maybe_block();
411
412  enum {
413    // Flags for toggling compiler activity
414    stop_compilation    = 0,
415    run_compilation     = 1,
416    shutdown_compilaton = 2
417  };
418
419  static jint get_compilation_activity_mode() { return _should_compile_new_jobs; }
420  static bool should_compile_new_jobs() { return UseCompiler && (_should_compile_new_jobs == run_compilation); }
421  static bool set_should_compile_new_jobs(jint new_state) {
422    // Return success if the current caller set it
423    jint old = Atomic::cmpxchg(new_state, &_should_compile_new_jobs, 1-new_state);
424    return (old == (1-new_state));
425  }
426
427  static void disable_compilation_forever() {
428    UseCompiler               = false;
429    AlwaysCompileLoopMethods  = false;
430    Atomic::xchg(shutdown_compilaton, &_should_compile_new_jobs);
431  }
432
433  static bool is_compilation_disabled_forever() {
434    return _should_compile_new_jobs == shutdown_compilaton;
435  }
436  static void handle_full_code_cache(int code_blob_type);
437  // Ensures that warning is only printed once.
438  static bool should_print_compiler_warning() {
439    jint old = Atomic::cmpxchg(1, &_print_compilation_warning, 0);
440    return old == 0;
441  }
442  // Return total compilation ticks
443  static jlong total_compilation_ticks() {
444    return _perf_total_compilation != NULL ? _perf_total_compilation->get_value() : 0;
445  }
446
447  // Redefine Classes support
448  static void mark_on_stack();
449
450  // Print a detailed accounting of compilation time
451  static void print_times();
452
453  // Debugging output for failure
454  static void print_last_compile();
455
456  static void print_compiler_threads_on(outputStream* st);
457
458  // compiler name for debugging
459  static const char* compiler_name(int comp_level);
460
461  static int get_total_compile_count() {          return _total_compile_count; }
462  static int get_total_bailout_count() {          return _total_bailout_count; }
463  static int get_total_invalidated_count() {      return _total_invalidated_count; }
464  static int get_total_native_compile_count() {   return _total_native_compile_count; }
465  static int get_total_osr_compile_count() {      return _total_osr_compile_count; }
466  static int get_total_standard_compile_count() { return _total_standard_compile_count; }
467  static int get_sum_osr_bytes_compiled() {       return _sum_osr_bytes_compiled; }
468  static int get_sum_standard_bytes_compiled() {  return _sum_standard_bytes_compiled; }
469  static int get_sum_nmethod_size() {             return _sum_nmethod_size;}
470  static int get_sum_nmethod_code_size() {        return _sum_nmethod_code_size; }
471  static long get_peak_compilation_time() {       return _peak_compilation_time; }
472  static long get_total_compilation_time() {      return _t_total_compilation.milliseconds(); }
473
474  // Log that compilation profiling is skipped because metaspace is full.
475  static void log_metaspace_failure();
476};
477
478#endif // SHARE_VM_COMPILER_COMPILEBROKER_HPP
479