Mercurial > hg > graal-jvmci-8
diff src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp @ 22711:316e768645c0
8139589: [JVMCI] throw exceptions in faulty code installation operations
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Thu, 29 Oct 2015 15:21:55 +0100 |
parents | ceca35d52380 |
children | 510846133438 |
line wrap: on
line diff
--- a/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Thu Oct 29 13:13:46 2015 +0100 +++ b/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Thu Oct 29 15:21:55 2015 +0100 @@ -34,7 +34,7 @@ #include "code/vmreg.hpp" #include "vmreg_x86.inline.hpp" -jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) { +jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, Handle method, TRAPS) { if (inst->is_call() || inst->is_jump()) { assert(NativeCall::instruction_size == (int)NativeJump::instruction_size, "unexpected size"); return (pc_offset + NativeCall::instruction_size); @@ -51,18 +51,17 @@ return (offset); } else if (inst->is_call_reg()) { // the inlined vtable stub contains a "call register" instruction - assert(method != NULL, "only valid for virtual calls"); + assert(method.not_null(), "only valid for virtual calls"); return (pc_offset + ((NativeCallReg *) inst)->next_instruction_offset()); } else if (inst->is_cond_jump()) { address pc = (address) (inst); return pc_offset + (jint) (Assembler::locate_next_instruction(pc) - pc); } else { - fatal("unsupported type of instruction for call site"); - return 0; + JVMCI_ERROR_0("unsupported type of instruction for call site"); } } -void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle& constant) { +void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle constant, TRAPS) { address pc = _instructions->start() + pc_offset; Handle obj = HotSpotObjectConstantImpl::object(constant); jobject value = JNIHandles::make_local(obj()); @@ -73,7 +72,7 @@ _instructions->relocate(pc, oop_Relocation::spec(oop_index), Assembler::narrow_oop_operand); TRACE_jvmci_3("relocating (narrow oop constant) at %p/%p", pc, operand); #else - fatal("compressed oop on 32bit"); + JVMCI_ERROR("compressed oop on 32bit"); #endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); @@ -83,19 +82,19 @@ } } -void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle& constant) { +void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, TRAPS) { address pc = _instructions->start() + pc_offset; if (HotSpotMetaspaceConstantImpl::compressed(constant)) { #ifdef _LP64 address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand); - *((narrowKlass*) operand) = record_narrow_metadata_reference(constant); + *((narrowKlass*) operand) = record_narrow_metadata_reference(constant, CHECK); TRACE_jvmci_3("relocating (narrow metaspace constant) at %p/%p", pc, operand); #else - fatal("compressed Klass* on 32bit"); + JVMCI_ERROR("compressed Klass* on 32bit"); #endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); - *((Metadata**) operand) = record_metadata_reference(constant); + *((Metadata**) operand) = record_metadata_reference(constant, CHECK); TRACE_jvmci_3("relocating (metaspace constant) at %p/%p", pc, operand); } } @@ -115,7 +114,7 @@ TRACE_jvmci_3("relocating at %p/%p with destination at %p (%d)", pc, operand, dest, data_offset); } -void CodeInstaller::pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination) { +void CodeInstaller::pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination, TRAPS) { address pc = (address) inst; if (inst->is_call()) { // NOTE: for call without a mov, the offset must fit a 32-bit immediate @@ -137,18 +136,18 @@ *(jint*) disp += ((address) foreign_call_destination) - old_dest; _instructions->relocate(pc, runtime_call_Relocation::spec(), Assembler::call32_operand); } else { - fatal("unsupported relocation for foreign call"); + JVMCI_ERROR("unsupported relocation for foreign call"); } TRACE_jvmci_3("relocating (foreign call) at %p", inst); } -void CodeInstaller::pd_relocate_JavaMethod(oop hotspot_method, jint pc_offset) { +void CodeInstaller::pd_relocate_JavaMethod(Handle hotspot_method, jint pc_offset, TRAPS) { #ifdef ASSERT Method* method = NULL; // we need to check, this might also be an unresolved method if (hotspot_method->is_a(HotSpotResolvedJavaMethodImpl::klass())) { - method = getMethodFromHotSpotMethod(hotspot_method); + method = getMethodFromHotSpotMethod(hotspot_method()); } #endif switch (_next_call_type) { @@ -183,6 +182,7 @@ break; } default: + JVMCI_ERROR("invalid _next_call_type value"); break; } } @@ -196,7 +196,7 @@ } -void CodeInstaller::pd_relocate_poll(address pc, jint mark) { +void CodeInstaller::pd_relocate_poll(address pc, jint mark, TRAPS) { switch (mark) { case POLL_NEAR: { relocate_poll_near(pc); @@ -220,13 +220,13 @@ _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand); break; default: - fatal("invalid mark value"); + JVMCI_ERROR(err_msg("invalid mark value: %d", mark)); break; } } // convert JVMCI register indices (as used in oop maps) to HotSpot registers -VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg) { +VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg, TRAPS) { if (jvmci_reg < RegisterImpl::number_of_registers) { return as_Register(jvmci_reg)->as_VMReg(); } else { @@ -234,8 +234,7 @@ if (floatRegisterNumber < XMMRegisterImpl::number_of_registers) { return as_XMMRegister(floatRegisterNumber)->as_VMReg(); } - ShouldNotReachHere(); - return NULL; + JVMCI_ERROR_NULL(err_msg("invalid register number: %d", jvmci_reg)); } }