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); |