< prev index next >

src/share/vm/jvmci/jvmciCodeInstaller.cpp

Print this page




 458   if (_buffer != NULL) {
 459     return (address) _buffer;
 460   }
 461   return (address) _static_buffer;
 462 }
 463 
 464 void RelocBuffer::set_size(size_t bytes) {
 465   assert(bytes <= _size, "can't grow in size!");
 466   _size = bytes;
 467 }
 468 
 469 void RelocBuffer::ensure_size(size_t bytes) {
 470   assert(_buffer == NULL, "can only be used once");
 471   assert(_size == 0, "can only be used once");
 472   if (bytes >= RelocBuffer::stack_size) {
 473     _buffer = NEW_C_HEAP_ARRAY(char, bytes, mtInternal);
 474   }
 475   _size = bytes;
 476 }
 477 
 478 JVMCIEnv::CodeInstallResult CodeInstaller::gather_metadata(Handle target, Handle& compiled_code, CodeMetadata& metadata, TRAPS) {
 479   CodeBuffer buffer("JVMCI Compiler CodeBuffer for Metadata");
 480   jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
 481   initialize_dependencies(JNIHandles::resolve(compiled_code_obj), NULL, CHECK_OK);
 482 
 483   // Get instructions and constants CodeSections early because we need it.
 484   _instructions = buffer.insts();
 485   _constants = buffer.consts();
 486 
 487   initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
 488   JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK);
 489   if (result != JVMCIEnv::ok) {
 490     return result;
 491   }
 492   process_exception_handlers();
 493 
 494   _debug_recorder->pcs_size(); // ehm, create the sentinel record
 495 
 496   assert(_debug_recorder->pcs_length() >= 2, "must be at least 2");
 497 
 498   metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length());
 499   metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size());
 500   metadata.set_exception_table(&_exception_handler_table);
 501 
 502   RelocBuffer* reloc_buffer = metadata.get_reloc_buffer();
 503 
 504   reloc_buffer->ensure_size(buffer.total_relocation_size());
 505   size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true);
 506   reloc_buffer->set_size(size);
 507   return JVMCIEnv::ok;
 508 }
 509 
 510 // constructor used to create a method
 511 JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle& compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS) {
 512   CodeBuffer buffer("JVMCI Compiler CodeBuffer");
 513   jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
 514   OopRecorder* recorder = new OopRecorder(&_arena, true);
 515   initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
 516 
 517   // Get instructions and constants CodeSections early because we need it.
 518   _instructions = buffer.insts();
 519   _constants = buffer.consts();
 520 
 521   initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
 522   JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK);
 523   if (result != JVMCIEnv::ok) {
 524     return result;
 525   }
 526   process_exception_handlers();
 527 
 528   int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
 529 
 530   if (!compiled_code->is_a(HotSpotCompiledNmethod::klass())) {
 531     oop stubName = HotSpotCompiledCode::name(compiled_code_obj);




 458   if (_buffer != NULL) {
 459     return (address) _buffer;
 460   }
 461   return (address) _static_buffer;
 462 }
 463 
 464 void RelocBuffer::set_size(size_t bytes) {
 465   assert(bytes <= _size, "can't grow in size!");
 466   _size = bytes;
 467 }
 468 
 469 void RelocBuffer::ensure_size(size_t bytes) {
 470   assert(_buffer == NULL, "can only be used once");
 471   assert(_size == 0, "can only be used once");
 472   if (bytes >= RelocBuffer::stack_size) {
 473     _buffer = NEW_C_HEAP_ARRAY(char, bytes, mtInternal);
 474   }
 475   _size = bytes;
 476 }
 477 
 478 JVMCIEnv::CodeInstallResult CodeInstaller::gather_metadata(Handle target, Handle compiled_code, CodeMetadata& metadata, TRAPS) {
 479   CodeBuffer buffer("JVMCI Compiler CodeBuffer for Metadata");
 480   jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
 481   initialize_dependencies(JNIHandles::resolve(compiled_code_obj), NULL, CHECK_OK);
 482 
 483   // Get instructions and constants CodeSections early because we need it.
 484   _instructions = buffer.insts();
 485   _constants = buffer.consts();
 486 
 487   initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
 488   JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK);
 489   if (result != JVMCIEnv::ok) {
 490     return result;
 491   }
 492   process_exception_handlers();
 493 
 494   _debug_recorder->pcs_size(); // ehm, create the sentinel record
 495 
 496   assert(_debug_recorder->pcs_length() >= 2, "must be at least 2");
 497 
 498   metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length());
 499   metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size());
 500   metadata.set_exception_table(&_exception_handler_table);
 501 
 502   RelocBuffer* reloc_buffer = metadata.get_reloc_buffer();
 503 
 504   reloc_buffer->ensure_size(buffer.total_relocation_size());
 505   size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true);
 506   reloc_buffer->set_size(size);
 507   return JVMCIEnv::ok;
 508 }
 509 
 510 // constructor used to create a method
 511 JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Handle target, Handle compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log, TRAPS) {
 512   CodeBuffer buffer("JVMCI Compiler CodeBuffer");
 513   jobject compiled_code_obj = JNIHandles::make_local(compiled_code());
 514   OopRecorder* recorder = new OopRecorder(&_arena, true);
 515   initialize_dependencies(JNIHandles::resolve(compiled_code_obj), recorder, CHECK_OK);
 516 
 517   // Get instructions and constants CodeSections early because we need it.
 518   _instructions = buffer.insts();
 519   _constants = buffer.consts();
 520 
 521   initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
 522   JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK);
 523   if (result != JVMCIEnv::ok) {
 524     return result;
 525   }
 526   process_exception_handlers();
 527 
 528   int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
 529 
 530   if (!compiled_code->is_a(HotSpotCompiledNmethod::klass())) {
 531     oop stubName = HotSpotCompiledCode::name(compiled_code_obj);


< prev index next >