14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "c1/c1_Compilation.hpp"
27 #include "c1/c1_Compiler.hpp"
28 #include "c1/c1_FrameMap.hpp"
29 #include "c1/c1_GraphBuilder.hpp"
30 #include "c1/c1_LinearScan.hpp"
31 #include "c1/c1_MacroAssembler.hpp"
32 #include "c1/c1_Runtime1.hpp"
33 #include "c1/c1_ValueType.hpp"
34 #include "compiler/compileBroker.hpp"
35 #include "compiler/compilerDirectives.hpp"
36 #include "interpreter/linkResolver.hpp"
37 #include "jfr/support/jfrIntrinsics.hpp"
38 #include "memory/allocation.hpp"
39 #include "memory/allocation.inline.hpp"
40 #include "memory/resourceArea.hpp"
41 #include "runtime/interfaceSupport.inline.hpp"
42 #include "runtime/sharedRuntime.hpp"
43 #include "runtime/vm_version.hpp"
44 #include "utilities/bitMap.inline.hpp"
45 #include "utilities/macros.hpp"
46
47
48 Compiler::Compiler() : AbstractCompiler(compiler_c1) {
49 }
50
51 void Compiler::init_c1_runtime() {
52 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
53 Runtime1::initialize(buffer_blob);
54 FrameMap::initialize();
55 // initialize data structures
56 ValueType::initialize();
57 GraphBuilder::initialize();
58 // note: to use more than one instance of LinearScan at a time this function call has to
59 // be moved somewhere outside of this constructor:
60 Interval::initialize();
61 }
62
63
64 void Compiler::initialize() {
65 // Buffer blob must be allocated per C1 compiler thread at startup
66 BufferBlob* buffer_blob = init_buffer_blob();
67
68 if (should_perform_init()) {
69 if (buffer_blob == nullptr) {
70 // When we come here we are in state 'initializing'; entire C1 compilation
71 // can be shut down.
72 set_state(failed);
73 } else {
235 case vmIntrinsics::_getCharStringU:
236 case vmIntrinsics::_putCharStringU:
237 #ifdef JFR_HAVE_INTRINSICS
238 case vmIntrinsics::_counterTime:
239 #endif
240 case vmIntrinsics::_getObjectSize:
241 #if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV) || defined(PPC64)
242 case vmIntrinsics::_clone:
243 #endif
244 break;
245 case vmIntrinsics::_blackhole:
246 break;
247 default:
248 return false; // Intrinsics not on the previous list are not available.
249 }
250
251 return true;
252 }
253
254 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci, bool install_code, DirectiveSet* directive) {
255 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
256 assert(buffer_blob != nullptr, "Must exist");
257 // invoke compilation
258 {
259 // We are nested here because we need for the destructor
260 // of Compilation to occur before we release the any
261 // competing compiler thread
262 ResourceMark rm;
263 Compilation c(this, env, method, entry_bci, buffer_blob, install_code, directive);
264 }
265 }
266
267
268 void Compiler::print_timers() {
269 Compilation::print_timers();
270 }
|
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "c1/c1_Compilation.hpp"
27 #include "c1/c1_Compiler.hpp"
28 #include "c1/c1_FrameMap.hpp"
29 #include "c1/c1_GraphBuilder.hpp"
30 #include "c1/c1_LinearScan.hpp"
31 #include "c1/c1_MacroAssembler.hpp"
32 #include "c1/c1_Runtime1.hpp"
33 #include "c1/c1_ValueType.hpp"
34 #include "code/SCCache.hpp"
35 #include "compiler/compileBroker.hpp"
36 #include "compiler/compilerDirectives.hpp"
37 #include "interpreter/linkResolver.hpp"
38 #include "jfr/support/jfrIntrinsics.hpp"
39 #include "memory/allocation.hpp"
40 #include "memory/allocation.inline.hpp"
41 #include "memory/resourceArea.hpp"
42 #include "runtime/interfaceSupport.inline.hpp"
43 #include "runtime/sharedRuntime.hpp"
44 #include "runtime/vm_version.hpp"
45 #include "utilities/bitMap.inline.hpp"
46 #include "utilities/macros.hpp"
47
48
49 Compiler::Compiler() : AbstractCompiler(compiler_c1) {
50 }
51
52 void Compiler::init_c1_runtime() {
53 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
54 Runtime1::initialize(buffer_blob);
55 SCCache::init_c1_table();
56 FrameMap::initialize();
57 // initialize data structures
58 ValueType::initialize();
59 GraphBuilder::initialize();
60 // note: to use more than one instance of LinearScan at a time this function call has to
61 // be moved somewhere outside of this constructor:
62 Interval::initialize();
63 }
64
65
66 void Compiler::initialize() {
67 // Buffer blob must be allocated per C1 compiler thread at startup
68 BufferBlob* buffer_blob = init_buffer_blob();
69
70 if (should_perform_init()) {
71 if (buffer_blob == nullptr) {
72 // When we come here we are in state 'initializing'; entire C1 compilation
73 // can be shut down.
74 set_state(failed);
75 } else {
237 case vmIntrinsics::_getCharStringU:
238 case vmIntrinsics::_putCharStringU:
239 #ifdef JFR_HAVE_INTRINSICS
240 case vmIntrinsics::_counterTime:
241 #endif
242 case vmIntrinsics::_getObjectSize:
243 #if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV) || defined(PPC64)
244 case vmIntrinsics::_clone:
245 #endif
246 break;
247 case vmIntrinsics::_blackhole:
248 break;
249 default:
250 return false; // Intrinsics not on the previous list are not available.
251 }
252
253 return true;
254 }
255
256 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci, bool install_code, DirectiveSet* directive) {
257 CompileTask* task = env->task();
258 if (install_code && task->is_scc()) {
259 assert(!task->preload(), "Pre-loading cached code is not implemeted for C1 code");
260 bool success = SCCache::load_nmethod(env, method, entry_bci, this, CompLevel(task->comp_level()));
261 if (success) {
262 assert(task->is_success(), "sanity");
263 return;
264 }
265 SCCache::invalidate(task->scc_entry()); // mark scc_entry as not entrant
266 if (SCCache::is_code_load_thread_on() && !StoreCachedCode) {
267 // Bail out if failed to load cached code in SC thread
268 // unless the code is updating.
269 env->record_failure("Failed to load cached code");
270 return;
271 }
272 task->clear_scc();
273 }
274 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
275 assert(buffer_blob != nullptr, "Must exist");
276 // invoke compilation
277 {
278 // We are nested here because we need for the destructor
279 // of Compilation to occur before we release the any
280 // competing compiler thread
281 ResourceMark rm;
282 Compilation c(this, env, method, entry_bci, buffer_blob, install_code, directive);
283 }
284 }
285
286
287 void Compiler::print_timers() {
288 Compilation::print_timers();
289 }
|