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