574 void RelocBuffer::ensure_size(size_t bytes) {
575 assert(_buffer == NULL, "can only be used once");
576 assert(_size == 0, "can only be used once");
577 if (bytes >= RelocBuffer::stack_size) {
578 _buffer = NEW_C_HEAP_ARRAY(char, bytes, mtInternal);
579 }
580 _size = bytes;
581 }
582
583 JVMCIEnv::CodeInstallResult CodeInstaller::gather_metadata(Handle target, Handle compiled_code, CodeMetadata& metadata, TRAPS) {
584 CodeBuffer buffer("JVMCI Compiler CodeBuffer for Metadata");
585 jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
586 AOTOopRecorder* recorder = new AOTOopRecorder(&_arena, true);
587 initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
588
589 metadata.set_oop_recorder(recorder);
590
591 // Get instructions and constants CodeSections early because we need it.
592 _instructions = buffer.insts();
593 _constants = buffer.consts();
594
595 initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
596 JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, false, CHECK_OK);
597 if (result != JVMCIEnv::ok) {
598 return result;
599 }
600
601 _debug_recorder->pcs_size(); // create the sentinel record
602
603 assert(_debug_recorder->pcs_length() >= 2, "must be at least 2");
604
605 metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length());
606 metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size());
607 metadata.set_exception_table(&_exception_handler_table);
608
609 RelocBuffer* reloc_buffer = metadata.get_reloc_buffer();
610
611 reloc_buffer->ensure_size(buffer.total_relocation_size());
612 size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true);
613 reloc_buffer->set_size(size);
614 return JVMCIEnv::ok;
615 }
616
617 // constructor used to create a method
618 JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS) {
619 CodeBuffer buffer("JVMCI Compiler CodeBuffer");
620 jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
621 OopRecorder* recorder = new OopRecorder(&_arena, true);
622 initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
623
624 // Get instructions and constants CodeSections early because we need it.
625 _instructions = buffer.insts();
626 _constants = buffer.consts();
627
628 initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
629 JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, true, CHECK_OK);
630 if (result != JVMCIEnv::ok) {
631 return result;
632 }
633
634 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
635
636 if (!compiled_code->is_a(HotSpotCompiledNmethod::klass())) {
637 oop stubName = HotSpotCompiledCode::name(compiled_code_obj);
638 if (stubName == NULL) {
639 JVMCI_ERROR_OK("stub should have a name");
640 }
641 char* name = strdup(java_lang_String::as_utf8_string(stubName));
642 cb = RuntimeStub::new_runtime_stub(name,
643 &buffer,
644 CodeOffsets::frame_never_safe,
645 stack_slots,
646 _debug_recorder->_oopmaps,
|
574 void RelocBuffer::ensure_size(size_t bytes) {
575 assert(_buffer == NULL, "can only be used once");
576 assert(_size == 0, "can only be used once");
577 if (bytes >= RelocBuffer::stack_size) {
578 _buffer = NEW_C_HEAP_ARRAY(char, bytes, mtInternal);
579 }
580 _size = bytes;
581 }
582
583 JVMCIEnv::CodeInstallResult CodeInstaller::gather_metadata(Handle target, Handle compiled_code, CodeMetadata& metadata, TRAPS) {
584 CodeBuffer buffer("JVMCI Compiler CodeBuffer for Metadata");
585 jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
586 AOTOopRecorder* recorder = new AOTOopRecorder(&_arena, true);
587 initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
588
589 metadata.set_oop_recorder(recorder);
590
591 // Get instructions and constants CodeSections early because we need it.
592 _instructions = buffer.insts();
593 _constants = buffer.consts();
594 buffer.set_immutable_PIC(_immutable_pic_compilation);
595
596 initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
597 JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, false, CHECK_OK);
598 if (result != JVMCIEnv::ok) {
599 return result;
600 }
601
602 _debug_recorder->pcs_size(); // create the sentinel record
603
604 assert(_debug_recorder->pcs_length() >= 2, "must be at least 2");
605
606 metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length());
607 metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size());
608 metadata.set_exception_table(&_exception_handler_table);
609
610 RelocBuffer* reloc_buffer = metadata.get_reloc_buffer();
611
612 reloc_buffer->ensure_size(buffer.total_relocation_size());
613 size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true);
614 reloc_buffer->set_size(size);
615 return JVMCIEnv::ok;
616 }
617
618 // constructor used to create a method
619 JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS) {
620 CodeBuffer buffer("JVMCI Compiler CodeBuffer");
621 jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
622 OopRecorder* recorder = new OopRecorder(&_arena, true);
623 initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
624
625 // Get instructions and constants CodeSections early because we need it.
626 _instructions = buffer.insts();
627 _constants = buffer.consts();
628 buffer.set_immutable_PIC(_immutable_pic_compilation);
629
630 initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
631 JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, true, CHECK_OK);
632 if (result != JVMCIEnv::ok) {
633 return result;
634 }
635
636 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
637
638 if (!compiled_code->is_a(HotSpotCompiledNmethod::klass())) {
639 oop stubName = HotSpotCompiledCode::name(compiled_code_obj);
640 if (stubName == NULL) {
641 JVMCI_ERROR_OK("stub should have a name");
642 }
643 char* name = strdup(java_lang_String::as_utf8_string(stubName));
644 cb = RuntimeStub::new_runtime_stub(name,
645 &buffer,
646 CodeOffsets::frame_never_safe,
647 stack_slots,
648 _debug_recorder->_oopmaps,
|