1 /*
  2  * Copyright (c) 1999, 2025, 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_COMPILER_COMPILEBROKER_HPP
 26 #define SHARE_COMPILER_COMPILEBROKER_HPP
 27 
 28 #include "ci/compilerInterface.hpp"
 29 #include "compiler/abstractCompiler.hpp"
 30 #include "compiler/compileTask.hpp"
 31 #include "compiler/compilerDirectives.hpp"
 32 #include "compiler/compilerThread.hpp"
 33 #include "runtime/atomic.hpp"
 34 #include "runtime/perfDataTypes.hpp"
 35 #include "utilities/stack.hpp"
 36 #if INCLUDE_JVMCI
 37 #include "jvmci/jvmciCompiler.hpp"
 38 #endif
 39 
 40 class nmethod;
 41 
 42 #if defined(ASSERT) && COMPILER2_OR_JVMCI
 43 // Stress testing. Dedicated threads revert optimizations based on escape analysis concurrently to
 44 // the running java application.  Configured with vm options DeoptimizeObjectsALot*.
 45 class DeoptimizeObjectsALotThread : public JavaThread {
 46 
 47   static void deopt_objs_alot_thread_entry(JavaThread* thread, TRAPS);
 48   void deoptimize_objects_alot_loop_single();
 49   void deoptimize_objects_alot_loop_all();
 50 
 51 public:
 52   DeoptimizeObjectsALotThread() : JavaThread(&deopt_objs_alot_thread_entry) { }
 53 
 54   bool is_hidden_from_external_view() const      { return true; }
 55 };
 56 #endif
 57 
 58 // CompilerCounters
 59 //
 60 // Per Compiler Performance Counters.
 61 //
 62 class CompilerCounters : public CHeapObj<mtCompiler> {
 63 
 64   public:
 65     enum {
 66       cmname_buffer_length = 160
 67     };
 68 
 69   private:
 70 
 71     char _current_method[cmname_buffer_length];
 72     int  _compile_type;
 73 
 74   public:
 75     CompilerCounters();
 76 
 77     // these methods should be called in a thread safe context
 78 
 79     void set_current_method(const char* method) {
 80       strncpy(_current_method, method, (size_t)cmname_buffer_length-1);
 81       _current_method[cmname_buffer_length-1] = '\0';
 82     }
 83 
 84     char* current_method()                  { return _current_method; }
 85 
 86     void set_compile_type(int compile_type) {
 87       _compile_type = compile_type;
 88     }
 89 
 90     int compile_type()                       { return _compile_type; }
 91 
 92 };
 93 
 94 // CompileQueue
 95 //
 96 // A list of CompileTasks.
 97 class CompileQueue : public CHeapObj<mtCompiler> {
 98  private:
 99   const char* _name;
100 
101   CompileTask* _first;
102   CompileTask* _last;
103 
104   CompileTask* _first_stale;
105 
106   volatile int _size;
107   int _peak_size;
108   uint _total_added;
109   uint _total_removed;
110 
111   void purge_stale_tasks();
112  public:
113   CompileQueue(const char* name) {
114     _name = name;
115     _first = nullptr;
116     _last = nullptr;
117     _size = 0;
118     _total_added = 0;
119     _total_removed = 0;
120     _peak_size = 0;
121     _first_stale = nullptr;
122   }
123 
124   const char*  name() const                      { return _name; }
125 
126   void         add(CompileTask* task);
127   void         remove(CompileTask* task);
128   void         remove_and_mark_stale(CompileTask* task);
129   CompileTask* first()                           { return _first; }
130   CompileTask* last()                            { return _last;  }
131 
132   CompileTask* get(CompilerThread* thread);
133 
134   bool         is_empty() const                  { return _first == nullptr; }
135   int          size()     const                  { return _size;          }
136 
137   int         get_peak_size()     const          { return _peak_size; }
138   uint        get_total_added()   const          { return _total_added; }
139   uint        get_total_removed() const          { return _total_removed; }
140 
141   // Redefine Classes support
142   void mark_on_stack();
143   void free_all();
144   void print_tty();
145   void print(outputStream* st = tty);
146 
147   ~CompileQueue() {
148     assert (is_empty(), " Compile Queue must be empty");
149   }
150 };
151 
152 // CompileTaskWrapper
153 //
154 // Assign this task to the current thread.  Deallocate the task
155 // when the compilation is complete.
156 class CompileTaskWrapper : StackObj {
157 public:
158   CompileTaskWrapper(CompileTask* task);
159   ~CompileTaskWrapper();
160 };
161 
162 // Compilation
163 //
164 // The broker for all compilation requests.
165 class CompileBroker: AllStatic {
166  friend class Threads;
167  friend class CompileTaskWrapper;
168 
169  public:
170   enum {
171     name_buffer_length = 100
172   };
173 
174   // Compile type Information for print_last_compile() and CompilerCounters
175   enum { no_compile, normal_compile, osr_compile, native_compile };
176   static int assign_compile_id (const methodHandle& method, int osr_bci);
177 
178 
179  private:
180   static bool _initialized;
181   static volatile bool _should_block;
182 
183   // This flag can be used to stop compilation or turn it back on
184   static volatile jint _should_compile_new_jobs;
185 
186   // The installed compiler(s)
187   static AbstractCompiler* _compilers[2];
188 
189   // The maximum numbers of compiler threads to be determined during startup.
190   static int _c1_count, _c2_count;
191 
192   // An array of compiler thread Java objects
193   static jobject *_compiler1_objects, *_compiler2_objects;
194 
195   // An array of compiler logs
196   static CompileLog **_compiler1_logs, **_compiler2_logs;
197 
198   // These counters are used for assigning id's to each compilation
199   static volatile jint _compilation_id;
200   static volatile jint _osr_compilation_id;
201   static volatile jint _native_compilation_id;
202 
203   static CompileQueue* _c2_compile_queue;
204   static CompileQueue* _c1_compile_queue;
205 
206   // performance counters
207   static PerfCounter* _perf_total_compilation;
208   static PerfCounter* _perf_osr_compilation;
209   static PerfCounter* _perf_standard_compilation;
210 
211   static PerfCounter* _perf_total_bailout_count;
212   static PerfCounter* _perf_total_invalidated_count;
213   static PerfCounter* _perf_total_compile_count;
214   static PerfCounter* _perf_total_osr_compile_count;
215   static PerfCounter* _perf_total_standard_compile_count;
216 
217   static PerfCounter* _perf_sum_osr_bytes_compiled;
218   static PerfCounter* _perf_sum_standard_bytes_compiled;
219   static PerfCounter* _perf_sum_nmethod_size;
220   static PerfCounter* _perf_sum_nmethod_code_size;
221 
222   static PerfStringVariable* _perf_last_method;
223   static PerfStringVariable* _perf_last_failed_method;
224   static PerfStringVariable* _perf_last_invalidated_method;
225   static PerfVariable*       _perf_last_compile_type;
226   static PerfVariable*       _perf_last_compile_size;
227   static PerfVariable*       _perf_last_failed_type;
228   static PerfVariable*       _perf_last_invalidated_type;
229 
230   // Timers and counters for generating statistics
231   static elapsedTimer _t_total_compilation;
232   static elapsedTimer _t_osr_compilation;
233   static elapsedTimer _t_standard_compilation;
234   static elapsedTimer _t_invalidated_compilation;
235   static elapsedTimer _t_bailedout_compilation;
236 
237   static uint _total_compile_count;
238   static uint _total_bailout_count;
239   static uint _total_invalidated_count;
240   static uint _total_native_compile_count;
241   static uint _total_osr_compile_count;
242   static uint _total_standard_compile_count;
243   static uint _total_compiler_stopped_count;
244   static uint _total_compiler_restarted_count;
245   static uint _sum_osr_bytes_compiled;
246   static uint _sum_standard_bytes_compiled;
247   static uint _sum_nmethod_size;
248   static uint _sum_nmethod_code_size;
249   static jlong _peak_compilation_time;
250 
251   static CompilerStatistics _stats_per_level[];
252 
253   static volatile int _print_compilation_warning;
254 
255   enum ThreadType {
256     compiler_t,
257     deoptimizer_t
258   };
259 
260   static JavaThread* make_thread(ThreadType type, jobject thread_oop, CompileQueue* queue, AbstractCompiler* comp, JavaThread* THREAD);
261   static void init_compiler_threads();
262   static void possibly_add_compiler_threads(JavaThread* THREAD);
263   static bool compilation_is_prohibited(const methodHandle& method, int osr_bci, int comp_level, bool excluded);
264 
265   static CompileTask* create_compile_task(CompileQueue*       queue,
266                                           int                 compile_id,
267                                           const methodHandle& method,
268                                           int                 osr_bci,
269                                           int                 comp_level,
270                                           const methodHandle& hot_method,
271                                           int                 hot_count,
272                                           CompileTask::CompileReason compile_reason,
273                                           bool                blocking);
274   static void wait_for_completion(CompileTask* task);
275 #if INCLUDE_JVMCI
276   static bool wait_for_jvmci_completion(JVMCICompiler* comp, CompileTask* task, JavaThread* thread);
277 #endif
278 
279   static void free_buffer_blob_if_allocated(CompilerThread* thread);
280 
281   static void invoke_compiler_on_method(CompileTask* task);
282   static void handle_compile_error(CompilerThread* thread, CompileTask* task, ciEnv* ci_env,
283                                    int compilable, const char* failure_reason);
284   static void update_compile_perf_data(CompilerThread *thread, const methodHandle& method, bool is_osr);
285 
286   static void collect_statistics(CompilerThread* thread, elapsedTimer time, CompileTask* task);
287 
288   static void compile_method_base(const methodHandle& method,
289                                   int osr_bci,
290                                   int comp_level,
291                                   const methodHandle& hot_method,
292                                   int hot_count,
293                                   CompileTask::CompileReason compile_reason,
294                                   bool blocking,
295                                   Thread* thread);
296 
297   static CompileQueue* compile_queue(int comp_level);
298   static bool init_compiler_runtime();
299   static void shutdown_compiler_runtime(AbstractCompiler* comp, CompilerThread* thread);
300 
301 public:
302   enum {
303     // The entry bci used for non-OSR compilations.
304     standard_entry_bci = InvocationEntryBci
305   };
306 
307   static AbstractCompiler* compiler(int comp_level) {
308     if (is_c2_compile(comp_level)) return _compilers[1]; // C2
309     if (is_c1_compile(comp_level)) return _compilers[0]; // C1
310     return nullptr;
311   }
312 
313   static bool compilation_is_complete(const methodHandle& method, int osr_bci, int comp_level);
314   static bool compilation_is_in_queue(const methodHandle& method);
315   static void print_compile_queues(outputStream* st);
316   static int queue_size(int comp_level) {
317     CompileQueue *q = compile_queue(comp_level);
318     return q != nullptr ? q->size() : 0;
319   }
320   static void compilation_init(JavaThread* THREAD);
321   static void init_compiler_thread_log();
322   static nmethod* compile_method(const methodHandle& method,
323                                  int osr_bci,
324                                  int comp_level,
325                                  const methodHandle& hot_method,
326                                  int hot_count,
327                                  CompileTask::CompileReason compile_reason,
328                                  TRAPS);
329   static CompileQueue* c1_compile_queue();
330   static CompileQueue* c2_compile_queue();
331 
332 private:
333   static nmethod* compile_method(const methodHandle& method,
334                                    int osr_bci,
335                                    int comp_level,
336                                    const methodHandle& hot_method,
337                                    int hot_count,
338                                    CompileTask::CompileReason compile_reason,
339                                    DirectiveSet* directive,
340                                    TRAPS);
341 
342 public:
343   // Acquire any needed locks and assign a compile id
344   static int assign_compile_id_unlocked(Thread* thread, const methodHandle& method, int osr_bci);
345 
346   static void compiler_thread_loop();
347   static int get_compilation_id() { return _compilation_id; }
348 
349   // Set _should_block.
350   // Call this from the VM, with Threads_lock held and a safepoint requested.
351   static void set_should_block();
352 
353   // Call this from the compiler at convenient points, to poll for _should_block.
354   static void maybe_block();
355 
356   enum CompilerActivity {
357     // Flags for toggling compiler activity
358     stop_compilation     = 0,
359     run_compilation      = 1,
360     shutdown_compilation = 2
361   };
362 
363   static inline jint get_compilation_activity_mode() { return _should_compile_new_jobs; }
364   static inline bool should_compile_new_jobs() { return UseCompiler && (_should_compile_new_jobs == run_compilation); }
365   static bool set_should_compile_new_jobs(jint new_state) {
366     // Return success if the current caller set it
367     jint old = Atomic::cmpxchg(&_should_compile_new_jobs, 1-new_state, new_state);
368     bool success = (old == (1-new_state));
369     if (success) {
370       if (new_state == run_compilation) {
371         _total_compiler_restarted_count++;
372       } else {
373         _total_compiler_stopped_count++;
374       }
375     }
376     return success;
377   }
378 
379   static void disable_compilation_forever() {
380     UseCompiler               = false;
381     AlwaysCompileLoopMethods  = false;
382     Atomic::xchg(&_should_compile_new_jobs, jint(shutdown_compilation));
383   }
384 
385   static bool is_compilation_disabled_forever() {
386     return _should_compile_new_jobs == shutdown_compilation;
387   }
388   static void handle_full_code_cache(CodeBlobType code_blob_type);
389   // Ensures that warning is only printed once.
390   static bool should_print_compiler_warning() {
391     jint old = Atomic::cmpxchg(&_print_compilation_warning, 0, 1);
392     return old == 0;
393   }
394   // Return total compilation ticks
395   static jlong total_compilation_ticks();
396 
397   // Redefine Classes support
398   static void mark_on_stack();
399 
400   // Print current compilation time stats for a given compiler
401   static void print_times(const char* name, CompilerStatistics* stats);
402 
403   // Print a detailed accounting of compilation time
404   static void print_times(bool per_compiler = true, bool aggregate = true);
405 
406   // compiler name for debugging
407   static const char* compiler_name(int comp_level);
408 
409   // Provide access to compiler thread Java objects
410   static jobject compiler1_object(int idx) {
411     assert(_compiler1_objects != nullptr, "must be initialized");
412     assert(idx < _c1_count, "oob");
413     return _compiler1_objects[idx];
414   }
415 
416   static jobject compiler2_object(int idx) {
417     assert(_compiler2_objects != nullptr, "must be initialized");
418     assert(idx < _c2_count, "oob");
419     return _compiler2_objects[idx];
420   }
421 
422   static AbstractCompiler* compiler1() { return _compilers[0]; }
423   static AbstractCompiler* compiler2() { return _compilers[1]; }
424 
425   static bool can_remove(CompilerThread *ct, bool do_it);
426 
427   static CompileLog* get_log(CompilerThread* ct);
428 
429   static int get_c1_thread_count() {                return _compilers[0]->num_compiler_threads(); }
430   static int get_c2_thread_count() {                return _compilers[1]->num_compiler_threads(); }
431   static int get_total_compile_count() {            return _total_compile_count; }
432   static int get_total_bailout_count() {            return _total_bailout_count; }
433   static int get_total_invalidated_count() {        return _total_invalidated_count; }
434   static int get_total_native_compile_count() {     return _total_native_compile_count; }
435   static int get_total_osr_compile_count() {        return _total_osr_compile_count; }
436   static int get_total_standard_compile_count() {   return _total_standard_compile_count; }
437   static int get_total_compiler_stopped_count() {   return _total_compiler_stopped_count; }
438   static int get_total_compiler_restarted_count() { return _total_compiler_restarted_count; }
439   static int get_sum_osr_bytes_compiled() {         return _sum_osr_bytes_compiled; }
440   static int get_sum_standard_bytes_compiled() {    return _sum_standard_bytes_compiled; }
441   static int get_sum_nmethod_size() {               return _sum_nmethod_size;}
442   static int get_sum_nmethod_code_size() {          return _sum_nmethod_code_size; }
443   static jlong get_peak_compilation_time() {        return _peak_compilation_time; }
444   static jlong get_total_compilation_time() {       return _t_total_compilation.milliseconds(); }
445 
446   // Log that compilation profiling is skipped because metaspace is full.
447   static void log_metaspace_failure();
448 
449   // CodeHeap State Analytics.
450   static void print_info(outputStream *out);
451   static void print_heapinfo(outputStream *out, const char* function, size_t granularity);
452 };
453 
454 #endif // SHARE_COMPILER_COMPILEBROKER_HPP