Mercurial > hg > graal-compiler
diff src/share/vm/c1x/c1x_CodeInstaller.cpp @ 1432:b61a43cd1255
sourcecode formatting
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 01 Sep 2010 17:13:38 -0700 |
parents | abc670a709dc |
children | efba53f86c4f |
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_CodeInstaller.cpp Wed Sep 01 16:43:47 2010 -0700 +++ b/src/share/vm/c1x/c1x_CodeInstaller.cpp Wed Sep 01 17:13:38 2010 -0700 @@ -22,15 +22,15 @@ * */ - # include "incls/_precompiled.incl" # include "incls/_c1x_CodeInstaller.cpp.incl" #define C1X_REGISTER_COUNT 32 +// convert c1x register indices (as used in oop maps) to hotspot registers VMReg get_hotspot_reg(jint c1x_reg) { Register cpu_registers[] = { rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15 }; - XMMRegister xmm_registers[] = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 }; + XMMRegister xmm_registers[] = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 }; if (c1x_reg < 16) { return cpu_registers[c1x_reg]->as_VMReg(); @@ -38,16 +38,16 @@ assert(c1x_reg < C1X_REGISTER_COUNT, "invalid register number"); return xmm_registers[c1x_reg - 16]->as_VMReg(); } - } +// creates a hotspot oop map out of the byte arrays provided by CiDebugInfo static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) { OopMap* map = new OopMap(frame_size, parameter_count); - arrayOop register_map = (arrayOop)CiDebugInfo::registerRefMap(debug_info); - arrayOop frame_map = (arrayOop)CiDebugInfo::frameRefMap(debug_info); + arrayOop register_map = (arrayOop) CiDebugInfo::registerRefMap(debug_info); + arrayOop frame_map = (arrayOop) CiDebugInfo::frameRefMap(debug_info); - for (jint i=0; i<C1X_REGISTER_COUNT; i++) { - unsigned char byte = ((unsigned char*)register_map->base(T_BYTE))[i / 8]; + for (jint i = 0; i < C1X_REGISTER_COUNT; i++) { + unsigned char byte = ((unsigned char*) register_map->base(T_BYTE))[i / 8]; bool is_oop = (byte & (1 << (i % 8))) != 0; VMReg reg = get_hotspot_reg(i); if (is_oop) { @@ -57,8 +57,8 @@ } } - for (jint i=0; i<frame_size; i++) { - unsigned char byte = ((unsigned char*)frame_map->base(T_BYTE))[i / 8]; + for (jint i = 0; i < frame_size; i++) { + unsigned char byte = ((unsigned char*) frame_map->base(T_BYTE))[i / 8]; bool is_oop = (byte & (1 << (i % 8))) != 0; VMReg reg = VMRegImpl::stack2reg(i); if (is_oop) { @@ -72,6 +72,7 @@ return map; } +// TODO: finish this - c1x doesn't provide any scope values at the moment static ScopeValue* get_hotspot_value(oop value) { fatal("not implemented"); if (value->is_a(CiRegisterValue::klass())) { @@ -85,7 +86,6 @@ } } - // constructor used to create a method CodeInstaller::CodeInstaller(oop target_method) { VM_ENTRY_MARK; @@ -100,7 +100,7 @@ _offsets.set_value(CodeOffsets::Deopt, 0); methodOop method = VmIds::get<methodOop>(HotSpotMethodResolved::vmId(_hotspot_method)); - ciMethod *ciMethodObject = (ciMethod *)_env->get_object(method); + ciMethod *ciMethodObject = (ciMethod *) _env->get_object(method); _parameter_count = method->size_of_parameters(); // (very) conservative estimate: each site needs a relocation @@ -108,20 +108,10 @@ initialize_buffer(buffer); process_exception_handlers(); { - ThreadToNativeFromVM t((JavaThread*)THREAD); - _env->register_method(ciMethodObject, - -1, - &_offsets, - 0, - &buffer, - (_frame_size / HeapWordSize) + 2, // conversion to words, need to add two slots for ret address and frame pointer - _debug_recorder->_oopmaps, - &_exception_handler_table, - &_implicit_exception_table, - C1XCompiler::instance(), - _env->comp_level(), - false, - false); + int stack_slots = (_frame_size / HeapWordSize) + 2; // conversion to words, need to add two slots for ret address and frame pointer + ThreadToNativeFromVM t((JavaThread*) THREAD); + _env->register_method(ciMethodObject, -1, &_offsets, 0, &buffer, stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, + &_implicit_exception_table, C1XCompiler::instance(), _env->comp_level(), false, false); } } @@ -138,8 +128,8 @@ initialize_buffer(buffer); const char* cname = java_lang_String::as_utf8_string(_name); - BufferBlob* blob = BufferBlob::create(strdup(cname), &buffer); // this is leaking strings... but only a limited number of stubs will be created - IF_TRACE_C1X_3 Disassembler::decode((CodeBlob*)blob); + BufferBlob* blob = BufferBlob::create(strdup(cname), &buffer); // this is leaking strings... but only a limited number of stubs will be created + IF_TRACE_C1X_3 Disassembler::decode((CodeBlob*) blob); id = VmIds::addStub(blob->instructions_begin()); } @@ -147,10 +137,10 @@ _citarget_method = HotSpotTargetMethod::targetMethod(target_method); _hotspot_method = HotSpotTargetMethod::method(target_method); _name = HotSpotTargetMethod::name(target_method); - _sites = (arrayOop)HotSpotTargetMethod::sites(target_method); - _exception_handlers = (arrayOop)HotSpotTargetMethod::exceptionHandlers(target_method); + _sites = (arrayOop) HotSpotTargetMethod::sites(target_method); + _exception_handlers = (arrayOop) HotSpotTargetMethod::exceptionHandlers(target_method); - _code = (arrayOop)CiTargetMethod::targetCode(_citarget_method); + _code = (arrayOop) CiTargetMethod::targetCode(_citarget_method); _code_size = CiTargetMethod::targetCodeSize(_citarget_method); _frame_size = CiTargetMethod::frameSize(_citarget_method); @@ -182,8 +172,8 @@ memcpy(_instructions->start(), _code->base(T_BYTE), _code_size); _instructions->set_end(_instructions->start() + _code_size); - oop* sites = (oop*)_sites->base(T_OBJECT); - for (int i=0; i<_sites->length(); i++) { + oop* sites = (oop*) _sites->base(T_OBJECT); + for (int i = 0; i < _sites->length(); i++) { oop site = sites[i]; jint pc_offset = CiTargetMethod_Site::pcOffset(site); @@ -208,17 +198,17 @@ void CodeInstaller::process_exception_handlers() { // allocate some arrays for use by the collection code. const int num_handlers = 5; - GrowableArray<intptr_t>* bcis = new GrowableArray<intptr_t>(num_handlers); - GrowableArray<intptr_t>* scope_depths = new GrowableArray<intptr_t>(num_handlers); - GrowableArray<intptr_t>* pcos = new GrowableArray<intptr_t>(num_handlers); + GrowableArray<intptr_t>* bcis = new GrowableArray<intptr_t> (num_handlers); + GrowableArray<intptr_t>* scope_depths = new GrowableArray<intptr_t> (num_handlers); + GrowableArray<intptr_t>* pcos = new GrowableArray<intptr_t> (num_handlers); if (_exception_handlers != NULL) { - oop* exception_handlers = (oop*)_exception_handlers->base(T_OBJECT); - for (int i=0; i<_exception_handlers->length(); i++) { + oop* exception_handlers = (oop*) _exception_handlers->base(T_OBJECT); + for (int i = 0; i < _exception_handlers->length(); i++) { jint pc_offset = CiTargetMethod_Site::pcOffset(exception_handlers[i]); int start = i; - while ((i + 1)<_exception_handlers->length() && CiTargetMethod_Site::pcOffset(exception_handlers[i + 1]) == pc_offset) - i ++; + while ((i + 1) < _exception_handlers->length() && CiTargetMethod_Site::pcOffset(exception_handlers[i + 1]) == pc_offset) + i++; // empty the arrays bcis->trunc_to(0); @@ -256,23 +246,22 @@ pcos->append(handler_offset); // stop processing once we hit a catch any -// if (handler->is_catch_all()) { -// assert(i == handlers->length() - 1, "catch all must be last handler"); -// } + // if (handler->is_catch_all()) { + // assert(i == handlers->length() - 1, "catch all must be last handler"); + // } } _exception_handler_table.add_subtable(pc_offset, bcis, scope_depths, pcos); } } - } -void CodeInstaller::record_frame(jint pc_offset, oop code_pos, oop frame) { +void CodeInstaller::record_scope(jint pc_offset, oop code_pos, oop frame) { oop caller_pos = CiCodePos::caller(code_pos); if (caller_pos != NULL) { oop caller_frame = CiDebugInfo_Frame::caller(frame); - record_frame(pc_offset, caller_pos, caller_frame); + record_scope(pc_offset, caller_pos, caller_frame); } else { assert(frame == NULL || CiDebugInfo_Frame::caller(frame) == NULL, "unexpected layout - mismatching nesting of Frame and CiCodePos"); } @@ -282,24 +271,24 @@ oop hotspot_method = CiCodePos::method(code_pos); assert(hotspot_method != NULL && hotspot_method->is_a(HotSpotMethodResolved::klass()), "unexpected hotspot method"); methodOop method = VmIds::get<methodOop>(HotSpotMethodResolved::vmId(hotspot_method)); - ciMethod *cimethod = (ciMethod *)_env->get_object(method); + ciMethod *cimethod = (ciMethod *) _env->get_object(method); jint bci = CiCodePos::bci(code_pos); if (frame != NULL) { jint local_count = CiDebugInfo_Frame::numLocals(frame); jint expression_count = CiDebugInfo_Frame::numStack(frame); jint monitor_count = CiDebugInfo_Frame::numLocks(frame); - arrayOop values = (arrayOop)CiDebugInfo_Frame::values(frame); + arrayOop values = (arrayOop) CiDebugInfo_Frame::values(frame); assert(local_count + expression_count + monitor_count == values->length(), "unexpected values length"); assert(monitor_count == 0, "monitors not supported"); - GrowableArray<ScopeValue*>* locals = new GrowableArray<ScopeValue*>(); - GrowableArray<ScopeValue*>* expressions = new GrowableArray<ScopeValue*>(); - GrowableArray<MonitorValue*>* monitors = new GrowableArray<MonitorValue*>(); + GrowableArray<ScopeValue*>* locals = new GrowableArray<ScopeValue*> (); + GrowableArray<ScopeValue*>* expressions = new GrowableArray<ScopeValue*> (); + GrowableArray<MonitorValue*>* monitors = new GrowableArray<MonitorValue*> (); - for (jint i=0; i<values->length(); i++) { - ScopeValue* value = get_hotspot_value(((oop*)values->base(T_OBJECT))[i]); + for (jint i = 0; i < values->length(); i++) { + ScopeValue* value = get_hotspot_value(((oop*) values->base(T_OBJECT))[i]); if (i < local_count) { locals->append(value); @@ -320,18 +309,17 @@ } } - void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, oop site) { oop debug_info = CiTargetMethod_Safepoint::debugInfo(site); assert(debug_info != NULL, "debug info expected"); -// address instruction = _instructions->start() + pc_offset; -// jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start(); + // address instruction = _instructions->start() + pc_offset; + // jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start(); _debug_recorder->add_safepoint(pc_offset, create_oop_map(_frame_size, _parameter_count, debug_info)); oop code_pos = CiDebugInfo::codePos(debug_info); oop frame = CiDebugInfo::frame(debug_info); - record_frame(pc_offset, code_pos, frame); + record_scope(pc_offset, code_pos, frame); _debug_recorder->end_safepoint(pc_offset); } @@ -343,8 +331,8 @@ oop global_stub = CiTargetMethod_Call::globalStubID(site); oop debug_info = CiTargetMethod_Call::debugInfo(site); - arrayOop stack_map = (arrayOop)CiTargetMethod_Call::stackMap(site); - arrayOop register_map = (arrayOop)CiTargetMethod_Call::registerMap(site); + arrayOop stack_map = (arrayOop) CiTargetMethod_Call::stackMap(site); + arrayOop register_map = (arrayOop) CiTargetMethod_Call::registerMap(site); assert((runtime_call ? 1 : 0) + (hotspot_method ? 1 : 0) + (symbol ? 1 : 0) + (global_stub ? 1 : 0) == 1, "Call site needs exactly one type"); @@ -355,7 +343,7 @@ _debug_recorder->add_safepoint(next_pc_offset, create_oop_map(_frame_size, _parameter_count, debug_info)); oop code_pos = CiDebugInfo::codePos(debug_info); oop frame = CiDebugInfo::frame(debug_info); - record_frame(next_pc_offset, code_pos, frame); + record_scope(next_pc_offset, code_pos, frame); } if (runtime_call != NULL) { @@ -386,13 +374,12 @@ assert(debug_info != NULL, "debug info expected"); methodOop method = NULL; - if (hotspot_method->is_a(HotSpotMethodResolved::klass())) - method = VmIds::get<methodOop>(HotSpotMethodResolved::vmId(hotspot_method)); + if (hotspot_method->is_a(HotSpotMethodResolved::klass())) method = VmIds::get<methodOop>(HotSpotMethodResolved::vmId(hotspot_method)); assert(debug_info != NULL, "debug info expected"); TRACE_C1X_3("method call"); - switch(_next_call_type) { + switch (_next_call_type) { case MARK_INVOKEVIRTUAL: case MARK_INVOKEINTERFACE: { assert(method == NULL || !method->is_static(), "cannot call static method with invokeinterface"); @@ -417,7 +404,7 @@ } case MARK_INVOKE_INVALID: default: - ShouldNotReachHere(); + fatal("invalid _next_call_type value") break; } } @@ -433,13 +420,14 @@ address instruction = _instructions->start() + pc_offset; - switch(CiKind::typeChar(kind)) { + switch (CiKind::typeChar(kind)) { case 'z': case 'b': case 's': case 'c': case 'i': - fatal("int-sized values not expected in DataPatch"); + fatal("int-sized values not expected in DataPatch") + ; break; case 'f': case 'l': @@ -448,14 +436,14 @@ address next_instruction = Assembler::locate_next_instruction(instruction); // we don't care if this is a long/double/etc., the primitive field contains the right bits address dest = _constants->end(); - *(jlong*)dest = CiConstant::primitive(constant); + *(jlong*) dest = CiConstant::primitive(constant); _constants->set_end(dest + BytesPerLong); long disp = dest - next_instruction; assert(disp == (jint) disp, "disp doesn't fit in 32 bits"); - *((jint*)operand) = (jint)disp; + *((jint*) operand) = (jint) disp; - _instructions->relocate(instruction, section_word_Relocation::spec((address)dest, CodeBuffer::SECT_CONSTS), Assembler::disp32_operand); + _instructions->relocate(instruction, section_word_Relocation::spec((address) dest, CodeBuffer::SECT_CONSTS), Assembler::disp32_operand); TRACE_C1X_3("relocating (Float/Long/Double) at %016x/%016x", instruction, operand); break; } @@ -464,7 +452,7 @@ oop obj = CiConstant::object(constant); if (obj->is_a(HotSpotTypeResolved::klass())) { - *((jobject*)operand) = JNIHandles::make_local(VmIds::get<klassOop>(HotSpotTypeResolved::vmId(obj))); + *((jobject*) operand) = JNIHandles::make_local(VmIds::get<klassOop>(HotSpotTypeResolved::vmId(obj))); _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); TRACE_C1X_3("relocating (HotSpotType) at %016x/%016x", instruction, operand); } else { @@ -476,9 +464,9 @@ address operand = Assembler::locate_operand(instruction, Assembler::imm_operand); if (id == VmIds::DUMMY_CONSTANT) { - *((jobject*)operand) = (jobject)Universe::non_oop_word(); + *((jobject*) operand) = (jobject) Universe::non_oop_word(); } else { - *((jobject*)operand) = JNIHandles::make_local(VmIds::get<oop>(id)); + *((jobject*) operand) = JNIHandles::make_local(VmIds::get<oop>(id)); } _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); TRACE_C1X_3("relocating (oop constant) at %016x/%016x", instruction, operand); @@ -486,14 +474,14 @@ break; } default: - fatal("unexpected CiKind in DataPatch"); + fatal("unexpected CiKind in DataPatch") break; } } void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, oop site) { oop id_obj = CiTargetMethod_Mark::id(site); - arrayOop references = (arrayOop)CiTargetMethod_Mark::references(site); + arrayOop references = (arrayOop) CiTargetMethod_Mark::references(site); if (id_obj != NULL) { assert(java_lang_boxing_object::is_instance(id_obj, T_INT), "Integer id expected"); @@ -519,7 +507,7 @@ break; case MARK_STATIC_CALL_STUB: { assert(references->length() == 1, "static call stub needs one reference"); - oop ref = ((oop*)references->base(T_OBJECT))[0]; + oop ref = ((oop*) references->base(T_OBJECT))[0]; address call_pc = _instructions->start() + CiTargetMethod_Site::pcOffset(ref); _instructions->relocate(instruction, static_stub_Relocation::spec(call_pc)); break; @@ -529,7 +517,7 @@ case MARK_INVOKESTATIC: case MARK_INVOKESPECIAL: case MARK_INVOKEVIRTUAL: - _next_call_type = (MarkId)id; + _next_call_type = (MarkId) id; _invoke_mark_pc = instruction; break; case MARK_IMPLICIT_NULL: @@ -543,8 +531,8 @@ assert(*byte_skip == 5, "unexpected byte_skip"); assert(references->length() == 2, "MARK_KLASS_PATCHING needs 2 references"); - oop ref1 = ((oop*)references->base(T_OBJECT))[0]; - oop ref2 = ((oop*)references->base(T_OBJECT))[1]; + oop ref1 = ((oop*) references->base(T_OBJECT))[0]; + oop ref2 = ((oop*) references->base(T_OBJECT))[1]; int i_byte_count = CiTargetMethod_Site::pcOffset(ref2) - CiTargetMethod_Site::pcOffset(ref1); assert(i_byte_count == (unsigned char)i_byte_count, "invalid offset"); *byte_count = i_byte_count; @@ -555,85 +543,14 @@ case MARK_DUMMY_OOP_RELOCATION: { _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); - RelocIterator iter(_instructions, (address)instruction, (address)(instruction + 1)); + RelocIterator iter(_instructions, (address) instruction, (address) (instruction + 1)); relocInfo::change_reloc_info_for_address(&iter, (address) instruction, relocInfo::oop_type, relocInfo::none); break; } default: - ShouldNotReachHere(); + ShouldNotReachHere() break; } } } - - -/* - if (_relocation_count > 0) { - jint* relocation_offsets = (jint*)((arrayOop)JNIHandles::resolve(_relocation_offsets))->base(T_INT); - oop* relocation_objects = (oop*)((arrayOop)JNIHandles::resolve(_relocation_data))->base(T_OBJECT); - - for (int i = 0; i < _relocation_count; i++) { - address inst = (address)instructions->start() + relocation_offsets[i]; - u_char inst_byte = *inst; - oop obj = relocation_objects[i]; - assert(obj != NULL, "NULL oop needn't be patched"); - - if (obj->is_a(SystemDictionary::HotSpotProxy_klass())) { - jlong id = com_sun_hotspot_c1x_HotSpotProxy::get_id(obj); - switch (id & VmIds::TYPE_MASK) { - case VmIds::CONSTANT: { - address operand = Assembler::locate_operand(inst, Assembler::imm_operand); - - *((jobject*)operand) = JNIHandles::make_local(VmIds::get<oop>(id)); - instructions->relocate(inst, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); - tty->print_cr("relocating (HotSpotType) %02x at %016x/%016x", inst_byte, inst, operand); - break; - } - case VmIds::STUB: { - address operand = Assembler::locate_operand(inst, Assembler::call32_operand); - - long dest = (long)VmIds::getStub(id); - long disp = dest - (long)(operand + 4); - assert(disp == (int) disp, "disp doesn't fit in 32 bits"); - *((int*)operand) = (int)disp; - - instructions->relocate(inst, runtime_call_Relocation::spec(), Assembler::call32_operand); - tty->print_cr("relocating (Long) %02x at %016x/%016x", inst_byte, inst, operand); - break; - } - } - } else if (java_lang_boxing_object::is_instance(obj)) { - address operand = Assembler::locate_operand(inst, Assembler::disp32_operand); - long dest = (long)constants->end(); - if (java_lang_boxing_object::is_instance(obj, T_LONG)) { - // tty->print("relocate: %l\n", obj->long_field(java_lang_boxing_object::value_offset_in_bytes(T_LONG))); - *(jlong*)constants->end() = obj->long_field(java_lang_boxing_object::value_offset_in_bytes(T_LONG)); - } else if (java_lang_boxing_object::is_instance(obj, T_DOUBLE)) { - // tty->print("relocate: %f\n", obj->double_field(java_lang_boxing_object::value_offset_in_bytes(T_DOUBLE))); - *(jdouble*)constants->end() = obj->double_field(java_lang_boxing_object::value_offset_in_bytes(T_DOUBLE)); - } else if (java_lang_boxing_object::is_instance(obj, T_FLOAT)) { - // tty->print("relocate: %f\n", obj->double_field(java_lang_boxing_object::value_offset_in_bytes(T_DOUBLE))); - *(jfloat*)constants->end() = obj->float_field(java_lang_boxing_object::value_offset_in_bytes(T_FLOAT)); - } - constants->set_end(constants->end() + 8); - - long disp = dest - (long)(operand + 4); - assert(disp == (int) disp, "disp doesn't fit in 32 bits"); - *((int*)operand) = (int)disp; - - instructions->relocate(inst, section_word_Relocation::spec((address)dest, CodeBuffer::SECT_CONSTS), Assembler::disp32_operand); - tty->print_cr("relocating (Long/Double) %02x at %016x/%016x", inst_byte, inst, operand); - } else if (obj->is_a(_types.HotSpotTypeResolved)) { - address operand = Assembler::locate_operand(inst, Assembler::imm_operand); - - *((jobject*)operand) = JNIHandles::make_local(VmIds::get<klassOop>(obj->obj_field(_types.HotSpotTypeResolved_klassOop))); - instructions->relocate(inst, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); - tty->print_cr("relocating (HotSpotType) %02x at %016x/%016x", inst_byte, inst, operand); - } else { - tty->print_cr("unknown relocation type"); - obj->print(); - } - } - }*/ -