< prev index next >

src/hotspot/share/jvmci/jvmciCodeInstaller.cpp

Print this page
rev 49736 : 8185505: AArch64: Port AOT to AArch64
Reviewed-by: duke


 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,


< prev index next >