annotate src/share/vm/compiler/compileBroker.cpp @ 8733:9def4075da6d

8008079: G1: Add nextObject routine to CMBitMapRO and replace nextWord Summary: Update the task local finger to the start of the next object when marking aborts, in order to avoid the redundant scanning of all 0's when the marking task restarts, if otherwise updating to the next word. In addition, reuse the routine nextObject() in routine iterate(). Reviewed-by: johnc, ysr Contributed-by: tamao <tao.mao@oracle.com>
author tamao
date Tue, 05 Mar 2013 15:36:56 -0800
parents 6a51fc70a15e
children 5fc51c1ecdeb b7c2c5b2572c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
2 * Copyright (c) 1999, 2012, 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"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
46 #include "utilities/dtrace.hpp"
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
47 #include "utilities/events.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
48 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
49 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
50 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
51 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
52 #include "opto/c2compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
53 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
54 #ifdef SHARK
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
55 #include "shark/sharkCompiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
56 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 #ifdef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Only bother with this argument setup if dtrace is available
a61af66fc99e Initial load
duke
parents:
diff changeset
61
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
62 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63 HS_DTRACE_PROBE_DECL8(hotspot, method__compile__begin,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 HS_DTRACE_PROBE_DECL9(hotspot, method__compile__end,
a61af66fc99e Initial load
duke
parents:
diff changeset
66 char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method) \
a61af66fc99e Initial load
duke
parents:
diff changeset
69 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
70 char* comp_name = (char*)(compiler)->name(); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
71 Symbol* klass_name = (method)->klass_name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
72 Symbol* name = (method)->name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
73 Symbol* signature = (method)->signature(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 HS_DTRACE_PROBE8(hotspot, method__compile__begin, \
a61af66fc99e Initial load
duke
parents:
diff changeset
75 comp_name, strlen(comp_name), \
a61af66fc99e Initial load
duke
parents:
diff changeset
76 klass_name->bytes(), klass_name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
77 name->bytes(), name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
78 signature->bytes(), signature->utf8_length()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success) \
a61af66fc99e Initial load
duke
parents:
diff changeset
82 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
83 char* comp_name = (char*)(compiler)->name(); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
84 Symbol* klass_name = (method)->klass_name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
85 Symbol* name = (method)->name(); \
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
86 Symbol* signature = (method)->signature(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 HS_DTRACE_PROBE9(hotspot, method__compile__end, \
a61af66fc99e Initial load
duke
parents:
diff changeset
88 comp_name, strlen(comp_name), \
a61af66fc99e Initial load
duke
parents:
diff changeset
89 klass_name->bytes(), klass_name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
90 name->bytes(), name->utf8_length(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
91 signature->bytes(), signature->utf8_length(), (success)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
94 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
95
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
96 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
97 { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
98 char* comp_name = (char*)(compiler)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
99 Symbol* klass_name = (method)->klass_name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
100 Symbol* name = (method)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
101 Symbol* signature = (method)->signature(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
102 HOTSPOT_METHOD_COMPILE_BEGIN( \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
103 comp_name, strlen(comp_name), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
104 (char *) klass_name->bytes(), klass_name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
105 (char *) name->bytes(), name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
106 (char *) signature->bytes(), signature->utf8_length()); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
107 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
108
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
109 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
110 { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
111 char* comp_name = (char*)(compiler)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
112 Symbol* klass_name = (method)->klass_name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
113 Symbol* name = (method)->name(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
114 Symbol* signature = (method)->signature(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
115 HOTSPOT_METHOD_COMPILE_END( \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
116 comp_name, strlen(comp_name), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
117 (char *) klass_name->bytes(), klass_name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
118 (char *) name->bytes(), name->utf8_length(), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
119 (char *) signature->bytes(), signature->utf8_length(), (success)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
120 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
121 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3752
diff changeset
122
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #else // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 #endif // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 bool CompileBroker::_initialized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 volatile bool CompileBroker::_should_block = false;
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
132 volatile jint CompileBroker::_should_compile_new_jobs = run_compilation;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // The installed compiler(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
135 AbstractCompiler* CompileBroker::_compilers[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // These counters are used for assigning id's to each compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
138 uint CompileBroker::_compilation_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 uint CompileBroker::_osr_compilation_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Debugging information
a61af66fc99e Initial load
duke
parents:
diff changeset
142 int CompileBroker::_last_compile_type = no_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int CompileBroker::_last_compile_level = CompLevel_none;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 char CompileBroker::_last_method_compiled[CompileBroker::name_buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
147 PerfCounter* CompileBroker::_perf_total_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 PerfCounter* CompileBroker::_perf_osr_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 PerfCounter* CompileBroker::_perf_standard_compilation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 PerfCounter* CompileBroker::_perf_total_bailout_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 PerfCounter* CompileBroker::_perf_total_invalidated_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 PerfCounter* CompileBroker::_perf_total_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 PerfCounter* CompileBroker::_perf_total_osr_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 PerfCounter* CompileBroker::_perf_total_standard_compile_count = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 PerfCounter* CompileBroker::_perf_sum_osr_bytes_compiled = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 PerfCounter* CompileBroker::_perf_sum_standard_bytes_compiled = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 PerfCounter* CompileBroker::_perf_sum_nmethod_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 PerfCounter* CompileBroker::_perf_sum_nmethod_code_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 PerfStringVariable* CompileBroker::_perf_last_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 PerfStringVariable* CompileBroker::_perf_last_failed_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 PerfStringVariable* CompileBroker::_perf_last_invalidated_method = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 PerfVariable* CompileBroker::_perf_last_compile_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 PerfVariable* CompileBroker::_perf_last_compile_size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 PerfVariable* CompileBroker::_perf_last_failed_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 PerfVariable* CompileBroker::_perf_last_invalidated_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Timers and counters for generating statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
171 elapsedTimer CompileBroker::_t_total_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 elapsedTimer CompileBroker::_t_osr_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 elapsedTimer CompileBroker::_t_standard_compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int CompileBroker::_total_bailout_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 int CompileBroker::_total_invalidated_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 int CompileBroker::_total_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 int CompileBroker::_total_osr_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int CompileBroker::_total_standard_compile_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 int CompileBroker::_sum_osr_bytes_compiled = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 int CompileBroker::_sum_standard_bytes_compiled = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 int CompileBroker::_sum_nmethod_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 int CompileBroker::_sum_nmethod_code_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
186 CompileQueue* CompileBroker::_c2_method_queue = NULL;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
187 CompileQueue* CompileBroker::_c1_method_queue = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 CompileTask* CompileBroker::_task_free_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 GrowableArray<CompilerThread*>* CompileBroker::_method_threads = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
193 class CompilationLog : public StringEventLog {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
194 public:
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
195 CompilationLog() : StringEventLog("Compilation events") {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
196 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
197
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
198 void log_compile(JavaThread* thread, CompileTask* task) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
199 StringLogMessage lm;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
200 stringStream sstr = lm.stream();
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
201 // 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
202 task->print_compilation(&sstr, NULL, true);
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
203 log(thread, "%s", (const char*)lm);
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
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
206 void log_nmethod(JavaThread* thread, nmethod* nm) {
4944
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4875
diff changeset
207 log(thread, "nmethod %d%s " INTPTR_FORMAT " code ["INTPTR_FORMAT ", " INTPTR_FORMAT "]",
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4875
diff changeset
208 nm->compile_id(), nm->is_osr_method() ? "%" : "",
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
209 nm, nm->code_begin(), nm->code_end());
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
210 }
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 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
213 StringLogMessage lm;
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
214 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
215 if (retry_message != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
216 lm.append(" (%s)", retry_message);
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 lm.print("\n");
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
219 log(thread, "%s", (const char*)lm);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
220 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
221 };
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
222
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
223 static CompilationLog* _compilation_log = NULL;
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 void compileBroker_init() {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
226 if (LogEvents) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
227 _compilation_log = new CompilationLog();
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
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 CompileTaskWrapper::CompileTaskWrapper(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
233 thread->set_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 CompileLog* log = thread->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (log != NULL) task->log_task_start(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 CompileTaskWrapper::~CompileTaskWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 CompileTask* task = thread->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_done(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 thread->set_task(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 task->set_code_handle(NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
245 thread->set_env(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (task->is_blocking()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 MutexLocker notifier(task->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 task->mark_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // Notify the waiting thread that the compilation has completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 task->lock()->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 task->mark_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // By convention, the compiling thread is responsible for
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // recycling a non-blocking CompileTask.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 CompileBroker::free_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // CompileTask::initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void CompileTask::initialize(int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
264 methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
265 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
267 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
268 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
269 const char* comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
270 bool is_blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 assert(!_lock->is_locked(), "bad locking");
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 _compile_id = compile_id;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
274 _method = method();
7409
30866cd626b0 8004883: NPG: clean up anonymous class fix
coleenp
parents: 7185
diff changeset
275 _method_holder = JNIHandles::make_global(method->method_holder()->klass_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
276 _osr_bci = osr_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 _is_blocking = is_blocking;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 _comp_level = comp_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 _num_inlined_bytecodes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 _is_complete = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 _is_success = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 _code_handle = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _hot_method = NULL;
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
286 _hot_method_holder = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 _hot_count = hot_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 _time_queued = 0; // tidy
a61af66fc99e Initial load
duke
parents:
diff changeset
289 _comment = comment;
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 _time_queued = os::elapsed_counter();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 if (hot_method.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (hot_method == method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 _hot_method = _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
297 _hot_method = hot_method();
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
298 // only add loader or mirror if different from _method_holder
7409
30866cd626b0 8004883: NPG: clean up anonymous class fix
coleenp
parents: 7185
diff changeset
299 _hot_method_holder = JNIHandles::make_global(hot_method->method_holder()->klass_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // CompileTask::code/set_code
a61af66fc99e Initial load
duke
parents:
diff changeset
309 nmethod* CompileTask::code() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (_code_handle == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return _code_handle->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void CompileTask::set_code(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (_code_handle == NULL && nm == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 guarantee(_code_handle != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 _code_handle->set_code(nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (nm == NULL) _code_handle = NULL; // drop the handle also
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // CompileTask::free
a61af66fc99e Initial load
duke
parents:
diff changeset
322 void CompileTask::free() {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 set_code(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 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
325 JNIHandles::destroy_global(_method_holder);
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6940
diff changeset
326 JNIHandles::destroy_global(_hot_method_holder);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
330 void CompileTask::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
331 // 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
332 _method->set_on_stack(true);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
333 if (_hot_method != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
334 _hot_method->set_on_stack(true);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
335 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
336 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
337
0
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // CompileTask::print
a61af66fc99e Initial load
duke
parents:
diff changeset
340 void CompileTask::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 tty->print("<CompileTask compile_id=%d ", _compile_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 tty->print("method=");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
343 _method->print_name(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 tty->print_cr(" osr_bci=%d is_blocking=%s is_complete=%s is_success=%s>",
a61af66fc99e Initial load
duke
parents:
diff changeset
345 _osr_bci, bool_to_str(_is_blocking),
a61af66fc99e Initial load
duke
parents:
diff changeset
346 bool_to_str(_is_complete), bool_to_str(_is_success));
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
349
0
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // CompileTask::print_line_on_error
a61af66fc99e Initial load
duke
parents:
diff changeset
352 //
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // This function is called by fatal error handler when the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // causing troubles is a compiler thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
355 //
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Do not grab any lock, do not allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
357 //
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // Otherwise it's the same as CompileTask::print_line()
a61af66fc99e Initial load
duke
parents:
diff changeset
359 //
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void CompileTask::print_line_on_error(outputStream* st, char* buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // print compiler name
a61af66fc99e Initial load
duke
parents:
diff changeset
362 st->print("%s:", CompileBroker::compiler(comp_level())->name());
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
363 print_compilation(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // CompileTask::print_line
a61af66fc99e Initial load
duke
parents:
diff changeset
368 void CompileTask::print_line() {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // print compiler name if requested
a61af66fc99e Initial load
duke
parents:
diff changeset
371 if (CIPrintCompilerName) tty->print("%s:", CompileBroker::compiler(comp_level())->name());
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
372 print_compilation();
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
373 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
374
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
375
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
376 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
377 // CompileTask::print_compilation_impl
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
378 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
379 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
380 const char* msg, bool short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
381 if (!short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
382 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
383 }
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
384 st->print("%4d ", compile_id); // print compilation number
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
385
3752
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
386 // For unloaded methods the transition to zombie occurs after the
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
387 // method is cleared so it's impossible to report accurate
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
388 // information for that case.
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
389 bool is_synchronized = false;
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
390 bool has_exception_handler = false;
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
391 bool is_native = false;
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
392 if (method != NULL) {
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
393 is_synchronized = method->is_synchronized();
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
394 has_exception_handler = method->has_exception_handler();
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
395 is_native = method->is_native();
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
396 }
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
397 // method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
398 const char compile_type = is_osr_method ? '%' : ' ';
3752
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
399 const char sync_char = is_synchronized ? 's' : ' ';
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
400 const char exception_char = has_exception_handler ? '!' : ' ';
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
401 const char blocking_char = is_blocking ? 'b' : ' ';
3752
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
402 const char native_char = is_native ? 'n' : ' ';
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
403
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
404 // print method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
405 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
406
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
407 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
408 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
409 else st->print("- ");
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 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
412
3752
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
413 if (method == NULL) {
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
414 st->print("(method)");
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
415 } else {
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
416 method->print_short_name(st);
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
417 if (is_osr_method) {
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
418 st->print(" @ %d", osr_bci);
f918d6096e23 7050554: JSR 292 - need optimization for selectAlternative
never
parents: 3294
diff changeset
419 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
420 if (method->is_native())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
421 st->print(" (native)");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
422 else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
423 st->print(" (%d bytes)", method->code_size());
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
424 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
425
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
426 if (msg != NULL) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
427 st->print(" %s", msg);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
428 }
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
429 if (!short_form) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
430 st->cr();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
431 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
434 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
435 // CompileTask::print_inlining
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
436 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
437 // 1234567
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
438 st->print(" "); // print timestamp
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
439 // 1234
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
440 st->print(" "); // print compilation number
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 // method attributes
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
443 if (method->is_loaded()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
444 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
445 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
446 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
447
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
448 // print method attributes
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
449 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
450 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
451 // %s!bn
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
452 st->print(" "); // print method attributes
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
453 }
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
454
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
455 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
456 st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
457 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
458 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
459 st->print(" "); // initial inlining indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
460
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
461 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
462
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
463 st->print("@ %d ", bci); // print bci
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
464 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
465 if (method->is_loaded())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
466 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
467 else
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
468 st->print(" (not loaded)");
2405
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 if (msg != NULL) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
471 st->print(" %s", msg);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
472 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
473 st->cr();
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
474 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
475
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 // CompileTask::print_inline_indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
478 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
479 // 1234567
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
480 st->print(" "); // print timestamp
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
481 // 1234
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
482 st->print(" "); // print compilation number
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
483 // %s!bn
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
484 st->print(" "); // print method attributes
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
485 if (TieredCompilation) {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
486 st->print(" ");
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
487 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
488 st->print(" "); // more indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
489 st->print(" "); // initial inlining indent
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
490 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
491 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
492
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
493 // ------------------------------------------------------------------
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
494 // CompileTask::print_compilation
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
495 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
496 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
497 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
498 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // CompileTask::log_task
a61af66fc99e Initial load
duke
parents:
diff changeset
502 void CompileTask::log_task(xmlStream* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 Thread* thread = Thread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
504 methodHandle method(thread, this->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // <task id='9' method='M' osr_bci='X' level='1' blocking='1' stamp='1.234'>
a61af66fc99e Initial load
duke
parents:
diff changeset
508 if (_compile_id != 0) log->print(" compile_id='%d'", _compile_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 if (_osr_bci != CompileBroker::standard_entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 log->print(" compile_kind='osr'"); // same as nmethod::compile_kind
a61af66fc99e Initial load
duke
parents:
diff changeset
511 } // else compile_kind='c2c'
a61af66fc99e Initial load
duke
parents:
diff changeset
512 if (!method.is_null()) log->method(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if (_osr_bci != CompileBroker::standard_entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 log->print(" osr_bci='%d'", _osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (_comp_level != CompLevel_highest_tier) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 log->print(" level='%d'", _comp_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 if (_is_blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 log->print(" blocking='1'");
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // CompileTask::log_task_queued
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void CompileTask::log_task_queued() {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
530 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 xtty->begin_elem("task_queued");
a61af66fc99e Initial load
duke
parents:
diff changeset
534 log_task(xtty);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (_comment != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 xtty->print(" comment='%s'", _comment);
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 if (_hot_method != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
539 methodHandle hot(thread, _hot_method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
540 methodHandle method(thread, _method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (hot() != method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 xtty->method(hot);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (_hot_count != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 xtty->print(" hot_count='%d'", _hot_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // CompileTask::log_task_start
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void CompileTask::log_task_start(CompileLog* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 log->begin_head("task");
a61af66fc99e Initial load
duke
parents:
diff changeset
556 log_task(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 log->end_head();
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 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // CompileTask::log_task_done
a61af66fc99e Initial load
duke
parents:
diff changeset
563 void CompileTask::log_task_done(CompileLog* log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 Thread* thread = Thread::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
565 methodHandle method(thread, this->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // <task_done ... stamp='1.234'> </task>
a61af66fc99e Initial load
duke
parents:
diff changeset
569 nmethod* nm = code();
a61af66fc99e Initial load
duke
parents:
diff changeset
570 log->begin_elem("task_done success='%d' nmsize='%d' count='%d'",
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
571 _is_success, nm == NULL ? 0 : nm->content_size(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 method->invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
573 int bec = method->backedge_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
574 if (bec != 0) log->print(" backedge_count='%d'", bec);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // Note: "_is_complete" is about to be set, but is not.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 if (_num_inlined_bytecodes != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 log->print(" inlined_bytes='%d'", _num_inlined_bytecodes);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
580 log->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
581 log->tail("task");
a61af66fc99e Initial load
duke
parents:
diff changeset
582 log->clear_identities(); // next task will have different CI
a61af66fc99e Initial load
duke
parents:
diff changeset
583 if (log->unflushed_count() > 2000) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 log->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 log->mark_file_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // CompileQueue::add
a61af66fc99e Initial load
duke
parents:
diff changeset
593 //
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Add a CompileTask to a CompileQueue
a61af66fc99e Initial load
duke
parents:
diff changeset
595 void CompileQueue::add(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 assert(lock()->owned_by_self(), "must own lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 task->set_next(NULL);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
599 task->set_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 if (_last == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // The compile queue is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
603 assert(_first == NULL, "queue is empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
604 _first = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 _last = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // Append the task to the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
608 assert(_last->next() == NULL, "not last");
a61af66fc99e Initial load
duke
parents:
diff changeset
609 _last->set_next(task);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
610 task->set_prev(_last);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 _last = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
612 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
613 ++_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // 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
616 task->method()->set_queued_for_compilation();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (CIPrintCompileQueue) {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 print();
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 if (LogCompilation && xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
623 task->log_task_queued();
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // Notify CompilerThreads that a task is available.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
627 lock()->notify_all();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // CompileQueue::get
a61af66fc99e Initial load
duke
parents:
diff changeset
632 //
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // Get the next CompileTask from a CompileQueue
a61af66fc99e Initial load
duke
parents:
diff changeset
634 CompileTask* CompileQueue::get() {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
635 NMethodSweeper::possibly_sweep();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
636
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 MutexLocker locker(lock());
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // Wait for an available CompileTask.
a61af66fc99e Initial load
duke
parents:
diff changeset
639 while (_first == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // There is no work to be done right now. Wait.
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
641 if (UseCodeCacheFlushing && (!CompileBroker::should_compile_new_jobs() || CodeCache::needs_flushing())) {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
642 // During the emergency sweeping periods, wake up and sweep occasionally
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
643 bool timedout = lock()->wait(!Mutex::_no_safepoint_check_flag, NmethodSweepCheckInterval*1000);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
644 if (timedout) {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
645 MutexUnlocker ul(lock());
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
646 // When otherwise not busy, run nmethod sweeping
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
647 NMethodSweeper::possibly_sweep();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
648 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
649 } else {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
650 // During normal operation no need to wake up on timer
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
651 lock()->wait();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1353
diff changeset
652 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
654 CompileTask* task = CompilationPolicy::policy()->select_task(this);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
655 remove(task);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
656 return task;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
657 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
659 void CompileQueue::remove(CompileTask* task)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
660 {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
661 assert(lock()->owned_by_self(), "must own lock");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
662 if (task->prev() != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
663 task->prev()->set_next(task->next());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
664 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
665 // max is the first element
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
666 assert(task == _first, "Sanity");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
667 _first = task->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
670 if (task->next() != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
671 task->next()->set_prev(task->prev());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
672 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
673 // max is the last element
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
674 assert(task == _last, "Sanity");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
675 _last = task->prev();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
676 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
677 --_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
680 // 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
681 // 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
682 void CompileQueue::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
683 CompileTask* task = _first;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
684 while (task != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
685 task->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
686 task = task->next();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
687 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
688 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
689
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // CompileQueue::print
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void CompileQueue::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 tty->print_cr("Contents of %s", name());
a61af66fc99e Initial load
duke
parents:
diff changeset
694 tty->print_cr("----------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
695 CompileTask* task = _first;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 while (task != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 task->print_line();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 task = task->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 tty->print_cr("----------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 CompilerCounters::CompilerCounters(const char* thread_name, int instance, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 _current_method[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
706 _compile_type = CompileBroker::no_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // create the thread instance name space string - don't create an
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // instance subspace if instance is -1 - keeps the adapterThread
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // counters from having a ".0" namespace.
a61af66fc99e Initial load
duke
parents:
diff changeset
714 const char* thread_i = (instance == -1) ? thread_name :
a61af66fc99e Initial load
duke
parents:
diff changeset
715 PerfDataManager::name_space(thread_name, instance);
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718 char* name = PerfDataManager::counter_name(thread_i, "method");
a61af66fc99e Initial load
duke
parents:
diff changeset
719 _perf_current_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
720 PerfDataManager::create_string_variable(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
722 _current_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 name = PerfDataManager::counter_name(thread_i, "type");
a61af66fc99e Initial load
duke
parents:
diff changeset
725 _perf_compile_type = PerfDataManager::create_variable(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
726 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
727 (jlong)_compile_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
728 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 name = PerfDataManager::counter_name(thread_i, "time");
a61af66fc99e Initial load
duke
parents:
diff changeset
731 _perf_time = PerfDataManager::create_counter(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
732 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 name = PerfDataManager::counter_name(thread_i, "compiles");
a61af66fc99e Initial load
duke
parents:
diff changeset
735 _perf_compiles = PerfDataManager::create_counter(SUN_CI, name,
a61af66fc99e Initial load
duke
parents:
diff changeset
736 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // CompileBroker::compilation_init
a61af66fc99e Initial load
duke
parents:
diff changeset
742 //
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // Initialize the Compilation object
a61af66fc99e Initial load
duke
parents:
diff changeset
744 void CompileBroker::compilation_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 _last_method_compiled[0] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
746
1970
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
747 #ifndef SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Set the interface to the current compiler(s).
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
749 int c1_count = CompilationPolicy::policy()->compiler_count(CompLevel_simple);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
750 int c2_count = CompilationPolicy::policy()->compiler_count(CompLevel_full_optimization);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 #ifdef COMPILER1
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
752 if (c1_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
753 _compilers[0] = new Compiler();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
754 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 #endif // COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 #ifdef COMPILER2
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
758 if (c2_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
759 _compilers[1] = new C2Compiler();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
760 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
762
1970
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
763 #else // SHARK
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
764 int c1_count = 0;
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
765 int c2_count = 1;
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
766
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
767 _compilers[1] = new SharkCompiler();
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1964
diff changeset
768 #endif // SHARK
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1579
diff changeset
769
0
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // Initialize the CompileTask free list
a61af66fc99e Initial load
duke
parents:
diff changeset
771 _task_free_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Start the CompilerThreads
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
774 init_compiler_threads(c1_count, c2_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // totalTime performance counter is always created as it is required
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // by the implementation of java.lang.management.CompilationMBean.
a61af66fc99e Initial load
duke
parents:
diff changeset
777 {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 _perf_total_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
780 PerfDataManager::create_counter(JAVA_CI, "totalTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
781 PerfData::U_Ticks, 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 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // create the jvmstat performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
790 _perf_osr_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
791 PerfDataManager::create_counter(SUN_CI, "osrTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
792 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 _perf_standard_compilation =
a61af66fc99e Initial load
duke
parents:
diff changeset
795 PerfDataManager::create_counter(SUN_CI, "standardTime",
a61af66fc99e Initial load
duke
parents:
diff changeset
796 PerfData::U_Ticks, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 _perf_total_bailout_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
799 PerfDataManager::create_counter(SUN_CI, "totalBailouts",
a61af66fc99e Initial load
duke
parents:
diff changeset
800 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 _perf_total_invalidated_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
803 PerfDataManager::create_counter(SUN_CI, "totalInvalidates",
a61af66fc99e Initial load
duke
parents:
diff changeset
804 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 _perf_total_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
807 PerfDataManager::create_counter(SUN_CI, "totalCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
808 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 _perf_total_osr_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
810 PerfDataManager::create_counter(SUN_CI, "osrCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
811 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 _perf_total_standard_compile_count =
a61af66fc99e Initial load
duke
parents:
diff changeset
814 PerfDataManager::create_counter(SUN_CI, "standardCompiles",
a61af66fc99e Initial load
duke
parents:
diff changeset
815 PerfData::U_Events, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 _perf_sum_osr_bytes_compiled =
a61af66fc99e Initial load
duke
parents:
diff changeset
818 PerfDataManager::create_counter(SUN_CI, "osrBytes",
a61af66fc99e Initial load
duke
parents:
diff changeset
819 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 _perf_sum_standard_bytes_compiled =
a61af66fc99e Initial load
duke
parents:
diff changeset
822 PerfDataManager::create_counter(SUN_CI, "standardBytes",
a61af66fc99e Initial load
duke
parents:
diff changeset
823 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 _perf_sum_nmethod_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
826 PerfDataManager::create_counter(SUN_CI, "nmethodSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
827 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 _perf_sum_nmethod_code_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
830 PerfDataManager::create_counter(SUN_CI, "nmethodCodeSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
831 PerfData::U_Bytes, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 _perf_last_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
834 PerfDataManager::create_string_variable(SUN_CI, "lastMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
835 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
836 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 _perf_last_failed_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
839 PerfDataManager::create_string_variable(SUN_CI, "lastFailedMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
840 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
841 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 _perf_last_invalidated_method =
a61af66fc99e Initial load
duke
parents:
diff changeset
844 PerfDataManager::create_string_variable(SUN_CI, "lastInvalidatedMethod",
a61af66fc99e Initial load
duke
parents:
diff changeset
845 CompilerCounters::cmname_buffer_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
846 "", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 _perf_last_compile_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
849 PerfDataManager::create_variable(SUN_CI, "lastType",
a61af66fc99e Initial load
duke
parents:
diff changeset
850 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
851 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
852 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 _perf_last_compile_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
855 PerfDataManager::create_variable(SUN_CI, "lastSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
856 PerfData::U_Bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
857 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
858 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 _perf_last_failed_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
862 PerfDataManager::create_variable(SUN_CI, "lastFailedType",
a61af66fc99e Initial load
duke
parents:
diff changeset
863 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
864 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
865 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 _perf_last_invalidated_type =
a61af66fc99e Initial load
duke
parents:
diff changeset
868 PerfDataManager::create_variable(SUN_CI, "lastInvalidatedType",
a61af66fc99e Initial load
duke
parents:
diff changeset
869 PerfData::U_None,
a61af66fc99e Initial load
duke
parents:
diff changeset
870 (jlong)CompileBroker::no_compile,
a61af66fc99e Initial load
duke
parents:
diff changeset
871 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 _initialized = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // CompileBroker::make_compiler_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
881 CompilerThread* CompileBroker::make_compiler_thread(const char* name, CompileQueue* queue, CompilerCounters* counters, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 CompilerThread* compiler_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
883
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
884 Klass* k =
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
885 SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
886 true, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
888 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 Handle string = java_lang_String::create_from_str(name, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Initialize thread_oop to put it into the system threadGroup
a61af66fc99e Initial load
duke
parents:
diff changeset
892 Handle thread_group (THREAD, Universe::system_thread_group());
a61af66fc99e Initial load
duke
parents:
diff changeset
893 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 JavaCalls::call_special(&result, thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
895 klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
896 vmSymbols::object_initializer_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
897 vmSymbols::threadgroup_string_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
898 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
899 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
900 CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 MutexLocker mu(Threads_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
904 compiler_thread = new CompilerThread(queue, counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // At this point the new CompilerThread data-races with this startup
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // thread (which I believe is the primoridal thread and NOT the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // thread). This means Java bytecodes being executed at startup can
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // queue compile jobs which will run at whatever default priority the
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // newly created CompilerThread runs at.
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // At this point it may be possible that no osthread was created for the
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // JavaThread due to lack of memory. We would have to throw an exception
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // in that case. However, since this must work and we do not allow
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // exceptions anyway, check and abort if this fails.
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 if (compiler_thread == NULL || compiler_thread->osthread() == NULL){
a61af66fc99e Initial load
duke
parents:
diff changeset
918 vm_exit_during_initialization("java.lang.OutOfMemoryError",
a61af66fc99e Initial load
duke
parents:
diff changeset
919 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
920 }
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 java_lang_Thread::set_thread(thread_oop(), compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // Note that this only sets the JavaThread _priority field, which by
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // definition is limited to Java priorities and not OS priorities.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // 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
927
0
a61af66fc99e Initial load
duke
parents:
diff changeset
928 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
929
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
930 // 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
931 // 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
932 // 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
933 // thread.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
934
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
935 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
936 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
937 if (UseCriticalCompilerThreadPriority) {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
938 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
939 } else {
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
940 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
941 }
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
942 }
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
943 os::set_native_priority(compiler_thread, native_prio);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 java_lang_Thread::set_daemon(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 compiler_thread->set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
948 Threads::add(compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
949 Thread::start(compiler_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
950 }
4854
de268c8a8075 7082553: Interpret Thread.setPriority(Thread.MAX_PRIORITY) to mean FX60 on Solaris 10 and 11
phh
parents: 4122
diff changeset
951
0
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // Let go of Threads_lock before yielding
a61af66fc99e Initial load
duke
parents:
diff changeset
953 os::yield(); // make sure that the compiler thread is started early (especially helpful on SOLARIS)
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 return compiler_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 }
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // CompileBroker::init_compiler_threads
a61af66fc99e Initial load
duke
parents:
diff changeset
961 //
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // Initialize the compilation queue
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
963 void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964 EXCEPTION_MARK;
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2405
diff changeset
965 #if !defined(ZERO) && !defined(SHARK)
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
966 assert(c2_compiler_count > 0 || c1_compiler_count > 0, "No compilers?");
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2405
diff changeset
967 #endif // !ZERO && !SHARK
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
968 if (c2_compiler_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
969 _c2_method_queue = new CompileQueue("C2MethodQueue", MethodCompileQueue_lock);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
970 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
971 if (c1_compiler_count > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
972 _c1_method_queue = new CompileQueue("C1MethodQueue", MethodCompileQueue_lock);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
973 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
975 int compiler_count = c1_compiler_count + c2_compiler_count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
976
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977 _method_threads =
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4944
diff changeset
978 new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<CompilerThread*>(compiler_count, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 char name_buffer[256];
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
981 for (int i = 0; i < c2_compiler_count; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // Create a name for our thread.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
983 sprintf(name_buffer, "C2 CompilerThread%d", i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
984 CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
985 CompilerThread* new_thread = make_compiler_thread(name_buffer, _c2_method_queue, counters, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
986 _method_threads->append(new_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
987 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
988
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
989 for (int i = c2_compiler_count; i < compiler_count; i++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
990 // Create a name for our thread.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
991 sprintf(name_buffer, "C1 CompilerThread%d", i);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
992 CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
993 CompilerThread* new_thread = make_compiler_thread(name_buffer, _c1_method_queue, counters, CHECK);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
994 _method_threads->append(new_thread);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
995 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
996
0
a61af66fc99e Initial load
duke
parents:
diff changeset
997 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 PerfDataManager::create_constant(SUN_CI, "threads", PerfData::U_Bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
999 compiler_count, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1003
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1004 // 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
1005 // reclaim them
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1006 void CompileBroker::mark_on_stack() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1007 if (_c2_method_queue != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1008 _c2_method_queue->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1009 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1010 if (_c1_method_queue != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1011 _c1_method_queue->mark_on_stack();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1012 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1013 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1014
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // CompileBroker::is_idle
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 bool CompileBroker::is_idle() {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1018 if (_c2_method_queue != NULL && !_c2_method_queue->is_empty()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1019 return false;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1020 } else if (_c1_method_queue != NULL && !_c1_method_queue->is_empty()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 int num_threads = _method_threads->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 for (int i=0; i<num_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if (_method_threads->at(i)->task() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // No pending or active compilations.
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // CompileBroker::compile_method
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // Request compilation of a method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 void CompileBroker::compile_method_base(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 const char* comment,
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1046 Thread* thread) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // do nothing if compiler thread(s) is not available
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 if (!_initialized ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 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
1053 assert(method->method_holder()->oop_is_instance(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 "sanity check");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6843
diff changeset
1055 assert(!method->method_holder()->is_not_initialized(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 "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
1057 assert(!method->is_method_handle_intrinsic(), "do not enqueue these guys");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 if (CIPrintRequests) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 tty->print("request: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 if (osr_bci != InvocationEntryBci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 tty->print(" osr_bci: %d", osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 tty->print(" comment: %s count: %d", comment, hot_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 if (!hot_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 tty->print(" hot: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 if (hot_method() != method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 hot_method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 tty->print("yes");
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // A request has been made for compilation. Before we do any
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // real work, check to see if the method has been compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // in the meantime with a definitive result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 if (compilation_is_complete(method, osr_bci, comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
2403
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1084 #ifndef PRODUCT
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1085 if (osr_bci != -1 && !FLAG_IS_DEFAULT(OSROnlyBCI)) {
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1086 if ((OSROnlyBCI > 0) ? (OSROnlyBCI != osr_bci) : (-OSROnlyBCI == osr_bci)) {
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1087 // 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
1088 return;
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1089 }
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1090 }
1927db75dd85 7024475: loop doesn't terminate when compiled
never
parents: 2353
diff changeset
1091 #endif
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1092
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // If this method is already in the compile queue, then
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // we do not block the current thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 if (compilation_is_in_queue(method, osr_bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // We may want to decay our counter a bit here to prevent
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // multiple denied requests for compilation. This is an
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // open compilation policy issue. Note: The other possibility,
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // in the case that this is a blocking compile request, is to have
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // all subsequent blocking requesters wait for completion of
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // ongoing compiles. Note that in this case we'll need a protocol
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // for freeing the associated compile tasks. [Or we could have
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // a single static monitor on which all these waiters sleep.]
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
3294
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1107 // If the requesting thread is holding the pending list lock
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1108 // 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
1109 // 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
1110 // between the reference handler thread, a GC (instigated
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1111 // by a compiler thread), and compiled method registration.
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6725
diff changeset
1112 if (InstanceRefKlass::owns_pending_list_lock(JavaThread::current())) {
3294
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1113 return;
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1114 }
86ebb26bcdeb 7037756: Deadlock in compiler thread similiar to 6789220
johnc
parents: 2482
diff changeset
1115
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // Outputs from the following MutexLocker block:
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 CompileTask* task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 bool blocking = false;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1119 CompileQueue* queue = compile_queue(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1120
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // Acquire our lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 {
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1123 MutexLocker locker(queue->lock(), thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // Make sure the method has not slipped into the queues since
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // last we checked; note that those checks were "fast bail-outs".
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // Here we need to be more careful, see 14012000 below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 if (compilation_is_in_queue(method, osr_bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // We need to check again to see if the compilation has
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // completed. A previous compilation may have registered
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // some result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 if (compilation_is_complete(method, osr_bci, comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // We now know that this compilation is not pending, complete,
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // or prohibited. Assign a compile_id to this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 // and check to see if it is in our [Start..Stop) range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 uint compile_id = assign_compile_id(method, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 if (compile_id == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // The compilation falls outside the allowed range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 // Should this thread wait for completion of the compile?
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 blocking = is_compile_blocking(method, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // We will enter the compilation in the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // 14012000: Note that this sets the queued_for_compile bits in
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // the target method. We can now reason that a method cannot be
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 // queued for compilation more than once, as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // Before a thread queues a task for compilation, it first acquires
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // the compile queue lock, then checks if the method's queued bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 // are set or it has already been compiled. Thus there can not be two
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // instances of a compilation task for the same method on the
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 // compilation queue. Consider now the case where the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // thread has already removed a task for that method from the queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // and is in the midst of compiling it. In this case, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // queued_for_compile bits must be set in the method (and these
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // will be visible to the current thread, since the bits were set
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // under protection of the compile queue lock, which we hold now.
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 // When the compilation completes, the compiler thread first sets
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // the compilation result and then clears the queued_for_compile
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // bits. Neither of these actions are protected by a barrier (or done
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 // under the protection of a lock), so the only guarantee we have
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // (on machines with TSO (Total Store Order)) is that these values
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // will update in that order. As a result, the only combinations of
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 // these bits that the current thread will see are, in temporal order:
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 // <RESULT, QUEUE> :
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 // <0, 1> : in compile queue, but not yet compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // <1, 1> : compiled but queue bit not cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // <1, 0> : compiled and queue bit cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Because we first check the queue bits then check the result bits,
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // we are assured that we cannot introduce a duplicate task.
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // Note that if we did the tests in the reverse order (i.e. check
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // result then check queued bit), we could get the result bit before
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // the compilation completed, and the queue bit after the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // completed, and end up introducing a "duplicate" (redundant) task.
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // In that case, the compiler thread should first check if a method
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // has already been compiled before trying to compile it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // NOTE: in the event that there are multiple compiler threads and
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 // there is de-optimization/recompilation, things will get hairy,
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // and in that case it's best to protect both the testing (here) of
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // these bits, and their updating (here and elsewhere) under a
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // common lock.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1189 task = create_compile_task(queue,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 compile_id, method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 osr_bci, comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 hot_method, hot_count, comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 blocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 if (blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 wait_for_completion(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 nmethod* CompileBroker::compile_method(methodHandle method, int osr_bci,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1203 int comp_level,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 methodHandle hot_method, int hot_count,
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1205 const char* comment, Thread* THREAD) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 // make sure arguments make sense
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1207 assert(method->method_holder()->oop_is_instance(), "not an instance method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 assert(osr_bci == InvocationEntryBci || (0 <= osr_bci && osr_bci < method->code_size()), "bci out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 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
1210 assert(!method->method_holder()->is_not_initialized(), "method holder must be initialized");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1212 if (!TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1213 comp_level = CompLevel_highest_tier;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 // return quickly if possible
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // lock, make sure that the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // isn't prohibited in a straightforward way.
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
7601
606eada1bf86 8005820: Shark: enable JSR292 support
twisti
parents: 7409
diff changeset
1221 if (compiler(comp_level) == NULL || !compiler(comp_level)->can_compile_method(method) || compilation_is_prohibited(method, osr_bci, comp_level)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 if (osr_bci == InvocationEntryBci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // standard compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 nmethod* method_code = method->code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1228 if (method_code != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1229 if (compilation_is_complete(method, osr_bci, comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1230 return method_code;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1231 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 if (method->is_not_compilable(comp_level)) return NULL;
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1234
1300
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1235 if (UseCodeCacheFlushing) {
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1236 nmethod* saved = CodeCache::find_and_remove_saved_code(method());
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1237 if (saved != NULL) {
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1238 method->set_code(method, saved);
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1239 return saved;
428a9c451986 6935466: new CodeCache flushing code is not guarded by the flag
kvn
parents: 1208
diff changeset
1240 }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1241 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1242
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // osr compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 #ifndef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // seems like an assert of dubious value
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1247 assert(comp_level == CompLevel_highest_tier,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 "all OSR compiles are assumed to be at a single compilation lavel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 #endif // TIERED
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1250 // We accept a higher level osr method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1251 nmethod* nm = method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 if (nm != NULL) return nm;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1253 if (method->is_not_osr_compilable(comp_level)) return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 assert(!HAS_PENDING_EXCEPTION, "No exception should be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 // some prerequisites that are compiler specific
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2405
diff changeset
1258 if (compiler(comp_level)->is_c2() || compiler(comp_level)->is_shark()) {
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1259 method->constants()->resolve_string_constants(CHECK_AND_CLEAR_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 // Resolve all classes seen in the signature of the method
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 // we are compiling.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1262 Method::load_signature_classes(method, CHECK_AND_CLEAR_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 // If the method is native, do the lookup in the thread requesting
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // the compilation. Native lookups can load code, which is not
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // permitted during compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Note: A native method implies non-osr compilation which is
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 // 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
1271 if (method->is_native() && !method->is_method_handle_intrinsic()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 bool in_base_library;
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 address adr = NativeLookup::lookup(method, in_base_library, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // In case of an exception looking up the method, we just forget
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // about it. The interpreter will kick-in and throw the exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 method->set_not_compilable(); // implies is_not_osr_compilable()
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 assert(method->has_native_function(), "must have native code by now");
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // RedefineClasses() has replaced this method; just return
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 if (method->is_old()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 // JVMTI -- post_compile_event requires jmethod_id() that may require
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 // a lock the compiling thread can not acquire. Prefetch it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 if (JvmtiExport::should_post_compiled_method_load()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 method->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1295 // If the compiler is shut off due to code cache flushing or otherwise,
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1296 // fail out now so blocking compiles dont hang the java thread
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1297 if (!should_compile_new_jobs() || (UseCodeCacheFlushing && CodeCache::needs_flushing())) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1298 CompilationPolicy::policy()->delay_compilation(method());
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1299 return NULL;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1300 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1301
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // do the compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 if (method->is_native()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6197
diff changeset
1304 if (!PreferInterpreterNativeStubs || method->is_method_handle_intrinsic()) {
2405
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1305 // Acquire our lock.
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1306 int compile_id;
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1307 {
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1308 MutexLocker locker(MethodCompileQueue_lock, THREAD);
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1309 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
1310 }
3d58a4983660 7022998: JSR 292 recursive method handle calls inline themselves infinitely
twisti
parents: 2403
diff changeset
1311 (void) AdapterHandlerLibrary::create_native_wrapper(method, compile_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 } else {
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4122
diff changeset
1316 compile_method_base(method, osr_bci, comp_level, hot_method, hot_count, comment, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // return requested nmethod
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1320 // We accept a higher level osr method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1321 return osr_bci == InvocationEntryBci ? method->code() : method->lookup_osr_nmethod_for(osr_bci, comp_level, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 // CompileBroker::compilation_is_complete
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // See if compilation of this method is already complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 bool CompileBroker::compilation_is_complete(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 if (is_osr) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1334 if (method->is_not_osr_compilable(comp_level)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 } else {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1337 nmethod* result = method->lookup_osr_nmethod_for(osr_bci, comp_level, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 return (result != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 if (method->is_not_compilable(comp_level)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 nmethod* result = method->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 if (result == NULL) return false;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1346 return comp_level == result->comp_level();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1350
a61af66fc99e Initial load
duke
parents:
diff changeset
1351
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 // CompileBroker::compilation_is_in_queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 // See if this compilation is already requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // Implementation note: there is only a single "is in queue" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // for each method. This means that the check below is overly
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 // conservative in the sense that an osr compilation in the queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // will block a normal compilation from entering the queue (and vice
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // versa). This can be remedied by a full queue search to disambiguate
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 // cases. If it is deemed profitible, this may be done.
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 bool CompileBroker::compilation_is_in_queue(methodHandle method,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1364 int osr_bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 return method->queued_for_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1367
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 // CompileBroker::compilation_is_prohibited
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 // See if this compilation is not allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 bool CompileBroker::compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 bool is_native = method->is_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // Some compilers may not support the compilation of natives.
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 if (is_native &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 (!CICompileNatives || !compiler(comp_level)->supports_native())) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1377 method->set_not_compilable_quietly(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // Some compilers may not support on stack replacement.
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 if (is_osr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 (!CICompileOSR || !compiler(comp_level)->supports_osr())) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1385 method->set_not_osr_compilable(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // The method may be explicitly excluded by the user.
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 bool quietly;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 if (CompilerOracle::should_exclude(method, quietly)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 if (!quietly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // This does not happen quietly...
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 tty->print("### Excluding %s:%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 method->is_native() ? "generation of native wrapper" : "compile",
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 (method->is_static() ? " static" : ""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 method->print_short_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 }
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7607
diff changeset
1401 method->set_not_compilable(CompLevel_all, !quietly, "excluded by CompilerOracle");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1406
a61af66fc99e Initial load
duke
parents:
diff changeset
1407
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 // CompileBroker::assign_compile_id
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 // Assign a serialized id number to this compilation request. If the
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // number falls out of the allowed range, return a 0. OSR
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 // compilations may be numbered separately from regular compilations
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // if certain debugging flags are used.
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 uint CompileBroker::assign_compile_id(methodHandle method, int osr_bci) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
1416 assert(MethodCompileQueue_lock->owner() == Thread::current(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 "must hold the compilation queue lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 uint id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 if (CICountOSR && is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 id = ++_osr_compilation_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 if ((uint)CIStartOSR <= id && id < (uint)CIStopOSR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 id = ++_compilation_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 if ((uint)CIStart <= id && id < (uint)CIStop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 return id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1431
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 // 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
1433 method->set_not_compilable_quietly();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1436
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // CompileBroker::is_compile_blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 // Should the current thread be blocked until this compilation request
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // has been fulfilled?
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 bool CompileBroker::is_compile_blocking(methodHandle method, int osr_bci) {
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6725
diff changeset
1444 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
1445 return !BackgroundCompilation;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1447
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // CompileBroker::preload_classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 void CompileBroker::preload_classes(methodHandle method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 // Move this code over from c1_Compiler.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 // CompileBroker::create_compile_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 // Create a CompileTask object representing the current request for
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 // compilation. Add this task to the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 CompileTask* CompileBroker::create_compile_task(CompileQueue* queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 int osr_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 int comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 methodHandle hot_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 int hot_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 const char* comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 bool blocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 CompileTask* new_task = allocate_task();
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 new_task->initialize(compile_id, method, osr_bci, comp_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 hot_method, hot_count, comment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 blocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 queue->add(new_task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 return new_task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1478
a61af66fc99e Initial load
duke
parents:
diff changeset
1479
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 // CompileBroker::allocate_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 // Allocate a CompileTask, from the free list if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 CompileTask* CompileBroker::allocate_task() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 MutexLocker locker(CompileTaskAlloc_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 CompileTask* task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 if (_task_free_list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 task = _task_free_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 _task_free_list = task->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 task->set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 task = new CompileTask();
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 task->set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 return task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1497
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // CompileBroker::free_task
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // Add a task to the free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 void CompileBroker::free_task(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 MutexLocker locker(CompileTaskAlloc_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 task->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 task->set_next(_task_free_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 _task_free_list = task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1509
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 // CompileBroker::wait_for_completion
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 // Wait for the given method CompileTask to complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 void CompileBroker::wait_for_completion(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 if (CIPrintCompileQueue) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 tty->print_cr("BLOCKING FOR COMPILE");
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 assert(task->is_blocking(), "can only wait on blocking task");
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 thread->set_blocked_on_compilation(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1524
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1525 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 MutexLocker waiter(task->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1528
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 while (!task->is_complete())
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 task->lock()->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 // It is harmless to check this status without the lock, because
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // completion is a stable property (until the task object is recycled).
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 assert(task->is_complete(), "Compilation should have completed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 assert(task->code_handle() == NULL, "must be reset");
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 thread->set_blocked_on_compilation(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1538
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 // By convention, the waiter is responsible for recycling a
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 // blocking CompileTask. Since there is only one waiter ever
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 // waiting on a CompileTask, we know that no one else will
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 // be using this CompileTask; we can free it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 free_task(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 // CompileBroker::compiler_thread_loop
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 // The main loop run by a CompilerThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 void CompileBroker::compiler_thread_loop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 CompileQueue* queue = thread->queue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1553
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 // For the thread that initializes the ciObjectFactory
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 // this resource mark holds all the shared objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1557
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 // First thread to get here will initialize the compiler interface
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 if (!ciObjectFactory::is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 ASSERT_IN_VM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 MutexLocker only_one (CompileThread_lock, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 if (!ciObjectFactory::is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 ciObjectFactory::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1567
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // Open a log.
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 if (LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 init_compiler_thread_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 CompileLog* log = thread->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 if (log != NULL) {
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6800
diff changeset
1574 log->begin_elem("start_compile_thread name='%s' thread='" UINTX_FORMAT "' process='%d'",
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6800
diff changeset
1575 thread->name(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 os::current_thread_id(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 os::current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 log->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1581
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // We need this HandleMark to avoid leaking VM handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 HandleMark hm(thread);
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1586
2353
1c0cf339481b 7025742: Can not use CodeCache::unallocated_capacity() with fragmented CodeCache
kvn
parents: 2260
diff changeset
1587 if (CodeCache::largest_free_block() < CodeCacheMinimumFreeSpace) {
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1588 // the code cache is really full
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1589 handle_full_code_cache();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1590 } else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1591 // Attempt to start cleaning the code cache while there is still a little headroom
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1592 NMethodSweeper::handle_full_code_cache(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 CompileTask* task = queue->get();
a61af66fc99e Initial load
duke
parents:
diff changeset
1596
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 // Give compiler threads an extra quanta. They tend to be bursty and
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 // this helps the compiler to finish up the job.
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 if( CompilerThreadHintNoPreempt )
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 os::hint_no_preempt();
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 // trace per thread time and compile statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 CompilerCounters* counters = ((CompilerThread*)thread)->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 PerfTraceTimedEvent(counters->time_counter(), counters->compile_counter());
a61af66fc99e Initial load
duke
parents:
diff changeset
1605
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 // Assign the task to the current thread. Mark this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 // thread as active for the profiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 CompileTaskWrapper ctw(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 nmethodLocker result_handle; // (handle for the nmethod produced by this task)
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 task->set_code_handle(&result_handle);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1611 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 // Never compile a method if breakpoints are present in it
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 if (method()->number_of_breakpoints() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 // Compile the method.
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1616 if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 // Allow repeating compilations for the purpose of benchmarking
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 // compile speed. This is not useful for customers.
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 if (CompilationRepeat != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 int compile_count = CompilationRepeat;
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 while (compile_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 invoke_compiler_on_method(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 nmethod* nm = method->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 nm->make_zombie();
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 method->clear_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 compile_count--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 #endif /* COMPILER1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 invoke_compiler_on_method(task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 // After compilation is disabled, remove remaining methods from queue
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 method->clear_queued_for_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1642
a61af66fc99e Initial load
duke
parents:
diff changeset
1643
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // CompileBroker::init_compiler_thread_log
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 // Set up state required by +LogCompilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 void CompileBroker::init_compiler_thread_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 char fileBuf[4*K];
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 FILE* fp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 char* file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 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
1656 if (dir == NULL) {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1657 jio_snprintf(fileBuf, sizeof(fileBuf), "hs_c" UINTX_FORMAT "_pid%u.log",
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1658 thread_id, os::current_process_id());
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1659 } else {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1660 jio_snprintf(fileBuf, sizeof(fileBuf),
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 1300
diff changeset
1661 "%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
1662 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
1663 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 fp = fopen(fileBuf, "at");
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 if (fp != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4944
diff changeset
1666 file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1, mtCompiler);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 strcpy(file, fileBuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 if (fp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 warning("Cannot open log file: %s", fileBuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 if (LogCompilation && Verbose)
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 tty->print_cr("Opening compilation log %s", file);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4944
diff changeset
1676 CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file, fp, thread_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 thread->init_log(log);
a61af66fc99e Initial load
duke
parents:
diff changeset
1678
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1681
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 // Record any per thread log files
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file);
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1687
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // CompileBroker::set_should_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // Set _should_block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // Call this from the VM, with Threads_lock held and a safepoint requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 void CompileBroker::set_should_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint already");
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 if (PrintCompilation && (Verbose || WizardMode))
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 tty->print_cr("notifying compiler thread pool to block");
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 _should_block = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1702
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 // CompileBroker::maybe_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 // Call this from the compiler at convenient points, to poll for _should_block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 void CompileBroker::maybe_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 if (_should_block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 if (PrintCompilation && (Verbose || WizardMode))
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 tty->print_cr("compiler thread " INTPTR_FORMAT " poll detects block request", Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 ThreadInVMfromNative tivfn(JavaThread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1717 // wrapper for CodeCache::print_summary()
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1718 static void codecache_print(bool detailed)
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1719 {
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1720 ResourceMark rm;
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1721 stringStream s;
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1722 // Dump code cache into a buffer before locking the tty,
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1723 {
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1724 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1725 CodeCache::print_summary(&s, detailed);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1726 }
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1727 ttyLocker ttyl;
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1728 tty->print_cr(s.as_string());
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1729 }
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1730
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 // CompileBroker::invoke_compiler_on_method
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 // Compile a method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 if (PrintCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 task->print_line();
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 elapsedTimer time;
a61af66fc99e Initial load
duke
parents:
diff changeset
1742
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1745
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1746 if (LogEvents) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1747 _compilation_log->log_compile(thread, task);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1748 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1749
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 // Common flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 uint compile_id = task->compile_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 int osr_bci = task->osr_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 bool is_osr = (osr_bci != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 bool should_log = (thread->log() != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 bool should_break = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 // create the handle inside it's own block so it can't
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 // accidentally be referenced once the thread transitions to
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 // native. The NoHandleMark before the transition should catch
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 // 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
1761 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 should_break = check_break_at(method, compile_id, is_osr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 if (should_log && !CompilerOracle::should_log(method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 should_log = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 assert(!method->is_native(), "no longer compile natives");
a61af66fc99e Initial load
duke
parents:
diff changeset
1767
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 // Save information about this method in case of failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 set_last_compile(thread, method, is_osr, task->comp_level());
a61af66fc99e Initial load
duke
parents:
diff changeset
1770
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler(task->comp_level()), method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1773
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 // Allocate a new set of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 push_jni_handle_block();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1776 Method* target_handle = task->method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 int compilable = ciEnv::MethodCompilable;
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 int system_dictionary_modification_counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 MutexLocker locker(Compile_lock, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 system_dictionary_modification_counter = SystemDictionary::number_of_modifications();
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1784
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 NoHandleMark nhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1787
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 ciEnv ci_env(task, system_dictionary_modification_counter);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 if (should_break) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 ci_env.set_break_at_compile(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 if (should_log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 ci_env.set_log(thread->log());
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 assert(thread->env() == &ci_env, "set by ci_env");
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 // The thread-env() field is cleared in ~CompileTaskWrapper.
a61af66fc99e Initial load
duke
parents:
diff changeset
1797
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
1798 // 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
1799 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
1800
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 0
diff changeset
1801 // 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
1802 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
1803
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 ciMethod* target = ci_env.get_method_from_handle(target_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
1805
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 TraceTime t1("compilation", &time);
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 compiler(task->comp_level())->compile_method(&ci_env, target, osr_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1809
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 if (!ci_env.failing() && task->code() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 //assert(false, "compiler should always document failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // The compiler elected, without comment, not to register a result.
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 // Do not attempt further compilations of this method.
1964
22ef3370343b 7000349: Tiered reacts incorrectly to C1 compilation failures
iveresov
parents: 1783
diff changeset
1814 ci_env.record_method_not_compilable("compile failed", !TieredCompilation);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1816
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1817 // Copy this bit to the enclosing block:
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1818 compilable = ci_env.compilable();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1819
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 if (ci_env.failing()) {
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1821 const char* retry_message = ci_env.retry_message();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1822 if (_compilation_log != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1823 _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
1824 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 if (PrintCompilation) {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1826 FormatBufferResource msg = retry_message != NULL ?
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1827 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
1828 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
1829 task->print_compilation(tty, msg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 task->mark_success();
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 task->set_num_inlined_bytecodes(ci_env.num_inlined_bytecodes());
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1834 if (_compilation_log != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1835 nmethod* code = task->code();
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1836 if (code != NULL) {
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1837 _compilation_log->log_nmethod(thread, code);
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1838 }
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4825
diff changeset
1839 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 pop_jni_handle_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1843
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1844 methodHandle method(thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1845
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 DTRACE_METHOD_COMPILE_END_PROBE(compiler(task->comp_level()), method, task->is_success());
a61af66fc99e Initial load
duke
parents:
diff changeset
1847
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 collect_statistics(thread, time, task);
a61af66fc99e Initial load
duke
parents:
diff changeset
1849
4064
670a74b863fc 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 4047
diff changeset
1850 if (PrintCompilation && PrintCompilation2) {
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
1851 tty->print("%7d ", (int) tty->time_stamp().milliseconds()); // print timestamp
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
1852 tty->print("%4d ", compile_id); // print compilation number
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
1853 tty->print("%s ", (is_osr ? "%" : " "));
4064
670a74b863fc 7107042: assert(no_dead_loop) failed: dead loop detected
kvn
parents: 4047
diff changeset
1854 int code_size = (task->code() == NULL) ? 0 : task->code()->total_size();
4122
cc81b9c09bbb 7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents: 4064
diff changeset
1855 tty->print_cr("size: %d time: %d inlined: %d bytes", code_size, (int)time.milliseconds(), task->num_inlined_bytecodes());
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
1856 }
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 4006
diff changeset
1857
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1858 if (PrintCodeCacheOnCompilation)
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1859 codecache_print(/* detailed= */ false);
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1860
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1861 // Disable compilation, if required.
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1862 switch (compilable) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1863 case ciEnv::MethodCompilable_never:
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1864 if (is_osr)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1865 method->set_not_osr_compilable_quietly();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1866 else
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
1867 method->set_not_compilable_quietly();
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1868 break;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1869 case ciEnv::MethodCompilable_not_at_tier:
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1870 if (is_osr)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1871 method->set_not_osr_compilable_quietly(task->comp_level());
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1872 else
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1873 method->set_not_compilable_quietly(task->comp_level());
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6735
diff changeset
1874 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1876
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 // Note that the queued_for_compilation bits are cleared without
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 // protection of a mutex. [They were set by the requester thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 // when adding the task to the complie queue -- at which time the
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 // compile queue lock was held. Subsequently, we acquired the compile
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 // queue lock to get this task off the compile queue; thus (to belabour
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 // the point somewhat) our clearing of the bits must be occurring
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 // only after the setting of the bits. See also 14012000 above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 method->clear_queued_for_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1885
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 if (CollectedHeap::fired_fake_oom()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 // The current compile received a fake OOM during compilation so
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 // go ahead and exit the VM since the test apparently succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 tty->print_cr("*** Shutting down VM after successful fake OOM");
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 vm_exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1895
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // ------------------------------------------------------------------
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1897 // CompileBroker::handle_full_code_cache
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1898 //
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1899 // The CodeCache is full. Print out warning and disable compilation or
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1900 // try code cache cleaning so compilation can continue later.
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1901 void CompileBroker::handle_full_code_cache() {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1902 UseInterpreter = true;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1903 if (UseCompiler || AlwaysCompileLoopMethods ) {
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
1904 if (xtty != NULL) {
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1905 ResourceMark rm;
2482
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
1906 stringStream s;
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
1907 // 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
1908 // 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
1909 CodeCache::log_state(&s);
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
1910 // Lock to prevent tearing
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
1911 ttyLocker ttyl;
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
1912 xtty->begin_elem("code_cache_full");
2482
dbccacb79c63 7036236: VM crashes assert((!inside_attrs()) || is_error_reported()) failed ...
iveresov
parents: 2447
diff changeset
1913 xtty->print(s.as_string());
1728
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
1914 xtty->stamp();
a62d332029cf 6976372: # assert(_owner == Thread::current()) failed: invariant
never
parents: 1692
diff changeset
1915 xtty->end_elem();
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1916 }
1578
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
1917 warning("CodeCache is full. Compiler has been disabled.");
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
1918 warning("Try increasing the code cache size using -XX:ReservedCodeCacheSize=");
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
1919 #ifndef PRODUCT
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1920 if (CompileTheWorld || ExitOnFullCodeCache) {
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1921 codecache_print(/* detailed= */ true);
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1922 before_exit(JavaThread::current());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1923 exit_globals(); // will delete tty
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1924 vm_direct_exit(CompileTheWorld ? 0 : 1);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1925 }
1578
ca3dceda776c 6930994: Code cache is full warning should be visible in product
never
parents: 1538
diff changeset
1926 #endif
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1927 if (UseCodeCacheFlushing) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1928 NMethodSweeper::handle_full_code_cache(true);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1929 } else {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1930 UseCompiler = false;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1931 AlwaysCompileLoopMethods = false;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1932 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1933 }
7595
9deda4d8e126 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 7409
diff changeset
1934 codecache_print(/* detailed= */ true);
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1935 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1936
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1131
diff changeset
1937 // ------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // CompileBroker::set_last_compile
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 // Record this compilation for debugging purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 char* method_name = method->name()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 strncpy(_last_method_compiled, method_name, CompileBroker::name_buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 char current_method[CompilerCounters::cmname_buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 size_t maxLen = CompilerCounters::cmname_buffer_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
1947
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 if (UsePerfData) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1949 const char* class_name = method->method_holder()->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1950
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 size_t s1len = strlen(class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 size_t s2len = strlen(method_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1953
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 // check if we need to truncate the string
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 if (s1len + s2len + 2 > maxLen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 // the strategy is to lop off the leading characters of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // class name and the trailing characters of the method name.
a61af66fc99e Initial load
duke
parents:
diff changeset
1959
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 if (s2len + 2 > maxLen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 // lop of the entire class name string, let snprintf handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 // truncation of the method name.
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 class_name += s1len; // null string
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 // lop off the extra characters from the front of the class name
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 class_name += ((s1len + s2len + 2) - maxLen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 jio_snprintf(current_method, maxLen, "%s %s", class_name, method_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1973
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 if (CICountOSR && is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 _last_compile_type = osr_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 _last_compile_type = normal_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 _last_compile_level = comp_level;
a61af66fc99e Initial load
duke
parents:
diff changeset
1980
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 CompilerCounters* counters = thread->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 counters->set_current_method(current_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 counters->set_compile_type((jlong)_last_compile_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1987
a61af66fc99e Initial load
duke
parents:
diff changeset
1988
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 // CompileBroker::push_jni_handle_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 // Push on a new block of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 void CompileBroker::push_jni_handle_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1995
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 // Allocate a new block for JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 // Inlined code from jni_PushLocalFrame()
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 JNIHandleBlock* java_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 compile_handles->set_pop_frame_link(java_handles); // make sure java handles get gc'd.
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 thread->set_active_handles(compile_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 // CompileBroker::pop_jni_handle_block
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 // Pop off the current block of JNI handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 void CompileBroker::pop_jni_handle_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2012
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 // Release our JNI handle block
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 JNIHandleBlock* compile_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 thread->set_active_handles(java_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 compile_handles->set_pop_frame_link(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 JNIHandleBlock::release_block(compile_handles, thread); // may block
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2020
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 // CompileBroker::check_break_at
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 // Should the compilation break at the current compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 bool CompileBroker::check_break_at(methodHandle method, int compile_id, bool is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 if (CICountOSR && is_osr && (compile_id == CIBreakAtOSR)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 } else if( CompilerOracle::should_break_at(method) ) { // break when compiling
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 return (compile_id == CIBreakAt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2035
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 // CompileBroker::collect_statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 // Collect statistics about the compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time, CompileTask* task) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 bool success = task->is_success();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2043 methodHandle method (thread, task->method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 uint compile_id = task->compile_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 bool is_osr = (task->osr_bci() != standard_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 nmethod* code = task->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 CompilerCounters* counters = thread->counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
2048
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 assert(code == NULL || code->is_locked_by_vm(), "will survive the MutexLocker");
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 MutexLocker locker(CompileStatistics_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // _perf variables are production performance counters which are
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // updated regardless of the setting of the CITime and CITimeEach flags
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 if (!success) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 _total_bailout_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 _perf_last_failed_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 _perf_last_failed_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 _perf_total_bailout_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 } else if (code == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 _perf_last_invalidated_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 _perf_last_invalidated_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 _perf_total_invalidated_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 _total_invalidated_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 // Compilation succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // update compilation ticks - used by the implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // java.lang.management.CompilationMBean
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 _perf_total_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2075
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 _t_total_compilation.add(time);
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 _t_osr_compilation.add(time);
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 _sum_osr_bytes_compiled += method->code_size() + task->num_inlined_bytecodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 _t_standard_compilation.add(time);
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 _sum_standard_bytes_compiled += method->code_size() + task->num_inlined_bytecodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2086
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 // save the name of the last method compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 _perf_last_method->set_value(counters->current_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 _perf_last_compile_type->set_value(counters->compile_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 _perf_last_compile_size->set_value(method->code_size() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 _perf_osr_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 _perf_sum_osr_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 _perf_standard_compilation->inc(time.ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 _perf_sum_standard_bytes_compiled->inc(method->code_size() + task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2101
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 if (CITimeEach) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 float bytes_per_sec = 1.0 * (method->code_size() + task->num_inlined_bytecodes()) / time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 tty->print_cr("%3d seconds: %f bytes/sec : %f (bytes %d + %d inlined)",
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 compile_id, time.seconds(), bytes_per_sec, method->code_size(), task->num_inlined_bytecodes());
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2107
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 // Collect counts of successful compilations
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2109 _sum_nmethod_size += code->total_size();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2110 _sum_nmethod_code_size += code->insts_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 _total_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2112
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 if (UsePerfData) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2114 _perf_sum_nmethod_size->inc( code->total_size());
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1728
diff changeset
2115 _perf_sum_nmethod_code_size->inc(code->insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 _perf_total_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2118
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 if (is_osr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 if (UsePerfData) _perf_total_osr_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 _total_osr_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 if (UsePerfData) _perf_total_standard_compile_count->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 _total_standard_compile_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 // set the current method for the thread to null
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 if (UsePerfData) counters->set_current_method("");
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2130
a61af66fc99e Initial load
duke
parents:
diff changeset
2131
a61af66fc99e Initial load
duke
parents:
diff changeset
2132
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 void CompileBroker::print_times() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 tty->print_cr("Accumulated compiler times (for compiled methods only)");
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 tty->print_cr("------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 //0000000000111111111122222222223333333333444444444455555555556666666666
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 //0123456789012345678901234567890123456789012345678901234567890123456789
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 tty->print_cr(" Total compilation time : %6.3f s", CompileBroker::_t_total_compilation.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 tty->print_cr(" Standard compilation : %6.3f s, Average : %2.3f",
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 CompileBroker::_t_standard_compilation.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 CompileBroker::_t_standard_compilation.seconds() / CompileBroker::_total_standard_compile_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 tty->print_cr(" On stack replacement : %6.3f s, Average : %2.3f", CompileBroker::_t_osr_compilation.seconds(), CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
1131
40e7c1d24e4a 6909153: Fix broken options on Zero
twisti
parents: 844
diff changeset
2144
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2145 if (compiler(CompLevel_simple) != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2146 compiler(CompLevel_simple)->print_timers();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2148 if (compiler(CompLevel_full_optimization) != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2149 compiler(CompLevel_full_optimization)->print_timers();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
2150 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 int tcb = CompileBroker::_sum_osr_bytes_compiled + CompileBroker::_sum_standard_bytes_compiled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 tty->print_cr(" Total compiled bytecodes : %6d bytes", tcb);
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 tty->print_cr(" Standard compilation : %6d bytes", CompileBroker::_sum_standard_bytes_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 tty->print_cr(" On stack replacement : %6d bytes", CompileBroker::_sum_osr_bytes_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 int bps = (int)(tcb / CompileBroker::_t_total_compilation.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 tty->print_cr(" Average compilation speed: %6d bytes/s", bps);
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 tty->print_cr(" nmethod code size : %6d bytes", CompileBroker::_sum_nmethod_code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 tty->print_cr(" nmethod total size : %6d bytes", CompileBroker::_sum_nmethod_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // Debugging output for failure
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 void CompileBroker::print_last_compile() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 if ( _last_compile_level != CompLevel_none &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 compiler(_last_compile_level) != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 _last_method_compiled != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 _last_compile_type != no_compile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 if (_last_compile_type == osr_compile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 tty->print_cr("Last parse: [osr]%d+++(%d) %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 _osr_compilation_id, _last_compile_level, _last_method_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 tty->print_cr("Last parse: %d+++(%d) %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 _compilation_id, _last_compile_level, _last_method_compiled);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179
a61af66fc99e Initial load
duke
parents:
diff changeset
2180
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 void CompileBroker::print_compiler_threads_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 st->print_cr("Compiler thread printing unimplemented.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 }