annotate src/share/vm/compiler/compileBroker.cpp @ 17595:3eed8712d410

Merge with jdk8u11-b12
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 15 Oct 2014 12:09:28 +0200
parents 4a6e24a8fc2c 5656140324ed
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17567
5656140324ed 8030763: Validate global memory allocation
hseigel
parents: 13074
diff changeset
2 * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
28 #include "code/codeCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
29 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
30 #include "compiler/compileLog.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
31 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
32 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
33 #include "memory/allocation.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
34 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
35 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
36 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
37 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
38 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
39 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
40 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
41 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
42 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
43 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
44 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
45 #include "runtime/sweeper.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
46 #include "trace/tracing.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
47 #include "utilities/dtrace.hpp"
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
48 #include "utilities/events.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
49 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
50 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
51 #endif
7125
1baf7f1e3f23 decoupled C++ Graal runtime from C1
Doug Simon <doug.simon@oracle.com>
parents: 6948
diff changeset
52 #ifdef GRAAL
1baf7f1e3f23 decoupled C++ Graal runtime from C1
Doug Simon <doug.simon@oracle.com>
parents: 6948
diff changeset
53 #include "graal/graalCompiler.hpp"
16447
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
54 #ifdef COMPILERGRAAL
16625
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
55 #include "graal/graalRuntime.hpp"
16447
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
56 #include "runtime/vframe.hpp"
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
57 #endif
7125
1baf7f1e3f23 decoupled C++ Graal runtime from C1
Doug Simon <doug.simon@oracle.com>
parents: 6948
diff changeset
58 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
59 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
60 #include "opto/c2compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
61 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
62 #ifdef SHARK
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
63 #include "shark/sharkCompiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
64 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 #ifdef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // Only bother with this argument setup if dtrace is available
a61af66fc99e Initial load
duke
parents:
diff changeset
69
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
70 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 HS_DTRACE_PROBE_DECL8(hotspot, method__compile__begin,
a61af66fc99e Initial load
duke
parents:
diff changeset
72 char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
73 HS_DTRACE_PROBE_DECL9(hotspot, method__compile__end,
a61af66fc99e Initial load
duke
parents:
diff changeset
74 char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
75
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
76 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(method, comp_name) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 { \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
78 Symbol* klass_name = (method)->klass_name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
79 Symbol* name = (method)->name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
80 Symbol* signature = (method)->signature(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 HS_DTRACE_PROBE8(hotspot, method__compile__begin, \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 comp_name, strlen(comp_name), \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 klass_name->bytes(), klass_name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
84 name->bytes(), name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
85 signature->bytes(), signature->utf8_length()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
88 #define DTRACE_METHOD_COMPILE_END_PROBE(method, comp_name, success) \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89 { \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
90 Symbol* klass_name = (method)->klass_name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
91 Symbol* name = (method)->name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
92 Symbol* signature = (method)->signature(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93 HS_DTRACE_PROBE9(hotspot, method__compile__end, \
a61af66fc99e Initial load
duke
parents:
diff changeset
94 comp_name, strlen(comp_name), \
a61af66fc99e Initial load
duke
parents:
diff changeset
95 klass_name->bytes(), klass_name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
96 name->bytes(), name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
97 signature->bytes(), signature->utf8_length(), (success)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
100 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
101
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
102 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(method, comp_name) \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
103 { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
104 Symbol* klass_name = (method)->klass_name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
105 Symbol* name = (method)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
106 Symbol* signature = (method)->signature(); \
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
107 HOTSPOT_METHOD_COMPILE_BEGIN( \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
108 comp_name, strlen(comp_name), \
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
109 (char *) klass_name->bytes(), klass_name->utf8_length(), \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
110 (char *) name->bytes(), name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
111 (char *) signature->bytes(), signature->utf8_length()); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
112 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
113
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
114 #define DTRACE_METHOD_COMPILE_END_PROBE(method, comp_name, success) \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
115 { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
116 Symbol* klass_name = (method)->klass_name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
117 Symbol* name = (method)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
118 Symbol* signature = (method)->signature(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
119 HOTSPOT_METHOD_COMPILE_END( \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
120 comp_name, strlen(comp_name), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
121 (char *) klass_name->bytes(), klass_name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
122 (char *) name->bytes(), name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
123 (char *) signature->bytes(), signature->utf8_length(), (success)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
124 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
125 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3441
diff changeset
126
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #else // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
128
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
129 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(method, comp_name)
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
130 #define DTRACE_METHOD_COMPILE_END_PROBE(method, comp_name, success)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #endif // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 bool CompileBroker::_initialized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 volatile bool CompileBroker::_should_block = false;
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
136 volatile jint CompileBroker::_print_compilation_warning = 0;
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
137 volatile jint CompileBroker::_should_compile_new_jobs = run_compilation;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // The installed compiler(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
140 AbstractCompiler* CompileBroker::_compilers[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // These counters are used for assigning id's to each compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
143 uint CompileBroker::_compilation_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 uint CompileBroker::_osr_compilation_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Debugging information
a61af66fc99e Initial load
duke
parents:
diff changeset
147 int CompileBroker::_last_compile_type = no_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 int CompileBroker::_last_compile_level = CompLevel_none;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 char CompileBroker::_last_method_compiled[CompileBroker::name_buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
152 PerfCounter* CompileBroker::_perf_total_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 PerfCounter* CompileBroker::_perf_osr_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 PerfCounter* CompileBroker::_perf_standard_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 PerfCounter* CompileBroker::_perf_total_bailout_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 PerfCounter* CompileBroker::_perf_total_invalidated_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 PerfCounter* CompileBroker::_perf_total_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 PerfCounter* CompileBroker::_perf_total_osr_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 PerfCounter* CompileBroker::_perf_total_standard_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 PerfCounter* CompileBroker::_perf_sum_osr_bytes_compiled = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 PerfCounter* CompileBroker::_perf_sum_standard_bytes_compiled = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 PerfCounter* CompileBroker::_perf_sum_nmethod_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 PerfCounter* CompileBroker::_perf_sum_nmethod_code_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 PerfStringVariable* CompileBroker::_perf_last_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 PerfStringVariable* CompileBroker::_perf_last_failed_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 PerfStringVariable* CompileBroker::_perf_last_invalidated_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 PerfVariable* CompileBroker::_perf_last_compile_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 PerfVariable* CompileBroker::_perf_last_compile_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 PerfVariable* CompileBroker::_perf_last_failed_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 PerfVariable* CompileBroker::_perf_last_invalidated_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Timers and counters for generating statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
176 elapsedTimer CompileBroker::_t_total_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 elapsedTimer CompileBroker::_t_osr_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 elapsedTimer CompileBroker::_t_standard_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 int CompileBroker::_total_bailout_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 int CompileBroker::_total_invalidated_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 int CompileBroker::_total_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 int CompileBroker::_total_osr_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 int CompileBroker::_total_standard_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 int CompileBroker::_sum_osr_bytes_compiled = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 int CompileBroker::_sum_standard_bytes_compiled = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 int CompileBroker::_sum_nmethod_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 int CompileBroker::_sum_nmethod_code_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
190
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
191 long CompileBroker::_peak_compilation_time = 0;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
192
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
193 CompileQueue* CompileBroker::_c2_method_queue = NULL;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
194 CompileQueue* CompileBroker::_c1_method_queue = NULL;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
195 CompileTask* CompileBroker::_task_free_list = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
197 GrowableArray<CompilerThread*>* CompileBroker::_compiler_threads = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
200 class CompilationLog : public StringEventLog {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
201 public:
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
202 CompilationLog() : StringEventLog("Compilation events") {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
203 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
204
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
205 void log_compile(JavaThread* thread, CompileTask* task) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
206 StringLogMessage lm;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
207 stringStream sstr = lm.stream();
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
208 // msg.time_stamp().update_to(tty->time_stamp().ticks());
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
209 task->print_compilation(&sstr, NULL, true);
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
210 log(thread, "%s", (const char*)lm);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
211 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
212
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
213 void log_nmethod(JavaThread* thread, nmethod* nm) {
4944
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4875
diff changeset
214 log(thread, "nmethod %d%s " INTPTR_FORMAT " code ["INTPTR_FORMAT ", " INTPTR_FORMAT "]",
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4875
diff changeset
215 nm->compile_id(), nm->is_osr_method() ? "%" : "",
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
216 nm, nm->code_begin(), nm->code_end());
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
217 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
218
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
219 void log_failure(JavaThread* thread, CompileTask* task, const char* reason, const char* retry_message) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
220 StringLogMessage lm;
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
221 lm.print("%4d COMPILE SKIPPED: %s", task->compile_id(), reason);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
222 if (retry_message != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
223 lm.append(" (%s)", retry_message);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
224 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
225 lm.print("\n");
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
226 log(thread, "%s", (const char*)lm);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
227 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
228 };
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
229
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
230 static CompilationLog* _compilation_log = NULL;
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
231
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
232 void compileBroker_init() {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
233 if (LogEvents) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
234 _compilation_log = new CompilationLog();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
235 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
236 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 CompileTaskWrapper::CompileTaskWrapper(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 thread->set_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 CompileLog* log = thread->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 if (log != NULL) task->log_task_start(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 CompileTaskWrapper::~CompileTaskWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 CompileTask* task = thread->task();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 CompileLog* log = thread->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (log != NULL) task->log_task_done(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 thread->set_task(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 task->set_code_handle(NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
252 thread->set_env(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (task->is_blocking()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 MutexLocker notifier(task->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 task->mark_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Notify the waiting thread that the compilation has completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
257 task->lock()->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
258 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 task->mark_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // By convention, the compiling thread is responsible for
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // recycling a non-blocking CompileTask.
a61af66fc99e Initial load
duke
parents:
diff changeset
263 CompileBroker::free_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // CompileTask::initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void CompileTask::initialize(int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
271 methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
272 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
273 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
274 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
275 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
276 const char* comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
277 bool is_blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 assert(!_lock->is_locked(), "bad locking");
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 _compile_id = compile_id;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
281 _method = method();
7409
30866cd626b0 8004883: NPG: clean up anonymous class fix
coleenp
parents: 7185
diff changeset
282 _method_holder = JNIHandles::make_global(method->method_holder()->klass_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 _osr_bci = osr_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 _is_blocking = is_blocking;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _comp_level = comp_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 _num_inlined_bytecodes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 _is_complete = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 _is_success = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 _code_handle = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 _hot_method = NULL;
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
293 _hot_method_holder = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 _hot_count = hot_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 _time_queued = 0; // tidy
a61af66fc99e Initial load
duke
parents:
diff changeset
296 _comment = comment;
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 _time_queued = os::elapsed_counter();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (hot_method.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 if (hot_method == method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 _hot_method = _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
304 _hot_method = hot_method();
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
305 // only add loader or mirror if different from _method_holder
7409
30866cd626b0 8004883: NPG: clean up anonymous class fix
coleenp
parents: 7185
diff changeset
306 _hot_method_holder = JNIHandles::make_global(hot_method->method_holder()->klass_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // CompileTask::code/set_code
a61af66fc99e Initial load
duke
parents:
diff changeset
316 nmethod* CompileTask::code() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (_code_handle == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 return _code_handle->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void CompileTask::set_code(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 if (_code_handle == NULL && nm == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 guarantee(_code_handle != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
323 _code_handle->set_code(nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 if (nm == NULL) _code_handle = NULL; // drop the handle also
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // CompileTask::free
a61af66fc99e Initial load
duke
parents:
diff changeset
329 void CompileTask::free() {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 set_code(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 assert(!_lock->is_locked(), "Should not be locked when freed");
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
332 JNIHandles::destroy_global(_method_holder);
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
333 JNIHandles::destroy_global(_hot_method_holder);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
337 void CompileTask::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
338 // Mark these methods as something redefine classes cannot remove.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
339 _method->set_on_stack(true);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
340 if (_hot_method != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
341 _hot_method->set_on_stack(true);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
342 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
343 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
344
0
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // CompileTask::print
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void CompileTask::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 tty->print("<CompileTask compile_id=%d ", _compile_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 tty->print("method=");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
350 _method->print_name(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 tty->print_cr(" osr_bci=%d is_blocking=%s is_complete=%s is_success=%s>",
a61af66fc99e Initial load
duke
parents:
diff changeset
352 _osr_bci, bool_to_str(_is_blocking),
a61af66fc99e Initial load
duke
parents:
diff changeset
353 bool_to_str(_is_complete), bool_to_str(_is_success));
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
356
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // CompileTask::print_line_on_error
a61af66fc99e Initial load
duke
parents:
diff changeset
359 //
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // This function is called by fatal error handler when the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // causing troubles is a compiler thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
362 //
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // Do not grab any lock, do not allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
364 //
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Otherwise it's the same as CompileTask::print_line()
a61af66fc99e Initial load
duke
parents:
diff changeset
366 //
a61af66fc99e Initial load
duke
parents:
diff changeset
367 void CompileTask::print_line_on_error(outputStream* st, char* buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // print compiler name
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
369 st->print("%s:", CompileBroker::compiler_name(comp_level()));
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
370 print_compilation(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // CompileTask::print_line
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void CompileTask::print_line() {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 ttyLocker ttyl; // keep the following output all in one block
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
377 print_compilation();
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
378 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
379
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
380
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
381 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
382 // CompileTask::print_compilation_impl
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
383 void CompileTask::print_compilation_impl(outputStream* st, Method* method, int compile_id, int comp_level,
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
384 bool is_osr_method, int osr_bci, bool is_blocking,
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
385 const char* msg, bool short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
386 if (!short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
387 st->print("%7d ", (int) st->time_stamp().milliseconds()); // print timestamp
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
388 }
15494
e20a45d17181 Move CIPrintCompilerName handling into CompileTask::print_compilation_impl
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15487
diff changeset
389 // print compiler name if requested
16180
404d2e86488a CIPrintCompilerName: compiler name should be printed on supplied stream
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16145
diff changeset
390 if (CIPrintCompilerName) st->print("%s:", CompileBroker::compiler_name(comp_level));
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
391 st->print("%4d ", compile_id); // print compilation number
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
392
3441
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
393 // For unloaded methods the transition to zombie occurs after the
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
394 // method is cleared so it's impossible to report accurate
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
395 // information for that case.
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
396 bool is_synchronized = false;
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
397 bool has_exception_handler = false;
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
398 bool is_native = false;
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
399 if (method != NULL) {
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
400 is_synchronized = method->is_synchronized();
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
401 has_exception_handler = method->has_exception_handler();
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
402 is_native = method->is_native();
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
403 }
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
404 // method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
405 const char compile_type = is_osr_method ? '%' : ' ';
3441
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
406 const char sync_char = is_synchronized ? 's' : ' ';
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
407 const char exception_char = has_exception_handler ? '!' : ' ';
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
408 const char blocking_char = is_blocking ? 'b' : ' ';
3441
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
409 const char native_char = is_native ? 'n' : ' ';
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
410
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
411 // print method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
412 st->print("%c%c%c%c%c ", compile_type, sync_char, exception_char, blocking_char, native_char);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
413
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
414 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
415 if (comp_level != -1) st->print("%d ", comp_level);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
416 else st->print("- ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
417 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
418 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
419
3441
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
420 if (method == NULL) {
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
421 st->print("(method)");
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
422 } else {
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
423 method->print_short_name(st);
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
424 if (is_osr_method) {
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
425 st->print(" @ %d", osr_bci);
f56542cb325a 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
426 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
427 if (method->is_native())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
428 st->print(" (native)");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
429 else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
430 st->print(" (%d bytes)", method->code_size());
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
431 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
432
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
433 if (msg != NULL) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
434 st->print(" %s", msg);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
435 }
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
436 if (!short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
437 st->cr();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
438 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
441 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
442 // CompileTask::print_inlining
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
443 void CompileTask::print_inlining(outputStream* st, ciMethod* method, int inline_level, int bci, const char* msg) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
444 // 1234567
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
445 st->print(" "); // print timestamp
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
446 // 1234
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
447 st->print(" "); // print compilation number
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
448
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
449 // method attributes
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
450 if (method->is_loaded()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
451 const char sync_char = method->is_synchronized() ? 's' : ' ';
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
452 const char exception_char = method->has_exception_handlers() ? '!' : ' ';
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
453 const char monitors_char = method->has_monitor_bytecodes() ? 'm' : ' ';
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
454
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
455 // print method attributes
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
456 st->print(" %c%c%c ", sync_char, exception_char, monitors_char);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
457 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
458 // %s!bn
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
459 st->print(" "); // print method attributes
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
460 }
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
461
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
462 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
463 st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
464 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
465 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
466 st->print(" "); // initial inlining indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
467
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
468 for (int i = 0; i < inline_level; i++) st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
469
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
470 st->print("@ %d ", bci); // print bci
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
471 method->print_short_name(st);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
472 if (method->is_loaded())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
473 st->print(" (%d bytes)", method->code_size());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
474 else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
475 st->print(" (not loaded)");
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
476
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
477 if (msg != NULL) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
478 st->print(" %s", msg);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
479 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
480 st->cr();
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
481 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
482
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
483 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
484 // CompileTask::print_inline_indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
485 void CompileTask::print_inline_indent(int inline_level, outputStream* st) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
486 // 1234567
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
487 st->print(" "); // print timestamp
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
488 // 1234
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
489 st->print(" "); // print compilation number
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
490 // %s!bn
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
491 st->print(" "); // print method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
492 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
493 st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
494 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
495 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
496 st->print(" "); // initial inlining indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
497 for (int i = 0; i < inline_level; i++) st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
498 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
499
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
500 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
501 // CompileTask::print_compilation
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
502 void CompileTask::print_compilation(outputStream* st, const char* msg, bool short_form) {
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
503 bool is_osr_method = osr_bci() != InvocationEntryBci;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
504 print_compilation_impl(st, method(), compile_id(), comp_level(), is_osr_method, osr_bci(), is_blocking(), msg, short_form);
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
505 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // CompileTask::log_task
a61af66fc99e Initial load
duke
parents:
diff changeset
509 void CompileTask::log_task(xmlStream* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 Thread* thread = Thread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
511 methodHandle method(thread, this->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
512 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // <task id='9' method='M' osr_bci='X' level='1' blocking='1' stamp='1.234'>
8730
b7c2c5b2572c 8005772: Stubs report compile id -1 in phase events
neliasso
parents: 7998
diff changeset
515 log->print(" compile_id='%d'", _compile_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (_osr_bci != CompileBroker::standard_entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 log->print(" compile_kind='osr'"); // same as nmethod::compile_kind
a61af66fc99e Initial load
duke
parents:
diff changeset
518 } // else compile_kind='c2c'
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if (!method.is_null()) log->method(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 if (_osr_bci != CompileBroker::standard_entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 log->print(" osr_bci='%d'", _osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
522 }
15487
07fac8558d7b update state flag after initialization to allow other compiler threads to execute
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15463
diff changeset
523 // Always print the level in tiered.
07fac8558d7b update state flag after initialization to allow other compiler threads to execute
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15463
diff changeset
524 if (_comp_level != CompLevel_highest_tier || TieredCompilation) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
525 log->print(" level='%d'", _comp_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if (_is_blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 log->print(" blocking='1'");
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // CompileTask::log_task_queued
a61af66fc99e Initial load
duke
parents:
diff changeset
536 void CompileTask::log_task_queued() {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
538 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
539 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 xtty->begin_elem("task_queued");
a61af66fc99e Initial load
duke
parents:
diff changeset
542 log_task(xtty);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 if (_comment != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 xtty->print(" comment='%s'", _comment);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (_hot_method != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
547 methodHandle hot(thread, _hot_method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
548 methodHandle method(thread, _method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 if (hot() != method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 xtty->method(hot);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if (_hot_count != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 xtty->print(" hot_count='%d'", _hot_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // CompileTask::log_task_start
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void CompileTask::log_task_start(CompileLog* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 log->begin_head("task");
a61af66fc99e Initial load
duke
parents:
diff changeset
564 log_task(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 log->end_head();
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // CompileTask::log_task_done
a61af66fc99e Initial load
duke
parents:
diff changeset
571 void CompileTask::log_task_done(CompileLog* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 Thread* thread = Thread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
573 methodHandle method(thread, this->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
574 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // <task_done ... stamp='1.234'> </task>
a61af66fc99e Initial load
duke
parents:
diff changeset
577 nmethod* nm = code();
a61af66fc99e Initial load
duke
parents:
diff changeset
578 log->begin_elem("task_done success='%d' nmsize='%d' count='%d'",
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
579 _is_success, nm == NULL ? 0 : nm->content_size(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 method->invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
581 int bec = method->backedge_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (bec != 0) log->print(" backedge_count='%d'", bec);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Note: "_is_complete" is about to be set, but is not.
a61af66fc99e Initial load
duke
parents:
diff changeset
584 if (_num_inlined_bytecodes != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
585 log->print(" inlined_bytes='%d'", _num_inlined_bytecodes);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
588 log->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
589 log->tail("task");
a61af66fc99e Initial load
duke
parents:
diff changeset
590 log->clear_identities(); // next task will have different CI
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (log->unflushed_count() > 2000) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 log->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 log->mark_file_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // Add a CompileTask to a CompileQueue
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void CompileQueue::add(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 assert(lock()->owned_by_self(), "must own lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 task->set_next(NULL);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
604 task->set_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
605
a61af66fc99e Initial load
duke
parents:
diff changeset
606 if (_last == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // The compile queue is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
608 assert(_first == NULL, "queue is empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
609 _first = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 _last = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Append the task to the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
613 assert(_last->next() == NULL, "not last");
a61af66fc99e Initial load
duke
parents:
diff changeset
614 _last->set_next(task);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
615 task->set_prev(_last);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
616 _last = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
618 ++_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // Mark the method as being in the compile queue.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
621 task->method()->set_queued_for_compilation();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 if (CIPrintCompileQueue) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 print();
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 if (LogCompilation && xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 task->log_task_queued();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // Notify CompilerThreads that a task is available.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
632 lock()->notify_all();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
635 void CompileQueue::delete_all() {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
636 assert(lock()->owned_by_self(), "must own lock");
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
637 if (_first != NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
638 for (CompileTask* task = _first; task != NULL; task = task->next()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
639 delete task;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
640 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
641 _first = NULL;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
642 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
643 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
644
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // CompileQueue::get
a61af66fc99e Initial load
duke
parents:
diff changeset
647 //
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // Get the next CompileTask from a CompileQueue
a61af66fc99e Initial load
duke
parents:
diff changeset
649 CompileTask* CompileQueue::get() {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
650 NMethodSweeper::possibly_sweep();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
651
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652 MutexLocker locker(lock());
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
653 // If _first is NULL we have no more compile jobs. There are two reasons for
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
654 // having no compile jobs: First, we compiled everything we wanted. Second,
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
655 // we ran out of code cache so compilation has been disabled. In the latter
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
656 // case we perform code cache sweeps to free memory such that we can re-enable
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
657 // compilation.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658 while (_first == NULL) {
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
659 // Exit loop if compilation is disabled forever
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
660 if (CompileBroker::is_compilation_disabled_forever()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
661 return NULL;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
662 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
663
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
664 if (UseCodeCacheFlushing && !CompileBroker::should_compile_new_jobs()) {
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
665 // Wait a certain amount of time to possibly do another sweep.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
666 // We must wait until stack scanning has happened so that we can
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
667 // transition a method's state from 'not_entrant' to 'zombie'.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
668 long wait_time = NmethodSweepCheckInterval * 1000;
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
669 if (FLAG_IS_DEFAULT(NmethodSweepCheckInterval)) {
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
670 // Only one thread at a time can do sweeping. Scale the
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
671 // wait time according to the number of compiler threads.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
672 // As a result, the next sweep is likely to happen every 100ms
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
673 // with an arbitrary number of threads that do sweeping.
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
674 wait_time = 100 * CICompilerCount;
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
675 }
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
676 bool timeout = lock()->wait(!Mutex::_no_safepoint_check_flag, wait_time);
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
677 if (timeout) {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
678 MutexUnlocker ul(lock());
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
679 NMethodSweeper::possibly_sweep();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
680 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
681 } else {
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
682 // If there are no compilation tasks and we can compile new jobs
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
683 // (i.e., there is enough free space in the code cache) there is
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
684 // no need to invoke the sweeper. As a result, the hotness of methods
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
685 // remains unchanged. This behavior is desired, since we want to keep
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
686 // the stable state, i.e., we do not want to evict methods from the
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
687 // code cache if it is unnecessary.
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
688 // We need a timed wait here, since compiler threads can exit if compilation
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
689 // is disabled forever. We use 5 seconds wait time; the exiting of compiler threads
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
690 // is not critical and we do not want idle compiler threads to wake up too often.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
691 lock()->wait(!Mutex::_no_safepoint_check_flag, 5*1000);
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
692 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
694
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
695 if (CompileBroker::is_compilation_disabled_forever()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
696 return NULL;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
697 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
698
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
699 CompileTask* task = CompilationPolicy::policy()->select_task(this);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
700 remove(task);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
701 return task;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
702 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
703
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
704 void CompileQueue::remove(CompileTask* task)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
705 {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
706 assert(lock()->owned_by_self(), "must own lock");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
707 if (task->prev() != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
708 task->prev()->set_next(task->next());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
709 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
710 // max is the first element
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
711 assert(task == _first, "Sanity");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
712 _first = task->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
715 if (task->next() != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
716 task->next()->set_prev(task->prev());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
717 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
718 // max is the last element
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
719 assert(task == _last, "Sanity");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
720 _last = task->prev();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
721 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
722 --_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
725 // methods in the compile queue need to be marked as used on the stack
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
726 // so that they don't get reclaimed by Redefine Classes
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
727 void CompileQueue::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
728 CompileTask* task = _first;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
729 while (task != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
730 task->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
731 task = task->next();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
732 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
733 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
734
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // CompileQueue::print
a61af66fc99e Initial load
duke
parents:
diff changeset
737 void CompileQueue::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 tty->print_cr("Contents of %s", name());
a61af66fc99e Initial load
duke
parents:
diff changeset
739 tty->print_cr("----------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
740 CompileTask* task = _first;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 while (task != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 task->print_line();
a61af66fc99e Initial load
duke
parents:
diff changeset
743 task = task->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
745 tty->print_cr("----------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 CompilerCounters::CompilerCounters(const char* thread_name, int instance, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 _current_method[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
751 _compile_type = CompileBroker::no_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // create the thread instance name space string - don't create an
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // instance subspace if instance is -1 - keeps the adapterThread
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // counters from having a ".0" namespace.
a61af66fc99e Initial load
duke
parents:
diff changeset
759 const char* thread_i = (instance == -1) ? thread_name :
a61af66fc99e Initial load
duke
parents:
diff changeset
760 PerfDataManager::name_space(thread_name, instance);
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 char* name = PerfDataManager::counter_name(thread_i, "method");
a61af66fc99e Initial load
duke
parents:
diff changeset
764 _perf_current_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
765 PerfDataManager::create_string_variable(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
766 cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
767 _current_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 name = PerfDataManager::counter_name(thread_i, "type");
a61af66fc99e Initial load
duke
parents:
diff changeset
770 _perf_compile_type = PerfDataManager::create_variable(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
771 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
772 (jlong)_compile_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
773 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 name = PerfDataManager::counter_name(thread_i, "time");
a61af66fc99e Initial load
duke
parents:
diff changeset
776 _perf_time = PerfDataManager::create_counter(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
777 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 name = PerfDataManager::counter_name(thread_i, "compiles");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 _perf_compiles = PerfDataManager::create_counter(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
781 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // CompileBroker::compilation_init
a61af66fc99e Initial load
duke
parents:
diff changeset
787 //
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Initialize the Compilation object
a61af66fc99e Initial load
duke
parents:
diff changeset
789 void CompileBroker::compilation_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 _last_method_compiled[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
791
13016
a196f1aaec86 8026949: -Xint flag prints wrong warning: Initialization of C1 thread failed (no space to run compilers)
anoll
parents: 12965
diff changeset
792 // No need to initialize compilation system if we do not use it.
a196f1aaec86 8026949: -Xint flag prints wrong warning: Initialization of C1 thread failed (no space to run compilers)
anoll
parents: 12965
diff changeset
793 if (!UseCompiler) {
a196f1aaec86 8026949: -Xint flag prints wrong warning: Initialization of C1 thread failed (no space to run compilers)
anoll
parents: 12965
diff changeset
794 return;
a196f1aaec86 8026949: -Xint flag prints wrong warning: Initialization of C1 thread failed (no space to run compilers)
anoll
parents: 12965
diff changeset
795 }
1970
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
796 #ifndef SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // Set the interface to the current compiler(s).
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
798 int c1_count = CompilationPolicy::policy()->compiler_count(CompLevel_simple);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
799 int c2_count = CompilationPolicy::policy()->compiler_count(CompLevel_full_optimization);
7154
5d0bb7d52783 changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents: 7125
diff changeset
800 #ifdef GRAAL
5d0bb7d52783 changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents: 7125
diff changeset
801 GraalCompiler* graal = new GraalCompiler();
5d0bb7d52783 changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents: 7125
diff changeset
802 #endif
14107
800057208a2c enable C1 + Graal tiered
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13969
diff changeset
803
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 #ifdef COMPILER1
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
805 if (c1_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
806 _compilers[0] = new Compiler();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
807 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
809
14124
7ad529321294 make: remove GRAALVM and introduce COMPILERGRAAL. fix client hosted-mode
Bernhard Urban <bernhard.urban@jku.at>
parents: 14107
diff changeset
810 #if defined(COMPILERGRAAL)
14107
800057208a2c enable C1 + Graal tiered
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13969
diff changeset
811 _compilers[1] = graal;
16399
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
812 if (FLAG_IS_DEFAULT(GraalThreads)) {
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
813 if (!TieredCompilation && FLAG_IS_DEFAULT(BootstrapGraal) || BootstrapGraal) {
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
814 // Graal will bootstrap so give it more threads
17166
9df38e5fbed6 Limit the maximum Graal thread amount to 32 if nothing else is specified (On SPARC with 256 threads we exceed code cache size)
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16625
diff changeset
815 c2_count = MIN2(32, os::active_processor_count());
16399
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
816 }
16145
237508bd73b9 when Graal bootstrap is enabled (explicitly or implicitly), allocate same number of Graal compiler threads in -UseGraalCompilationQueue as in +UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16142
diff changeset
817 } else {
16399
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
818 c2_count = GraalThreads;
16145
237508bd73b9 when Graal bootstrap is enabled (explicitly or implicitly), allocate same number of Graal compiler threads in -UseGraalCompilationQueue as in +UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16142
diff changeset
819 }
14124
7ad529321294 make: remove GRAALVM and introduce COMPILERGRAAL. fix client hosted-mode
Bernhard Urban <bernhard.urban@jku.at>
parents: 14107
diff changeset
820 #endif // COMPILERGRAAL
14107
800057208a2c enable C1 + Graal tiered
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13969
diff changeset
821
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 #ifdef COMPILER2
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
823 if (c2_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
824 _compilers[1] = new C2Compiler();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
825 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 #endif // COMPILER2
1970
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
827 #else // SHARK
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
828 int c1_count = 0;
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
829 int c2_count = 1;
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
830
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
831 _compilers[1] = new SharkCompiler();
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
832 #endif // SHARK
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1579
diff changeset
833
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // Initialize the CompileTask free list
a61af66fc99e Initial load
duke
parents:
diff changeset
835 _task_free_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // Start the CompilerThreads
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
838 init_compiler_threads(c1_count, c2_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // totalTime performance counter is always created as it is required
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // by the implementation of java.lang.management.CompilationMBean.
a61af66fc99e Initial load
duke
parents:
diff changeset
841 {
a61af66fc99e Initial load
duke
parents:
diff changeset
842 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
843 _perf_total_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
844 PerfDataManager::create_counter(JAVA_CI, "totalTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
845 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // create the jvmstat performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
854 _perf_osr_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
855 PerfDataManager::create_counter(SUN_CI, "osrTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
856 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 _perf_standard_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
859 PerfDataManager::create_counter(SUN_CI, "standardTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
860 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 _perf_total_bailout_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
863 PerfDataManager::create_counter(SUN_CI, "totalBailouts",
a61af66fc99e Initial load
duke
parents:
diff changeset
864 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 _perf_total_invalidated_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
867 PerfDataManager::create_counter(SUN_CI, "totalInvalidates",
a61af66fc99e Initial load
duke
parents:
diff changeset
868 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 _perf_total_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
871 PerfDataManager::create_counter(SUN_CI, "totalCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
872 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 _perf_total_osr_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
874 PerfDataManager::create_counter(SUN_CI, "osrCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
875 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 _perf_total_standard_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
878 PerfDataManager::create_counter(SUN_CI, "standardCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
879 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 _perf_sum_osr_bytes_compiled =
a61af66fc99e Initial load
duke
parents:
diff changeset
882 PerfDataManager::create_counter(SUN_CI, "osrBytes",
a61af66fc99e Initial load
duke
parents:
diff changeset
883 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 _perf_sum_standard_bytes_compiled =
a61af66fc99e Initial load
duke
parents:
diff changeset
886 PerfDataManager::create_counter(SUN_CI, "standardBytes",
a61af66fc99e Initial load
duke
parents:
diff changeset
887 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 _perf_sum_nmethod_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
890 PerfDataManager::create_counter(SUN_CI, "nmethodSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
891 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 _perf_sum_nmethod_code_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
894 PerfDataManager::create_counter(SUN_CI, "nmethodCodeSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
895 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 _perf_last_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
898 PerfDataManager::create_string_variable(SUN_CI, "lastMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
899 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
900 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 _perf_last_failed_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
903 PerfDataManager::create_string_variable(SUN_CI, "lastFailedMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
904 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
905 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 _perf_last_invalidated_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
908 PerfDataManager::create_string_variable(SUN_CI, "lastInvalidatedMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
909 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
910 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 _perf_last_compile_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
913 PerfDataManager::create_variable(SUN_CI, "lastType",
a61af66fc99e Initial load
duke
parents:
diff changeset
914 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
916 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 _perf_last_compile_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
919 PerfDataManager::create_variable(SUN_CI, "lastSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
920 PerfData::U_Bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
921 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
922 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 _perf_last_failed_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
926 PerfDataManager::create_variable(SUN_CI, "lastFailedType",
a61af66fc99e Initial load
duke
parents:
diff changeset
927 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
928 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
929 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
930
a61af66fc99e Initial load
duke
parents:
diff changeset
931 _perf_last_invalidated_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
932 PerfDataManager::create_variable(SUN_CI, "lastInvalidatedType",
a61af66fc99e Initial load
duke
parents:
diff changeset
933 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
934 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
935 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 _initialized = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
942 CompilerThread* CompileBroker::make_compiler_thread(const char* name, CompileQueue* queue, CompilerCounters* counters,
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
943 AbstractCompiler* comp, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944 CompilerThread* compiler_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
945
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
946 Klass* k =
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
947 SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
948 true, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
949 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
950 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
951 Handle string = java_lang_String::create_from_str(name, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // Initialize thread_oop to put it into the system threadGroup
a61af66fc99e Initial load
duke
parents:
diff changeset
954 Handle thread_group (THREAD, Universe::system_thread_group());
a61af66fc99e Initial load
duke
parents:
diff changeset
955 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
956 JavaCalls::call_special(&result, thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
957 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
958 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
959 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
960 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
961 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
962 CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 {
a61af66fc99e Initial load
duke
parents:
diff changeset
965 MutexLocker mu(Threads_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
966 compiler_thread = new CompilerThread(queue, counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // At this point the new CompilerThread data-races with this startup
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // thread (which I believe is the primoridal thread and NOT the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // thread). This means Java bytecodes being executed at startup can
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // queue compile jobs which will run at whatever default priority the
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // newly created CompilerThread runs at.
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // At this point it may be possible that no osthread was created for the
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // JavaThread due to lack of memory. We would have to throw an exception
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // in that case. However, since this must work and we do not allow
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // exceptions anyway, check and abort if this fails.
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 if (compiler_thread == NULL || compiler_thread->osthread() == NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
980 vm_exit_during_initialization("java.lang.OutOfMemoryError",
a61af66fc99e Initial load
duke
parents:
diff changeset
981 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 java_lang_Thread::set_thread(thread_oop(), compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // Note that this only sets the JavaThread _priority field, which by
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // definition is limited to Java priorities and not OS priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // The os-priority is set in the CompilerThread startup code itself
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
989
0
a61af66fc99e Initial load
duke
parents:
diff changeset
990 java_lang_Thread::set_priority(thread_oop(), NearMaxPriority);
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
991
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
992 // Note that we cannot call os::set_priority because it expects Java
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
993 // priorities and we are *explicitly* using OS priorities so that it's
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
994 // possible to set the compiler thread priority higher than any Java
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
995 // thread.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
996
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
997 int native_prio = CompilerThreadPriority;
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
998 if (native_prio == -1) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
999 if (UseCriticalCompilerThreadPriority) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1000 native_prio = os::java_to_os_priority[CriticalPriority];
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1001 } else {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1002 native_prio = os::java_to_os_priority[NearMaxPriority];
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1003 }
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1004 }
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1005 os::set_native_priority(compiler_thread, native_prio);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 java_lang_Thread::set_daemon(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 compiler_thread->set_threadObj(thread_oop());
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1010 compiler_thread->set_compiler(comp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 Threads::add(compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 Thread::start(compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 }
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
1014
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // Let go of Threads_lock before yielding
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 os::yield(); // make sure that the compiler thread is started early (especially helpful on SOLARIS)
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 return compiler_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1022 void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 EXCEPTION_MARK;
14124
7ad529321294 make: remove GRAALVM and introduce COMPILERGRAAL. fix client hosted-mode
Bernhard Urban <bernhard.urban@jku.at>
parents: 14107
diff changeset
1024 #if !defined(ZERO) && !defined(SHARK) && !defined(COMPILERGRAAL)
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1025 assert(c2_compiler_count > 0 || c1_compiler_count > 0, "No compilers?");
14124
7ad529321294 make: remove GRAALVM and introduce COMPILERGRAAL. fix client hosted-mode
Bernhard Urban <bernhard.urban@jku.at>
parents: 14107
diff changeset
1026 #endif // !ZERO && !SHARK && !COMPILERGRAAL
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1027 // Initialize the compilation queue
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1028 if (c2_compiler_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1029 _c2_method_queue = new CompileQueue("C2MethodQueue", MethodCompileQueue_lock);
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1030 _compilers[1]->set_num_compiler_threads(c2_compiler_count);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1031 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1032 if (c1_compiler_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1033 _c1_method_queue = new CompileQueue("C1MethodQueue", MethodCompileQueue_lock);
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1034 _compilers[0]->set_num_compiler_threads(c1_compiler_count);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1035 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1037 int compiler_count = c1_compiler_count + c2_compiler_count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1038
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1039 _compiler_threads =
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4944
diff changeset
1040 new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<CompilerThread*>(compiler_count, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 char name_buffer[256];
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1043 for (int i = 0; i < c2_compiler_count; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // Create a name for our thread.
16102
64d8c6c8a00c derive native compiler thread name from Compiler::name
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16006
diff changeset
1045 sprintf(name_buffer, "%s CompilerThread%d", _compilers[1]->name(), i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1047 // Shark and C2
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1048 CompilerThread* new_thread = make_compiler_thread(name_buffer, _c2_method_queue, counters, _compilers[1], CHECK);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1049 _compiler_threads->append(new_thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1051
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1052 for (int i = c2_compiler_count; i < compiler_count; i++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1053 // Create a name for our thread.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1054 sprintf(name_buffer, "C1 CompilerThread%d", i);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1055 CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1056 // C1
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1057 CompilerThread* new_thread = make_compiler_thread(name_buffer, _c1_method_queue, counters, _compilers[0], CHECK);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1058 _compiler_threads->append(new_thread);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1059 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1060
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 if (UsePerfData) {
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1062 PerfDataManager::create_constant(SUN_CI, "threads", PerfData::U_Bytes, compiler_count, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1066
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1067 // Set the methods on the stack as on_stack so that redefine classes doesn't
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1068 // reclaim them
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1069 void CompileBroker::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1070 if (_c2_method_queue != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1071 _c2_method_queue->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1072 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1073 if (_c1_method_queue != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1074 _c1_method_queue->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1075 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1076 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1077
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // CompileBroker::compile_method
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // Request compilation of a method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 void CompileBroker::compile_method_base(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 const char* comment,
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1088 Thread* thread) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // do nothing if compiler thread(s) is not available
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if (!_initialized ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 guarantee(!method->is_abstract(), "cannot compile abstract methods");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1095 assert(method->method_holder()->oop_is_instance(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 "sanity check");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6843
diff changeset
1097 assert(!method->method_holder()->is_not_initialized(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 "method holder must be initialized");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
1099 assert(!method->is_method_handle_intrinsic(), "do not enqueue these guys");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 if (CIPrintRequests) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 tty->print("request: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 if (osr_bci != InvocationEntryBci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 tty->print(" osr_bci: %d", osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
14107
800057208a2c enable C1 + Graal tiered
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13969
diff changeset
1107 tty->print(" level: %d comment: %s count: %d", comp_level, comment, hot_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 if (!hot_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 tty->print(" hot: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 if (hot_method() != method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 hot_method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 tty->print("yes");
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // A request has been made for compilation. Before we do any
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // real work, check to see if the method has been compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // in the meantime with a definitive result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 if (compilation_is_complete(method, osr_bci, comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125
2403
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1126 #ifndef PRODUCT
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1127 if (osr_bci != -1 && !FLAG_IS_DEFAULT(OSROnlyBCI)) {
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1128 if ((OSROnlyBCI > 0) ? (OSROnlyBCI != osr_bci) : (-OSROnlyBCI == osr_bci)) {
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1129 // Positive OSROnlyBCI means only compile that bci. Negative means don't compile that BCI.
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1130 return;
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1131 }
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1132 }
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1133 #endif
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1134
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // If this method is already in the compile queue, then
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // we do not block the current thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 if (compilation_is_in_queue(method, osr_bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // We may want to decay our counter a bit here to prevent
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // multiple denied requests for compilation. This is an
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // open compilation policy issue. Note: The other possibility,
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 // in the case that this is a blocking compile request, is to have
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // all subsequent blocking requesters wait for completion of
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // ongoing compiles. Note that in this case we'll need a protocol
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // for freeing the associated compile tasks. [Or we could have
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 // a single static monitor on which all these waiters sleep.]
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
3294
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1149 // If the requesting thread is holding the pending list lock
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1150 // then we just return. We can't risk blocking while holding
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1151 // the pending list lock or a 3-way deadlock may occur
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1152 // between the reference handler thread, a GC (instigated
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1153 // by a compiler thread), and compiled method registration.
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6725
diff changeset
1154 if (InstanceRefKlass::owns_pending_list_lock(JavaThread::current())) {
3294
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1155 return;
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1156 }
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1157
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // Outputs from the following MutexLocker block:
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 CompileTask* task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 bool blocking = false;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1161 CompileQueue* queue = compile_queue(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // Acquire our lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 {
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1165 MutexLocker locker(queue->lock(), thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // Make sure the method has not slipped into the queues since
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 // last we checked; note that those checks were "fast bail-outs".
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // Here we need to be more careful, see 14012000 below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 if (compilation_is_in_queue(method, osr_bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // We need to check again to see if the compilation has
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // completed. A previous compilation may have registered
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // some result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 if (compilation_is_complete(method, osr_bci, comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1180
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // We now know that this compilation is not pending, complete,
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // or prohibited. Assign a compile_id to this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // and check to see if it is in our [Start..Stop) range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 uint compile_id = assign_compile_id(method, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 if (compile_id == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // The compilation falls outside the allowed range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // Should this thread wait for completion of the compile?
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 blocking = is_compile_blocking(method, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
16185
518a221dbbde don't allow blocking compile requests from the compiler thread
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16180
diff changeset
1193 #ifdef COMPILERGRAAL
16447
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1194 if (blocking) {
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1195 // Don't allow blocking compiles for requests triggered by Graal.
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1196 if (thread->is_Compiler_thread()) {
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1197 blocking = false;
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1198 }
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1199
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1200 // Don't allow blocking compiles if inside a class initializer
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1201 vframeStream vfst((JavaThread*) thread);
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1202 for (; !vfst.at_end(); vfst.next()) {
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1203 if (vfst.method()->is_static_initializer()) {
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1204 blocking = false;
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1205 break;
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1206 }
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1207 }
16625
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1208
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1209 // Don't allow blocking compilation requests to Graal
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1210 // if Graal itself is not yet initialized
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1211 if (!GraalRuntime::is_HotSpotGraalRuntime_initialized() && compiler(comp_level)->is_graal()) {
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1212 blocking = false;
d2aa48d54db5 don't allow blocking compilation requests to Graal if Graal itself is not yet initialized
Doug Simon <doug.simon@oracle.com>
parents: 16447
diff changeset
1213 }
16185
518a221dbbde don't allow blocking compile requests from the compiler thread
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16180
diff changeset
1214 }
16447
ce6696559683 better fix for deadlock in GraalVM under -Xcomp (JBS:GRAAL-48)
Doug Simon <doug.simon@oracle.com>
parents: 16399
diff changeset
1215 // Don't allow blocking compiles
16185
518a221dbbde don't allow blocking compile requests from the compiler thread
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16180
diff changeset
1216 #endif
518a221dbbde don't allow blocking compile requests from the compiler thread
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16180
diff changeset
1217
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // We will enter the compilation in the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // 14012000: Note that this sets the queued_for_compile bits in
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // the target method. We can now reason that a method cannot be
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // queued for compilation more than once, as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 // Before a thread queues a task for compilation, it first acquires
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // the compile queue lock, then checks if the method's queued bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // are set or it has already been compiled. Thus there can not be two
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // instances of a compilation task for the same method on the
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // compilation queue. Consider now the case where the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // thread has already removed a task for that method from the queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // and is in the midst of compiling it. In this case, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // queued_for_compile bits must be set in the method (and these
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // will be visible to the current thread, since the bits were set
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // under protection of the compile queue lock, which we hold now.
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // When the compilation completes, the compiler thread first sets
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // the compilation result and then clears the queued_for_compile
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // bits. Neither of these actions are protected by a barrier (or done
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // under the protection of a lock), so the only guarantee we have
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // (on machines with TSO (Total Store Order)) is that these values
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // will update in that order. As a result, the only combinations of
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // these bits that the current thread will see are, in temporal order:
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // <RESULT, QUEUE> :
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // <0, 1> : in compile queue, but not yet compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // <1, 1> : compiled but queue bit not cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 // <1, 0> : compiled and queue bit cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // Because we first check the queue bits then check the result bits,
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // we are assured that we cannot introduce a duplicate task.
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // Note that if we did the tests in the reverse order (i.e. check
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // result then check queued bit), we could get the result bit before
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // the compilation completed, and the queue bit after the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // completed, and end up introducing a "duplicate" (redundant) task.
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // In that case, the compiler thread should first check if a method
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // has already been compiled before trying to compile it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // NOTE: in the event that there are multiple compiler threads and
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // there is de-optimization/recompilation, things will get hairy,
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // and in that case it's best to protect both the testing (here) of
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 // these bits, and their updating (here and elsewhere) under a
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // common lock.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1256 task = create_compile_task(queue,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 compile_id, method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 osr_bci, comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 hot_method, hot_count, comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 blocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 if (blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 wait_for_completion(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 nmethod* CompileBroker::compile_method(methodHandle method, int osr_bci,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1270 int comp_level,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 methodHandle hot_method, int hot_count,
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1272 const char* comment, Thread* THREAD) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // make sure arguments make sense
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1274 assert(method->method_holder()->oop_is_instance(), "not an instance method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 assert(osr_bci == InvocationEntryBci || (0 <= osr_bci && osr_bci < method->code_size()), "bci out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 assert(!method->is_abstract() && (osr_bci == InvocationEntryBci || !method->is_native()), "cannot compile abstract/native methods");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6843
diff changeset
1277 assert(!method->method_holder()->is_not_initialized(), "method holder must be initialized");
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
1278 // allow any levels for WhiteBox
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
1279 assert(WhiteBoxAPI || TieredCompilation || comp_level == CompLevel_highest_tier, "only CompLevel_highest_tier must be used in non-tiered");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // return quickly if possible
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // lock, make sure that the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // isn't prohibited in a straightforward way.
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1284 AbstractCompiler *comp = CompileBroker::compiler(comp_level);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1285 if (comp == NULL || !comp->can_compile_method(method) ||
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1286 compilation_is_prohibited(method, osr_bci, comp_level)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1289
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 if (osr_bci == InvocationEntryBci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // standard compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 nmethod* method_code = method->code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1293 if (method_code != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1294 if (compilation_is_complete(method, osr_bci, comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1295 return method_code;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1296 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 }
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
1298 if (method->is_not_compilable(comp_level)) {
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
1299 return NULL;
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1300 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // osr compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 #ifndef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 // seems like an assert of dubious value
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1305 assert(comp_level == CompLevel_highest_tier,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 "all OSR compiles are assumed to be at a single compilation lavel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 #endif // TIERED
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1308 // We accept a higher level osr method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1309 nmethod* nm = method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (nm != NULL) return nm;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1311 if (method->is_not_osr_compilable(comp_level)) return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 assert(!HAS_PENDING_EXCEPTION, "No exception should be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 // some prerequisites that are compiler specific
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1316 if (comp->is_c2() || comp->is_shark()) {
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1317 method->constants()->resolve_string_constants(CHECK_AND_CLEAR_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 // Resolve all classes seen in the signature of the method
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // we are compiling.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1320 Method::load_signature_classes(method, CHECK_AND_CLEAR_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 // If the method is native, do the lookup in the thread requesting
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // the compilation. Native lookups can load code, which is not
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // permitted during compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // Note: A native method implies non-osr compilation which is
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // checked with an assertion at the entry of this method.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
1329 if (method->is_native() && !method->is_method_handle_intrinsic()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 bool in_base_library;
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 address adr = NativeLookup::lookup(method, in_base_library, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 // In case of an exception looking up the method, we just forget
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 // about it. The interpreter will kick-in and throw the exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 method->set_not_compilable(); // implies is_not_osr_compilable()
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 assert(method->has_native_function(), "must have native code by now");
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // RedefineClasses() has replaced this method; just return
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 if (method->is_old()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // JVMTI -- post_compile_event requires jmethod_id() that may require
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 // a lock the compiling thread can not acquire. Prefetch it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 if (JvmtiExport::should_post_compiled_method_load()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 method->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 // do the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 if (method->is_native()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
1355 if (!PreferInterpreterNativeStubs || method->is_method_handle_intrinsic()) {
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1356 // Acquire our lock.
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1357 int compile_id;
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1358 {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1359 MutexLocker locker(MethodCompileQueue_lock, THREAD);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1360 compile_id = assign_compile_id(method, standard_entry_bci);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1361 }
12965
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1362 // To properly handle the appendix argument for out-of-line calls we are using a small trampoline that
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1363 // pops off the appendix argument and jumps to the target (see gen_special_dispatch in SharedRuntime).
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1364 //
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1365 // Since normal compiled-to-compiled calls are not able to handle such a thing we MUST generate an adapter
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1366 // in this case. If we can't generate one and use it we can not execute the out-of-line method handle calls.
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1367 (void) AdapterHandlerLibrary::create_native_wrapper(method, compile_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 } else {
12965
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1372 // If the compiler is shut off due to code cache getting full
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1373 // fail out now so blocking compiles dont hang the java thread
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1374 if (!should_compile_new_jobs()) {
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1375 CompilationPolicy::policy()->delay_compilation(method());
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1376 return NULL;
8b4bbba322d3 8026407: VM crashes on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
anoll
parents: 12880
diff changeset
1377 }
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1378 compile_method_base(method, osr_bci, comp_level, hot_method, hot_count, comment, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 // return requested nmethod
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1382 // We accept a higher level osr method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1383 return osr_bci == InvocationEntryBci ? method->code() : method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // CompileBroker::compilation_is_complete
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 // See if compilation of this method is already complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 bool CompileBroker::compilation_is_complete(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 if (is_osr) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1396 if (method->is_not_osr_compilable(comp_level)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 } else {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1399 nmethod* result = method->lookup_osr_nmethod_for(osr_bci, comp_level, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 return (result != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 if (method->is_not_compilable(comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 nmethod* result = method->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 if (result == NULL) return false;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1408 return comp_level == result->comp_level();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1412
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // CompileBroker::compilation_is_in_queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // See if this compilation is already requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // Implementation note: there is only a single "is in queue" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // for each method. This means that the check below is overly
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 // conservative in the sense that an osr compilation in the queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // will block a normal compilation from entering the queue (and vice
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // versa). This can be remedied by a full queue search to disambiguate
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 // cases. If it is deemed profitible, this may be done.
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 bool CompileBroker::compilation_is_in_queue(methodHandle method,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1426 int osr_bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 return method->queued_for_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // CompileBroker::compilation_is_prohibited
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 // See if this compilation is not allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 bool CompileBroker::compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 bool is_native = method->is_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // Some compilers may not support the compilation of natives.
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1437 AbstractCompiler *comp = compiler(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 if (is_native &&
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1439 (!CICompileNatives || comp == NULL || !comp->supports_native())) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1440 method->set_not_compilable_quietly(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 // Some compilers may not support on stack replacement.
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 if (is_osr &&
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1447 (!CICompileOSR || comp == NULL || !comp->supports_osr())) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1448 method->set_not_osr_compilable(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1451
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 // The method may be explicitly excluded by the user.
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 bool quietly;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 if (CompilerOracle::should_exclude(method, quietly)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 if (!quietly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // This does not happen quietly...
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 tty->print("### Excluding %s:%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 method->is_native() ? "generation of native wrapper" : "compile",
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 (method->is_static() ? " static" : ""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 }
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7607
diff changeset
1464 method->set_not_compilable(CompLevel_all, !quietly, "excluded by CompilerOracle");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1466
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1469
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 // CompileBroker::assign_compile_id
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // Assign a serialized id number to this compilation request. If the
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 // number falls out of the allowed range, return a 0. OSR
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 // compilations may be numbered separately from regular compilations
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // if certain debugging flags are used.
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 uint CompileBroker::assign_compile_id(methodHandle method, int osr_bci) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1479 assert(MethodCompileQueue_lock->owner() == Thread::current(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 "must hold the compilation queue lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 uint id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 if (CICountOSR && is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 id = ++_osr_compilation_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 if ((uint)CIStartOSR <= id && id < (uint)CIStopOSR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 id = ++_compilation_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 if ((uint)CIStart <= id && id < (uint)CIStop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1494
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 // Method was not in the appropriate compilation range.
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
1496 method->set_not_compilable_quietly();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // ------------------------------------------------------------------
13969
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1502 // CompileBroker::assign_compile_id_unlocked
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1503 //
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1504 // Public wrapper for assign_compile_id that acquires the needed locks
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1505 uint CompileBroker::assign_compile_id_unlocked(Thread* thread, methodHandle method, int osr_bci) {
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1506 MutexLocker locker(MethodCompileQueue_lock, thread);
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1507 return assign_compile_id(method, osr_bci);
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1508 }
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1509
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1510
fe034af88233 Acquire proper locks before calling assign_compile_id
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13731
diff changeset
1511 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 // CompileBroker::is_compile_blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 // Should the current thread be blocked until this compilation request
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 // has been fulfilled?
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 bool CompileBroker::is_compile_blocking(methodHandle method, int osr_bci) {
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6725
diff changeset
1517 assert(!InstanceRefKlass::owns_pending_list_lock(JavaThread::current()), "possible deadlock");
3294
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1518 return !BackgroundCompilation;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1520
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 // CompileBroker::preload_classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 void CompileBroker::preload_classes(methodHandle method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // Move this code over from c1_Compiler.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1528
a61af66fc99e Initial load
duke
parents:
diff changeset
1529
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 // CompileBroker::create_compile_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // Create a CompileTask object representing the current request for
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 // compilation. Add this task to the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 CompileTask* CompileBroker::create_compile_task(CompileQueue* queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 const char* comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 bool blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 CompileTask* new_task = allocate_task();
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 new_task->initialize(compile_id, method, osr_bci, comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 hot_method, hot_count, comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 blocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 queue->add(new_task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 return new_task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 // CompileBroker::allocate_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 // Allocate a CompileTask, from the free list if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 CompileTask* CompileBroker::allocate_task() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 MutexLocker locker(CompileTaskAlloc_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 CompileTask* task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 if (_task_free_list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 task = _task_free_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 _task_free_list = task->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 task->set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 task = new CompileTask();
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 task->set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 return task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1570
a61af66fc99e Initial load
duke
parents:
diff changeset
1571
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 // CompileBroker::free_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 // Add a task to the free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 void CompileBroker::free_task(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 MutexLocker locker(CompileTaskAlloc_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 task->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 task->set_next(_task_free_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 _task_free_list = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 // CompileBroker::wait_for_completion
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 // Wait for the given method CompileTask to complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 void CompileBroker::wait_for_completion(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 if (CIPrintCompileQueue) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 tty->print_cr("BLOCKING FOR COMPILE");
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1592
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 assert(task->is_blocking(), "can only wait on blocking task");
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 thread->set_blocked_on_compilation(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1598 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 MutexLocker waiter(task->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 while (!task->is_complete())
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 task->lock()->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 // It is harmless to check this status without the lock, because
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 // completion is a stable property (until the task object is recycled).
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 assert(task->is_complete(), "Compilation should have completed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 assert(task->code_handle() == NULL, "must be reset");
a61af66fc99e Initial load
duke
parents:
diff changeset
1609
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 thread->set_blocked_on_compilation(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1611
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 // By convention, the waiter is responsible for recycling a
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 // blocking CompileTask. Since there is only one waiter ever
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 // waiting on a CompileTask, we know that no one else will
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 // be using this CompileTask; we can free it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 free_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1619 // Initialize compiler thread(s) + compiler object(s). The postcondition
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1620 // of this function is that the compiler runtimes are initialized and that
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1621 //compiler threads can start compiling.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1622 bool CompileBroker::init_compiler_runtime() {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1623 CompilerThread* thread = CompilerThread::current();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1624 AbstractCompiler* comp = thread->compiler();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1625 // Final sanity check - the compiler object must exist
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1626 guarantee(comp != NULL, "Compiler object must exist");
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1627
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1628 int system_dictionary_modification_counter;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1629 {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1630 MutexLocker locker(Compile_lock, thread);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1631 system_dictionary_modification_counter = SystemDictionary::number_of_modifications();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1632 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1633
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1634 {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1635 // Must switch to native to allocate ci_env
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1636 ThreadToNativeFromVM ttn(thread);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1637 ciEnv ci_env(NULL, system_dictionary_modification_counter);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1638 // Cache Jvmti state
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1639 ci_env.cache_jvmti_state();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1640 // Cache DTrace flags
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1641 ci_env.cache_dtrace_flags();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1642
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1643 // Switch back to VM state to do compiler initialization
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1644 ThreadInVMfromNative tv(thread);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1645 ResetNoHandleMark rnhm;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1646
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1647
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1648 if (!comp->is_shark()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1649 // Perform per-thread and global initializations
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1650 comp->initialize();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1651 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1652 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1653
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1654 if (comp->is_failed()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1655 disable_compilation_forever();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1656 // If compiler initialization failed, no compiler thread that is specific to a
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1657 // particular compiler runtime will ever start to compile methods.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1658
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1659 shutdown_compiler_runtime(comp, thread);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1660 return false;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1661 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1662
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1663 // C1 specific check
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1664 if (comp->is_c1() && (thread->get_buffer_blob() == NULL)) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1665 warning("Initialization of %s thread failed (no space to run compilers)", thread->name());
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1666 return false;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1667 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1668
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1669 return true;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1670 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1671
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1672 // If C1 and/or C2 initialization failed, we shut down all compilation.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1673 // We do this to keep things simple. This can be changed if it ever turns out to be
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1674 // a problem.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1675 void CompileBroker::shutdown_compiler_runtime(AbstractCompiler* comp, CompilerThread* thread) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1676 // Free buffer blob, if allocated
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1677 if (thread->get_buffer_blob() != NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1678 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1679 CodeCache::free(thread->get_buffer_blob());
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1680 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1681
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1682 if (comp->should_perform_shutdown()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1683 // There are two reasons for shutting down the compiler
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1684 // 1) compiler runtime initialization failed
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1685 // 2) The code cache is full and the following flag is set: -XX:-UseCodeCacheFlushing
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1686 warning("Shutting down compiler %s (no space to run compilers)", comp->name());
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1687
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1688 // Only one thread per compiler runtime object enters here
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1689 // Set state to shut down
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1690 comp->set_shut_down();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1691
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1692 MutexLocker mu(MethodCompileQueue_lock, thread);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1693 CompileQueue* queue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1694 if (_c1_method_queue != NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1695 _c1_method_queue->delete_all();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1696 queue = _c1_method_queue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1697 _c1_method_queue = NULL;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1698 delete _c1_method_queue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1699 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1700
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1701 if (_c2_method_queue != NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1702 _c2_method_queue->delete_all();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1703 queue = _c2_method_queue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1704 _c2_method_queue = NULL;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1705 delete _c2_method_queue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1706 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1707
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1708 // We could delete compiler runtimes also. However, there are references to
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1709 // the compiler runtime(s) (e.g., nmethod::is_compiled_by_c1()) which then
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1710 // fail. This can be done later if necessary.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1711 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1712 }
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1713
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // CompileBroker::compiler_thread_loop
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 // The main loop run by a CompilerThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 void CompileBroker::compiler_thread_loop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 CompileQueue* queue = thread->queue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 // For the thread that initializes the ciObjectFactory
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 // this resource mark holds all the shared objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1724
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // First thread to get here will initialize the compiler interface
a61af66fc99e Initial load
duke
parents:
diff changeset
1726
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 if (!ciObjectFactory::is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 ASSERT_IN_VM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 MutexLocker only_one (CompileThread_lock, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 if (!ciObjectFactory::is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 ciObjectFactory::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 // Open a log.
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 if (LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 init_compiler_thread_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 CompileLog* log = thread->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 if (log != NULL) {
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6800
diff changeset
1741 log->begin_elem("start_compile_thread name='%s' thread='" UINTX_FORMAT "' process='%d'",
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6800
diff changeset
1742 thread->name(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 os::current_thread_id(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 os::current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 log->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1748
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1749 // If compiler thread/runtime initialization fails, exit the compiler thread
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1750 if (!init_compiler_runtime()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1751 return;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1752 }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1753
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1754 // Poll for new compilation tasks as long as the JVM runs. Compilation
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1755 // should only be disabled if something went wrong while initializing the
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1756 // compiler runtimes. This, in turn, should not happen. The only known case
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1757 // when compiler runtime initialization fails is if there is not enough free
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1758 // space in the code cache to generate the necessary stubs, etc.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1759 while (!is_compilation_disabled_forever()) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1760 // We need this HandleMark to avoid leaking VM handles.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1761 HandleMark hm(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1763 if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1764 // the code cache is really full
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1765 handle_full_code_cache();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1766 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1767
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1768 CompileTask* task = queue->get();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1769 if (task == NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1770 continue;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1771 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1772
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1773 // Give compiler threads an extra quanta. They tend to be bursty and
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1774 // this helps the compiler to finish up the job.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1775 if( CompilerThreadHintNoPreempt )
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1776 os::hint_no_preempt();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1777
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1778 // trace per thread time and compile statistics
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1779 CompilerCounters* counters = ((CompilerThread*)thread)->counters();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1780 PerfTraceTimedEvent(counters->time_counter(), counters->compile_counter());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1781
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1782 // Assign the task to the current thread. Mark this compilation
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1783 // thread as active for the profiler.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1784 CompileTaskWrapper ctw(task);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1785 nmethodLocker result_handle; // (handle for the nmethod produced by this task)
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1786 task->set_code_handle(&result_handle);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1787 methodHandle method(thread, task->method());
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1788
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1789 // Never compile a method if breakpoints are present in it
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1790 if (method()->number_of_breakpoints() == 0) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1791 // Compile the method.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1792 if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 #ifdef COMPILER1
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1794 // Allow repeating compilations for the purpose of benchmarking
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1795 // compile speed. This is not useful for customers.
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1796 if (CompilationRepeat != 0) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1797 int compile_count = CompilationRepeat;
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1798 while (compile_count > 0) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1799 invoke_compiler_on_method(task);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1800 nmethod* nm = method->code();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1801 if (nm != NULL) {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1802 nm->make_zombie();
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1803 method->clear_code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 }
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1805 compile_count--;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 }
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1807 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 #endif /* COMPILER1 */
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1809 invoke_compiler_on_method(task);
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1810 } else {
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1811 // After compilation is disabled, remove remaining methods from queue
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1812 method->clear_queued_for_compilation();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 }
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1816
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1817 // Shut down compiler runtime
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
1818 shutdown_compiler_runtime(thread->compiler(), thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1820
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 // CompileBroker::init_compiler_thread_log
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 // Set up state required by +LogCompilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 void CompileBroker::init_compiler_thread_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 CompilerThread* thread = CompilerThread::current();
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1827 char file_name[4*K];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 FILE* fp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 const char* dir = (try_temp_dir ? os::get_temp_directory() : NULL);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1832 if (dir == NULL) {
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1833 jio_snprintf(file_name, sizeof(file_name), "hs_c" UINTX_FORMAT "_pid%u.log",
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1834 thread_id, os::current_process_id());
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1835 } else {
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1836 jio_snprintf(file_name, sizeof(file_name),
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1837 "%s%shs_c" UINTX_FORMAT "_pid%u.log", dir,
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1838 os::file_separator(), thread_id, os::current_process_id());
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1839 }
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1840
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1841 fp = fopen(file_name, "at");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 if (fp != NULL) {
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1843 if (LogCompilation && Verbose) {
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1844 tty->print_cr("Opening compilation log %s", file_name);
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1845 }
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1846 CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file_name, fp, thread_id);
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1847 thread->init_log(log);
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1848
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1849 if (xtty != NULL) {
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1850 ttyLocker ttyl;
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1851 // Record any per thread log files
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1852 xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file_name);
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1853 }
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1854 return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 }
10394
813f26e34135 8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp
anoll
parents: 10278
diff changeset
1857 warning("Cannot open log file: %s", file_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1859
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 // CompileBroker::set_should_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 // Set _should_block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 // Call this from the VM, with Threads_lock held and a safepoint requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 void CompileBroker::set_should_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint already");
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 if (PrintCompilation && (Verbose || WizardMode))
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 tty->print_cr("notifying compiler thread pool to block");
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 _should_block = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1874
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 // CompileBroker::maybe_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 // Call this from the compiler at convenient points, to poll for _should_block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 void CompileBroker::maybe_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 if (_should_block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 if (PrintCompilation && (Verbose || WizardMode))
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 tty->print_cr("compiler thread " INTPTR_FORMAT " poll detects block request", Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 ThreadInVMfromNative tivfn(JavaThread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1888
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1889 // wrapper for CodeCache::print_summary()
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1890 static void codecache_print(bool detailed)
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1891 {
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1892 ResourceMark rm;
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1893 stringStream s;
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1894 // Dump code cache into a buffer before locking the tty,
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1895 {
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1896 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1897 CodeCache::print_summary(&s, detailed);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1898 }
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1899 ttyLocker ttyl;
12158
766fac3395d6 8012972: Incremental Inlining should support scalar replaced object in debug info
kvn
parents: 10405
diff changeset
1900 tty->print(s.as_string());
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1901 }
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1902
15463
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1903 void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, EventCompilation& event, bool success, ciEnv* ci_env) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1904
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1905 if (success) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1906 task->mark_success();
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1907 if (ci_env != NULL) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1908 task->set_num_inlined_bytecodes(ci_env->num_inlined_bytecodes());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1909 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1910 if (_compilation_log != NULL) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1911 nmethod* code = task->code();
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1912 if (code != NULL) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1913 _compilation_log->log_nmethod(thread, code);
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1914 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1915 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1916 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1917
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1918 // simulate crash during compilation
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1919 assert(task->compile_id() != CICrashAt, "just as planned");
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1920 if (event.should_commit()) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1921 event.set_method(task->method());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1922 event.set_compileID(task->compile_id());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1923 event.set_compileLevel(task->comp_level());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1924 event.set_succeded(task->is_success());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1925 event.set_isOsr(task->osr_bci() != CompileBroker::standard_entry_bci);
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1926 event.set_codeSize((task->code() == NULL) ? 0 : task->code()->total_size());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1927 event.set_inlinedBytes(task->num_inlined_bytecodes());
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1928 event.commit();
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1929 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1930 }
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1931
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // CompileBroker::invoke_compiler_on_method
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 // Compile a method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 if (PrintCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 task->print_line();
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 elapsedTimer time;
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1946
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1947 if (LogEvents) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1948 _compilation_log->log_compile(thread, task);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1949 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1950
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // Common flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 uint compile_id = task->compile_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 int osr_bci = task->osr_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 bool should_log = (thread->log() != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 bool should_break = false;
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1957 int task_level = task->comp_level();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 // create the handle inside it's own block so it can't
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 // accidentally be referenced once the thread transitions to
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 // native. The NoHandleMark before the transition should catch
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 // any cases where this occurs in the future.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1963 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 should_break = check_break_at(method, compile_id, is_osr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 if (should_log && !CompilerOracle::should_log(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 should_log = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 assert(!method->is_native(), "no longer compile natives");
a61af66fc99e Initial load
duke
parents:
diff changeset
1969
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 // Save information about this method in case of failure.
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
1971 set_last_compile(thread, method, is_osr, task_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1972
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
1973 DTRACE_METHOD_COMPILE_BEGIN_PROBE(method, compiler_name(task_level));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1975
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 // Allocate a new set of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 push_jni_handle_block();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1978 Method* target_handle = task->method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 int compilable = ciEnv::MethodCompilable;
15463
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1980 AbstractCompiler *comp = compiler(task_level);
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1981
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1982 #ifdef COMPILERGRAAL
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1983 if (comp != NULL && comp->is_graal()) {
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1984 GraalCompiler* graal = (GraalCompiler*) comp;
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1985
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1986 TraceTime t1("compilation", &time);
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1987 EventCompilation event;
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1988
16399
4481cf549cfc removed (Java based) CompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 16185
diff changeset
1989 graal->compile_method(target_handle, osr_bci, task);
15463
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1990
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1991 post_compile(thread, task, event, task->code() != NULL, NULL);
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1992 } else
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
1993 #endif // COMPILERGRAAL
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 int system_dictionary_modification_counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 MutexLocker locker(Compile_lock, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 system_dictionary_modification_counter = SystemDictionary::number_of_modifications();
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2000
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 NoHandleMark nhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2003
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 ciEnv ci_env(task, system_dictionary_modification_counter);
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 if (should_break) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 ci_env.set_break_at_compile(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 if (should_log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 ci_env.set_log(thread->log());
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 assert(thread->env() == &ci_env, "set by ci_env");
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 // The thread-env() field is cleared in ~CompileTaskWrapper.
a61af66fc99e Initial load
duke
parents:
diff changeset
2013
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2014 // Cache Jvmti state
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2015 ci_env.cache_jvmti_state();
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2016
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2017 // Cache DTrace flags
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2018 ci_env.cache_dtrace_flags();
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
2019
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 ciMethod* target = ci_env.get_method_from_handle(target_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 TraceTime t1("compilation", &time);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2023 EventCompilation event;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2024
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2025 if (comp == NULL) {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2026 ci_env.record_method_not_compilable("no compiler", !TieredCompilation);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2027 } else {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2028 comp->compile_method(&ci_env, target, osr_bci);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2029 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2030
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 if (!ci_env.failing() && task->code() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 //assert(false, "compiler should always document failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 // The compiler elected, without comment, not to register a result.
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 // Do not attempt further compilations of this method.
1964
22ef3370343b 7000349: Tiered reacts incorrectly to C1 compilation failures
iveresov
parents: 1783
diff changeset
2035 ci_env.record_method_not_compilable("compile failed", !TieredCompilation);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2037
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2038 // Copy this bit to the enclosing block:
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2039 compilable = ci_env.compilable();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2040
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 if (ci_env.failing()) {
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2042 const char* retry_message = ci_env.retry_message();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2043 if (_compilation_log != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2044 _compilation_log->log_failure(thread, task, ci_env.failure_reason(), retry_message);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2045 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 if (PrintCompilation) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2047 FormatBufferResource msg = retry_message != NULL ?
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2048 err_msg_res("COMPILE SKIPPED: %s (%s)", ci_env.failure_reason(), retry_message) :
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2049 err_msg_res("COMPILE SKIPPED: %s", ci_env.failure_reason());
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2050 task->print_compilation(tty, msg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 }
15463
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
2053
a20be10ad437 made Graal work with the HotSpot compiler queue and compiler threads, enabled by -XX:-UseGraalCompilationQueue
Doug Simon <doug.simon@oracle.com>
parents: 14957
diff changeset
2054 post_compile(thread, task, event, !ci_env.failing(), &ci_env);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 pop_jni_handle_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
2057
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2058 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2059
10207
e4e131b15d5c 8013532: Remove unused parameter "compiler" from DTRACE_METHOD_COMPILE* macros
roland
parents: 10206
diff changeset
2060 DTRACE_METHOD_COMPILE_END_PROBE(method, compiler_name(task_level), task->is_success());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2061
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 collect_statistics(thread, time, task);
a61af66fc99e Initial load
duke
parents:
diff changeset
2063
4064
670a74b863fc 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 4047
diff changeset
2064 if (PrintCompilation && PrintCompilation2) {
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
2065 tty->print("%7d ", (int) tty->time_stamp().milliseconds()); // print timestamp
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
2066 tty->print("%4d ", compile_id); // print compilation number
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
2067 tty->print("%s ", (is_osr ? "%" : " "));
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10207
diff changeset
2068 if (task->code() != NULL) {
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10207
diff changeset
2069 tty->print("size: %d(%d) ", task->code()->total_size(), task->code()->insts_size());
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10207
diff changeset
2070 }
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10207
diff changeset
2071 tty->print_cr("time: %d inlined: %d bytes", (int)time.milliseconds(), task->num_inlined_bytecodes());
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
2072 }
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
2073
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
2074 if (PrintCodeCacheOnCompilation)
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
2075 codecache_print(/* detailed= */ false);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
2076
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2077 // Disable compilation, if required.
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2078 switch (compilable) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2079 case ciEnv::MethodCompilable_never:
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2080 if (is_osr)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2081 method->set_not_osr_compilable_quietly();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2082 else
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
2083 method->set_not_compilable_quietly();
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2084 break;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2085 case ciEnv::MethodCompilable_not_at_tier:
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2086 if (is_osr)
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2087 method->set_not_osr_compilable_quietly(task_level);
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2088 else
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2089 method->set_not_compilable_quietly(task_level);
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
2090 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2092
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // Note that the queued_for_compilation bits are cleared without
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 // protection of a mutex. [They were set by the requester thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 // when adding the task to the complie queue -- at which time the
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 // compile queue lock was held. Subsequently, we acquired the compile
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // queue lock to get this task off the compile queue; thus (to belabour
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // the point somewhat) our clearing of the bits must be occurring
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // only after the setting of the bits. See also 14012000 above.
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 method->clear_queued_for_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
2101
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 if (CollectedHeap::fired_fake_oom()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 // The current compile received a fake OOM during compilation so
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 // go ahead and exit the VM since the test apparently succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 tty->print_cr("*** Shutting down VM after successful fake OOM");
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 vm_exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2111
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2112 /**
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2113 * The CodeCache is full. Print out warning and disable compilation
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2114 * or try code cache cleaning so compilation can continue later.
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2115 */
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2116 void CompileBroker::handle_full_code_cache() {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2117 UseInterpreter = true;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2118 if (UseCompiler || AlwaysCompileLoopMethods ) {
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
2119 if (xtty != NULL) {
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
2120 ResourceMark rm;
2482
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2121 stringStream s;
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2122 // Dump code cache state into a buffer before locking the tty,
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2123 // because log_state() will use locks causing lock conflicts.
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2124 CodeCache::log_state(&s);
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2125 // Lock to prevent tearing
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2126 ttyLocker ttyl;
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
2127 xtty->begin_elem("code_cache_full");
2482
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
2128 xtty->print(s.as_string());
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
2129 xtty->stamp();
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
2130 xtty->end_elem();
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2131 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2132
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2133 CodeCache::report_codemem_full();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2134
1578
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
2135 #ifndef PRODUCT
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2136 if (CompileTheWorld || ExitOnFullCodeCache) {
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
2137 codecache_print(/* detailed= */ true);
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2138 before_exit(JavaThread::current());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2139 exit_globals(); // will delete tty
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2140 vm_direct_exit(CompileTheWorld ? 0 : 1);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2141 }
1578
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
2142 #endif
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2143 if (UseCodeCacheFlushing) {
12324
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
2144 // Since code cache is full, immediately stop new compiles
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
2145 if (CompileBroker::set_should_compile_new_jobs(CompileBroker::stop_compilation)) {
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
2146 NMethodSweeper::log_sweep("disable_compiler");
510fbd28919c 8020151: PSR:PERF Large performance regressions when code cache is filled
anoll
parents: 12158
diff changeset
2147 }
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2148 // Switch to 'vm_state'. This ensures that possibly_sweep() can be called
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2149 // without having to consider the state in which the current thread is.
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2150 ThreadInVMfromUnknown in_vm;
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2151 NMethodSweeper::possibly_sweep();
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2152 } else {
12880
469216acdb28 8023014: CodeSweeperSweepNoFlushTest.java fails with HS crash
anoll
parents: 12861
diff changeset
2153 disable_compilation_forever();
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2154 }
13074
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2155
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2156 // Print warning only once
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2157 if (should_print_compiler_warning()) {
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2158 warning("CodeCache is full. Compiler has been disabled.");
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2159 warning("Try increasing the code cache size using -XX:ReservedCodeCacheSize=");
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2160 codecache_print(/* detailed= */ true);
78da3894b86f 8027593: performance drop with constrained codecache starting with hs25 b111
anoll
parents: 13016
diff changeset
2161 }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2162 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2163 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2164
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
2165 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 // CompileBroker::set_last_compile
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 // Record this compilation for debugging purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 char* method_name = method->name()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 strncpy(_last_method_compiled, method_name, CompileBroker::name_buffer_length);
17567
5656140324ed 8030763: Validate global memory allocation
hseigel
parents: 13074
diff changeset
2173 _last_method_compiled[CompileBroker::name_buffer_length - 1] = '\0'; // ensure null terminated
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 char current_method[CompilerCounters::cmname_buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 size_t maxLen = CompilerCounters::cmname_buffer_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
2176
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 if (UsePerfData) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2178 const char* class_name = method->method_holder()->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2179
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 size_t s1len = strlen(class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 size_t s2len = strlen(method_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2182
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 // check if we need to truncate the string
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 if (s1len + s2len + 2 > maxLen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2185
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 // the strategy is to lop off the leading characters of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 // class name and the trailing characters of the method name.
a61af66fc99e Initial load
duke
parents:
diff changeset
2188
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 if (s2len + 2 > maxLen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 // lop of the entire class name string, let snprintf handle
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 // truncation of the method name.
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 class_name += s1len; // null string
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 // lop off the extra characters from the front of the class name
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 class_name += ((s1len + s2len + 2) - maxLen);
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2199
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 jio_snprintf(current_method, maxLen, "%s %s", class_name, method_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2202
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 if (CICountOSR && is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 _last_compile_type = osr_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 _last_compile_type = normal_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 _last_compile_level = comp_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
2209
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 CompilerCounters* counters = thread->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 counters->set_current_method(current_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 counters->set_compile_type((jlong)_last_compile_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2216
a61af66fc99e Initial load
duke
parents:
diff changeset
2217
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 // CompileBroker::push_jni_handle_block
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 // Push on a new block of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 void CompileBroker::push_jni_handle_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2224
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // Allocate a new block for JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 // Inlined code from jni_PushLocalFrame()
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 JNIHandleBlock* java_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 compile_handles->set_pop_frame_link(java_handles); // make sure java handles get gc'd.
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 thread->set_active_handles(compile_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2233
a61af66fc99e Initial load
duke
parents:
diff changeset
2234
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 // CompileBroker::pop_jni_handle_block
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 // Pop off the current block of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 void CompileBroker::pop_jni_handle_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2241
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 // Release our JNI handle block
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 JNIHandleBlock* compile_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 thread->set_active_handles(java_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 compile_handles->set_pop_frame_link(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 JNIHandleBlock::release_block(compile_handles, thread); // may block
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2249
a61af66fc99e Initial load
duke
parents:
diff changeset
2250
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 // CompileBroker::check_break_at
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // Should the compilation break at the current compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 bool CompileBroker::check_break_at(methodHandle method, int compile_id, bool is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 if (CICountOSR && is_osr && (compile_id == CIBreakAtOSR)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 } else if( CompilerOracle::should_break_at(method) ) { // break when compiling
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 return (compile_id == CIBreakAt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2264
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 // CompileBroker::collect_statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 // Collect statistics about the compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2269
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time, CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 bool success = task->is_success();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2272 methodHandle method (thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 uint compile_id = task->compile_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 bool is_osr = (task->osr_bci() != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 nmethod* code = task->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 CompilerCounters* counters = thread->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
2277
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 assert(code == NULL || code->is_locked_by_vm(), "will survive the MutexLocker");
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 MutexLocker locker(CompileStatistics_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2280
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 // _perf variables are production performance counters which are
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 // updated regardless of the setting of the CITime and CITimeEach flags
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 if (!success) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 _total_bailout_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 _perf_last_failed_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 _perf_last_failed_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 _perf_total_bailout_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 } else if (code == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 _perf_last_invalidated_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 _perf_last_invalidated_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 _perf_total_invalidated_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 _total_invalidated_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 // Compilation succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
2300
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 // update compilation ticks - used by the implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 // java.lang.management.CompilationMBean
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 _perf_total_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2304
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2305 _t_total_compilation.add(time);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2306 _peak_compilation_time = time.milliseconds() > _peak_compilation_time ? time.milliseconds() : _peak_compilation_time;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10394
diff changeset
2307
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 if (CITime) {
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2309 int bytes_compiled = method->code_size() + task->num_inlined_bytecodes();
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2310 GRAAL_ONLY(CompilerStatistics* stats = compiler(task->comp_level())->stats();)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 _t_osr_compilation.add(time);
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2313 _sum_osr_bytes_compiled += bytes_compiled;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2314 GRAAL_ONLY(stats->_osr.update(time, bytes_compiled);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 _t_standard_compilation.add(time);
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 _sum_standard_bytes_compiled += method->code_size() + task->num_inlined_bytecodes();
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2318 GRAAL_ONLY(stats->_standard.update(time, bytes_compiled);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 }
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2320 GRAAL_ONLY(stats->_nmethods_size += code->total_size();)
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2321 GRAAL_ONLY(stats->_nmethods_code_size += code->insts_size();)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2323
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 // save the name of the last method compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 _perf_last_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 _perf_last_compile_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 _perf_last_compile_size->set_value(method->code_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 _perf_osr_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 _perf_sum_osr_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 _perf_standard_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 _perf_sum_standard_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2338
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 if (CITimeEach) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 float bytes_per_sec = 1.0 * (method->code_size() + task->num_inlined_bytecodes()) / time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 tty->print_cr("%3d seconds: %f bytes/sec : %f (bytes %d + %d inlined)",
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 compile_id, time.seconds(), bytes_per_sec, method->code_size(), task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2344
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 // Collect counts of successful compilations
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2346 _sum_nmethod_size += code->total_size();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2347 _sum_nmethod_code_size += code->insts_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 _total_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2349
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 if (UsePerfData) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2351 _perf_sum_nmethod_size->inc( code->total_size());
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2352 _perf_sum_nmethod_code_size->inc(code->insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 _perf_total_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2355
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 if (UsePerfData) _perf_total_osr_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 _total_osr_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 if (UsePerfData) _perf_total_standard_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 _total_standard_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 // set the current method for the thread to null
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 if (UsePerfData) counters->set_current_method("");
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2367
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2368 const char* CompileBroker::compiler_name(int comp_level) {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2369 AbstractCompiler *comp = CompileBroker::compiler(comp_level);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2370 if (comp == NULL) {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2371 return "no compiler";
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2372 } else {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2373 return (comp->name());
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2374 }
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2375 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2376
16006
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2377 #ifdef GRAAL
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2378 void CompileBroker::print_times(AbstractCompiler* comp) {
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2379 CompilerStatistics* stats = comp->stats();
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2380 tty->print_cr(" %s {speed: %d bytes/s; standard: %6.3f s, %d bytes, %d methods; osr: %6.3f s, %d bytes, %d methods; nmethods_size: %d bytes; nmethods_code_size: %d bytes}",
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2381 comp->name(), stats->bytes_per_second(),
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2382 stats->_standard._time.seconds(), stats->_standard._bytes, stats->_standard._count,
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2383 stats->_osr._time.seconds(), stats->_osr._bytes, stats->_osr._count,
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2384 stats->_nmethods_size, stats->_nmethods_code_size);
17372
4a6e24a8fc2c Track code installation time
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 17166
diff changeset
2385 comp->print_timers();
16006
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2386 }
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2387 #endif
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2388
13364
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2389 void CompileBroker::print_times(bool per_compiler, bool aggregate) {
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2390 #ifdef GRAAL
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2391 elapsedTimer standard_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2392 elapsedTimer total_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2393 elapsedTimer osr_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2394
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2395 int standard_bytes_compiled = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2396 int osr_bytes_compiled = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2397
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2398 int standard_compile_count = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2399 int osr_compile_count = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2400 int total_compile_count = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2401
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2402 int nmethods_size = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2403 int nmethods_code_size = 0;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2404 bool printedHeader = false;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2405
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2406 for (unsigned int i = 0; i < sizeof(_compilers) / sizeof(AbstractCompiler*); i++) {
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2407 AbstractCompiler* comp = _compilers[i];
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2408 if (comp != NULL) {
13364
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2409 if (per_compiler && aggregate && !printedHeader) {
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2410 printedHeader = true;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2411 tty->cr();
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2412 tty->print_cr("Individual compiler times (for compiled methods only)");
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2413 tty->print_cr("------------------------------------------------");
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2414 tty->cr();
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2415 }
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2416 CompilerStatistics* stats = comp->stats();
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2417
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2418 standard_compilation.add(stats->_standard._time);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2419 osr_compilation.add(stats->_osr._time);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2420
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2421 standard_bytes_compiled += stats->_standard._bytes;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2422 osr_bytes_compiled += stats->_osr._bytes;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2423
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2424 standard_compile_count += stats->_standard._count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2425 osr_compile_count += stats->_osr._count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2426
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2427 nmethods_size += stats->_nmethods_size;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2428 nmethods_code_size += stats->_nmethods_code_size;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2429
13364
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2430 if (per_compiler) {
16006
66a9286203a2 decoupled Graal runtime initialization and Graal compilation queue initialization
Doug Simon <doug.simon@oracle.com>
parents: 15494
diff changeset
2431 print_times(comp);
13364
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2432 }
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2433 }
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2434 }
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2435 total_compile_count = osr_compile_count + standard_compile_count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2436 total_compilation.add(osr_compilation);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2437 total_compilation.add(standard_compilation);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2438 #else
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2439 elapsedTimer standard_compilation = CompileBroker::_t_standard_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2440 elapsedTimer osr_compilation = CompileBroker::_t_osr_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2441 elapsedTimer total_compilation = CompileBroker::_t_total_compilation;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2442
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2443 int standard_bytes_compiled = CompileBroker::_sum_standard_bytes_compiled;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2444 int osr_bytes_compiled = CompileBroker::_sum_osr_bytes_compiled;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2445
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2446 int standard_compile_count = CompileBroker::_total_standard_compile_count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2447 int osr_compile_count = CompileBroker::_total_osr_compile_count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2448 int total_compile_count = CompileBroker::_total_compile_count;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2449
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2450 int nmethods_size = CompileBroker::_sum_nmethod_code_size;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2451 int nmethods_code_size = CompileBroker::_sum_nmethod_size;
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2452 #endif
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2453
13364
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2454 if (!aggregate) {
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2455 return;
5a4293f24642 added -G:PrintCompRate option for periodically printing out the current compilation rate
Doug Simon <doug.simon@oracle.com>
parents: 13107
diff changeset
2456 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 tty->print_cr("Accumulated compiler times (for compiled methods only)");
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 tty->print_cr("------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 //0000000000111111111122222222223333333333444444444455555555556666666666
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 //0123456789012345678901234567890123456789012345678901234567890123456789
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2462 tty->print_cr(" Total compilation time : %6.3f s", total_compilation.seconds());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 tty->print_cr(" Standard compilation : %6.3f s, Average : %2.3f",
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2464 standard_compilation.seconds(),
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2465 standard_compilation.seconds() / standard_compile_count);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2466 tty->print_cr(" On stack replacement : %6.3f s, Average : %2.3f", osr_compilation.seconds(), osr_compilation.seconds() / osr_compile_count);
1131
40e7c1d24e4a 6909153: Fix broken options on Zero
twisti
parents: 844
diff changeset
2467
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2468 AbstractCompiler *comp = compiler(CompLevel_simple);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2469 if (comp != NULL) {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2470 comp->print_timers();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 }
8771
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2472 comp = compiler(CompLevel_full_optimization);
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2473 if (comp != NULL) {
75a28f465a12 8008663: [parfait] Null pointer deference in hotspot/src/share/vm/compiler/compileBroker.cpp
morris
parents: 8730
diff changeset
2474 comp->print_timers();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2475 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 tty->cr();
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2477 tty->print_cr(" Total compiled methods : %6d methods", total_compile_count);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2478 tty->print_cr(" Standard compilation : %6d methods", standard_compile_count);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2479 tty->print_cr(" On stack replacement : %6d methods", osr_compile_count);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2480 int tcb = osr_bytes_compiled + standard_bytes_compiled;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 tty->print_cr(" Total compiled bytecodes : %6d bytes", tcb);
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2482 tty->print_cr(" Standard compilation : %6d bytes", standard_bytes_compiled);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2483 tty->print_cr(" On stack replacement : %6d bytes", osr_bytes_compiled);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2484 double tcs = total_compilation.seconds();
7568
140d4d4ab3b9 added per-compiler compilation speed statistics for C1 and C2 (included in output produced by -XX:+CITime)
Doug Simon <doug.simon@oracle.com>
parents: 7482
diff changeset
2485 int bps = tcs == 0.0 ? 0 : (int)(tcb / tcs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 tty->print_cr(" Average compilation speed: %6d bytes/s", bps);
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 tty->cr();
12779
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2488 tty->print_cr(" nmethod code size : %6d bytes", nmethods_code_size);
f6c511451e4a made Graal report its compilation info under -XX:+CITime in the same format as c1 and c2
Doug Simon <doug.simon@oracle.com>
parents: 12356
diff changeset
2489 tty->print_cr(" nmethod total size : %6d bytes", nmethods_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2491
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // Debugging output for failure
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 void CompileBroker::print_last_compile() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 if ( _last_compile_level != CompLevel_none &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 compiler(_last_compile_level) != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 _last_method_compiled != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 _last_compile_type != no_compile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 if (_last_compile_type == osr_compile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 tty->print_cr("Last parse: [osr]%d+++(%d) %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 _osr_compilation_id, _last_compile_level, _last_method_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 tty->print_cr("Last parse: %d+++(%d) %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 _compilation_id, _last_compile_level, _last_method_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2507
a61af66fc99e Initial load
duke
parents:
diff changeset
2508
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 void CompileBroker::print_compiler_threads_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 st->print_cr("Compiler thread printing unimplemented.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 }