changeset 22721:510846133438

8139589: [JVMCI] Using fthrow when throwing JVMCIError.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 03 Nov 2015 16:55:51 +0100
parents 48fde4d03767
children 0229a2ca608b
files src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp src/share/vm/jvmci/jvmciCodeInstaller.cpp src/share/vm/jvmci/jvmciCodeInstaller.hpp
diffstat 4 files changed, 53 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp	Wed Nov 04 16:11:58 2015 +0100
+++ b/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp	Tue Nov 03 16:55:51 2015 +0100
@@ -115,7 +115,7 @@
     jump->set_jump_destination((address) foreign_call_destination);
     _instructions->relocate(jump->instruction_address(), runtime_call_Relocation::spec());
   } else {
-    JVMCI_ERROR(err_msg("unknown call or jump instruction at " PTR_FORMAT, p2i(pc)));
+    JVMCI_ERROR("unknown call or jump instruction at " PTR_FORMAT, p2i(pc));
   }
   TRACE_jvmci_3("relocating (foreign call) at %p", inst);
 }
@@ -197,7 +197,7 @@
     } else if(jvmci_reg < 112) {
       floatRegisterNumber = 4 * (jvmci_reg - 96);
     } else {
-      JVMCI_ERROR_NULL(err_msg("invalid register number: %d", jvmci_reg));
+      JVMCI_ERROR_NULL("invalid register number: %d", jvmci_reg);
     }
     return as_FloatRegister(floatRegisterNumber)->as_VMReg();
   }
--- a/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp	Wed Nov 04 16:11:58 2015 +0100
+++ b/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp	Tue Nov 03 16:55:51 2015 +0100
@@ -220,7 +220,7 @@
       _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand);
       break;
     default:
-      JVMCI_ERROR(err_msg("invalid mark value: %d", mark));
+      JVMCI_ERROR("invalid mark value: %d", mark);
       break;
   }
 }
@@ -234,7 +234,7 @@
     if (floatRegisterNumber < XMMRegisterImpl::number_of_registers) {
       return as_XMMRegister(floatRegisterNumber)->as_VMReg();
     }
-    JVMCI_ERROR_NULL(err_msg("invalid register number: %d", jvmci_reg));
+    JVMCI_ERROR_NULL("invalid register number: %d", jvmci_reg);
   }
 }
 
--- a/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Wed Nov 04 16:11:58 2015 +0100
+++ b/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Tue Nov 03 16:55:51 2015 +0100
@@ -80,14 +80,14 @@
     if (offset % 4 == 0) {
       return vmReg->next(offset / 4);
     } else {
-      JVMCI_ERROR_NULL(err_msg("unaligned subregister offset %d in oop map", offset));
+      JVMCI_ERROR_NULL("unaligned subregister offset %d in oop map", offset);
     }
   } else {
     // stack slot
     if (offset % 4 == 0) {
       return VMRegImpl::stack2reg(offset / 4);
     } else {
-      JVMCI_ERROR_NULL(err_msg("unaligned stack offset %d in oop map", offset));
+      JVMCI_ERROR_NULL("unaligned stack offset %d in oop map", offset);
     }
   }
 }
@@ -118,7 +118,7 @@
         VMReg baseReg = getVMRegFromLocation(baseLocation, _total_frame_size, CHECK_NULL);
         map->set_derived_oop(vmReg, baseReg);
       } else {
-        JVMCI_ERROR_NULL(err_msg("invalid derived oop size in ReferenceMap: %d", bytes));
+        JVMCI_ERROR_NULL("invalid derived oop size in ReferenceMap: %d", bytes);
       }
 #ifdef _LP64
     } else if (bytes == 8) {
@@ -132,7 +132,7 @@
       map->set_oop(vmReg);
 #endif
     } else {
-      JVMCI_ERROR_NULL(err_msg("invalid oop size in ReferenceMap: %d", bytes));
+      JVMCI_ERROR_NULL("invalid oop size in ReferenceMap: %d", bytes);
     }
   }
 
@@ -174,7 +174,7 @@
     TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
     return method;
   } else {
-    JVMCI_ERROR_NULL(err_msg("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()));
+    JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name());
   }
 }
 
@@ -184,7 +184,7 @@
   assert(HotSpotMetaspaceConstantImpl::compressed(constant), err_msg("unexpected uncompressed pointer"));
 
   if (!obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) {
-    JVMCI_ERROR_0(err_msg("unexpected compressed pointer of type %s", obj->klass()->signature_name()));
+    JVMCI_ERROR_0("unexpected compressed pointer of type %s", obj->klass()->signature_name());
   }
 
   Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
@@ -210,7 +210,7 @@
   second = NULL;
   if (value == Value::ILLEGAL()) {
     if (type != T_ILLEGAL) {
-      JVMCI_ERROR_NULL(err_msg("unexpected illegal value, expected %s", basictype_to_str(type)));
+      JVMCI_ERROR_NULL("unexpected illegal value, expected %s", basictype_to_str(type));
     }
     return _illegal_value;
   } else if (value->is_a(RegisterValue::klass())) {
@@ -226,7 +226,7 @@
       } else if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) {
         locationType = Location::int_in_long;
       } else {
-        JVMCI_ERROR_NULL(err_msg("unexpected type %s in cpu register", basictype_to_str(type)));
+        JVMCI_ERROR_NULL("unexpected type %s in cpu register", basictype_to_str(type));
       }
       ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
       if (type == T_LONG) {
@@ -241,7 +241,7 @@
       } else if (type == T_DOUBLE) {
         locationType = Location::dbl;
       } else {
-        JVMCI_ERROR_NULL(err_msg("unexpected type %s in floating point register", basictype_to_str(type)));
+        JVMCI_ERROR_NULL("unexpected type %s in floating point register", basictype_to_str(type));
       }
       ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
       if (type == T_DOUBLE) {
@@ -265,7 +265,7 @@
     } else if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) {
       locationType = Location::normal;
     } else {
-      JVMCI_ERROR_NULL(err_msg("unexpected type %s in stack slot", basictype_to_str(type)));
+      JVMCI_ERROR_NULL("unexpected type %s in stack slot", basictype_to_str(type));
     }
     ScopeValue* value = new LocationValue(Location::new_stk_loc(locationType, offset));
     if (type == T_DOUBLE || type == T_LONG) {
@@ -280,7 +280,7 @@
       } else {
         BasicType constantType = JVMCIRuntime::kindToBasicType(JavaKind::typeChar(PrimitiveConstant::kind(value)));
         if (type != constantType) {
-          JVMCI_ERROR_NULL(err_msg("primitive constant type doesn't match, expected %s but got %s", basictype_to_str(type), basictype_to_str(constantType)));
+          JVMCI_ERROR_NULL("primitive constant type doesn't match, expected %s but got %s", basictype_to_str(type), basictype_to_str(constantType));
         }
         if (type == T_INT || type == T_FLOAT) {
           jint prim = (jint)PrimitiveConstant::primitive(value);
@@ -296,14 +296,14 @@
           second = _int_1_scope_value;
           return new ConstantLongValue(prim);
         } else {
-          JVMCI_ERROR_NULL(err_msg("unexpected primitive constant type %s", basictype_to_str(type)));
+          JVMCI_ERROR_NULL("unexpected primitive constant type %s", basictype_to_str(type));
         }
       }
     } else if (value->is_a(NullConstant::klass()) || value->is_a(HotSpotCompressedNullConstant::klass())) {
       if (type == T_OBJECT) {
         return _oop_null_scope_value;
       } else {
-        JVMCI_ERROR_NULL(err_msg("unexpected null constant, expected %s", basictype_to_str(type)));
+        JVMCI_ERROR_NULL("unexpected null constant, expected %s", basictype_to_str(type));
       }
     } else if (value->is_a(HotSpotObjectConstantImpl::klass())) {
       if (type == T_OBJECT) {
@@ -313,7 +313,7 @@
         }
         return new ConstantOopWriteValue(JNIHandles::make_local(obj));
       } else {
-        JVMCI_ERROR_NULL(err_msg("unexpected object constant, expected %s", basictype_to_str(type)));
+        JVMCI_ERROR_NULL("unexpected object constant, expected %s", basictype_to_str(type));
       }
     }
   } else if (value->is_a(VirtualObject::klass())) {
@@ -325,13 +325,13 @@
           return object;
         }
       }
-      JVMCI_ERROR_NULL(err_msg("unknown virtual object id %d", id));
+      JVMCI_ERROR_NULL("unknown virtual object id %d", id);
     } else {
-      JVMCI_ERROR_NULL(err_msg("unexpected virtual object, expected %s", basictype_to_str(type)));
+      JVMCI_ERROR_NULL("unexpected virtual object, expected %s", basictype_to_str(type));
     }
   }
 
-  JVMCI_ERROR_NULL(err_msg("unexpected value in scope: %s", value->klass()->signature_name()))
+  JVMCI_ERROR_NULL("unexpected value in scope: %s", value->klass()->signature_name())
 }
 
 void CodeInstaller::record_object_value(ObjectValue* sv, Handle value, GrowableArray<ScopeValue*>* objects, TRAPS) {
@@ -365,7 +365,7 @@
 
 MonitorValue* CodeInstaller::get_monitor_value(Handle value, GrowableArray<ScopeValue*>* objects, TRAPS) {
   if (!value->is_a(StackLockValue::klass())) {
-    JVMCI_ERROR_NULL(err_msg("Monitors must be of type StackLockValue, got %s", value->klass()->signature_name()));
+    JVMCI_ERROR_NULL("Monitors must be of type StackLockValue, got %s", value->klass()->signature_name());
   }
 
   ScopeValue* second = NULL;
@@ -407,7 +407,7 @@
         } else if (assumption->klass() == Assumptions_CallSiteTargetValue::klass()) {
           assumption_CallSiteTargetValue(assumption);
         } else {
-          JVMCI_ERROR(err_msg("unexpected Assumption subclass %s", assumption->klass()->signature_name()));
+          JVMCI_ERROR("unexpected Assumption subclass %s", assumption->klass()->signature_name());
         }
       }
     }
@@ -501,7 +501,7 @@
   // Pre-calculate the constants section size.  This is required for PC-relative addressing.
   _data_section_handle = JNIHandles::make_local(HotSpotCompiledCode::dataSection(compiled_code));
   if ((_constants->alignment() % HotSpotCompiledCode::dataSectionAlignment(compiled_code)) != 0) {
-    JVMCI_ERROR(err_msg("invalid data section alignment: %d", HotSpotCompiledCode::dataSectionAlignment(compiled_code)));
+    JVMCI_ERROR("invalid data section alignment: %d", HotSpotCompiledCode::dataSectionAlignment(compiled_code));
   }
   _constants_size = data_section()->length();
 
@@ -529,7 +529,7 @@
       oop id_obj = CompilationResult_Mark::id(site);
       if (id_obj != NULL) {
         if (!java_lang_boxing_object::is_instance(id_obj, T_INT)) {
-          JVMCI_ERROR_0(err_msg("expected Integer id, got %s", id_obj->klass()->signature_name()));
+          JVMCI_ERROR_0("expected Integer id, got %s", id_obj->klass()->signature_name());
         }
         jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT));
         if (id == INVOKESTATIC || id == INVOKESPECIAL) {
@@ -585,7 +585,7 @@
     Handle patch = data_section_patches()->obj_at(i);
     Handle reference = CompilationResult_DataPatch::reference(patch);
     if (!reference->is_a(CompilationResult_ConstantReference::klass())) {
-      JVMCI_ERROR_OK(err_msg("invalid patch in data section: %s", reference->klass()->signature_name()));
+      JVMCI_ERROR_OK("invalid patch in data section: %s", reference->klass()->signature_name());
     }
     Handle constant = CompilationResult_ConstantReference::constant(reference);
     address dest = _constants->start() + CompilationResult_Site::pcOffset(patch);
@@ -614,7 +614,7 @@
         _constants->relocate(dest, oop_Relocation::spec(oop_index));
       }
     } else {
-      JVMCI_ERROR_OK(err_msg("invalid constant in data section: %s", constant->klass()->signature_name()));
+      JVMCI_ERROR_OK("invalid constant in data section: %s", constant->klass()->signature_name());
     }
   }
   jint last_pc_offset = -1;
@@ -634,7 +634,7 @@
       } else if (InfopointReason::METHOD_START() == reason || InfopointReason::METHOD_END() == reason || InfopointReason::LINE_NUMBER() == reason) {
         site_Infopoint(buffer, pc_offset, site, CHECK_OK);
       } else {
-        JVMCI_ERROR_OK(err_msg("unknown infopoint reason at %i", pc_offset));
+        JVMCI_ERROR_OK("unknown infopoint reason at %i", pc_offset);
       }
     } else if (site->is_a(CompilationResult_DataPatch::klass())) {
       TRACE_jvmci_4("datapatch at %i", pc_offset);
@@ -643,7 +643,7 @@
       TRACE_jvmci_4("mark at %i", pc_offset);
       site_Mark(buffer, pc_offset, site, CHECK_OK);
     } else {
-      JVMCI_ERROR_OK(err_msg("unexpected site subclass: %s", site->klass()->signature_name()));
+      JVMCI_ERROR_OK("unexpected site subclass: %s", site->klass()->signature_name());
     }
     last_pc_offset = pc_offset;
 
@@ -754,10 +754,10 @@
     oop javaMirror = HotSpotResolvedObjectTypeImpl::javaClass(type);
     ObjectValue* sv = new ObjectValue(id, new ConstantOopWriteValue(JNIHandles::make_local(Thread::current(), javaMirror)));
     if (id < 0 || id >= objects->length()) {
-      JVMCI_ERROR_NULL(err_msg("virtual object id %d out of bounds", id));
+      JVMCI_ERROR_NULL("virtual object id %d out of bounds", id);
     }
     if (objects->at(id) != NULL) {
-      JVMCI_ERROR_NULL(err_msg("duplicate virtual object id %d", id));
+      JVMCI_ERROR_NULL("duplicate virtual object id %d", id);
     }
     objects->at_put(id, sv);
   }
@@ -828,10 +828,10 @@
     objArrayHandle slotKinds = BytecodeFrame::slotKinds(frame);
 
     if (local_count + expression_count + monitor_count != values->length()) {
-      JVMCI_ERROR(err_msg("unexpected values length %d in scope (%d locals, %d expressions, %d monitors)", values->length(), local_count, expression_count, monitor_count));
+      JVMCI_ERROR("unexpected values length %d in scope (%d locals, %d expressions, %d monitors)", values->length(), local_count, expression_count, monitor_count);
     }
     if (local_count + expression_count != slotKinds->length()) {
-      JVMCI_ERROR(err_msg("unexpected slotKinds length %d in scope (%d locals, %d expressions)", slotKinds->length(), local_count, expression_count));
+      JVMCI_ERROR("unexpected slotKinds length %d in scope (%d locals, %d expressions)", slotKinds->length(), local_count, expression_count);
     }
 
     GrowableArray<ScopeValue*>* locals = local_count > 0 ? new GrowableArray<ScopeValue*> (local_count) : NULL;
@@ -884,7 +884,7 @@
 void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
   Handle debug_info = CompilationResult_Infopoint::debugInfo(site);
   if (debug_info.is_null()) {
-    JVMCI_ERROR(err_msg("debug info expected at safepoint at %i", pc_offset));
+    JVMCI_ERROR("debug info expected at safepoint at %i", pc_offset);
   }
 
   // address instruction = _instructions->start() + pc_offset;
@@ -898,7 +898,7 @@
 void CodeInstaller::site_Infopoint(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
   Handle debug_info = CompilationResult_Infopoint::debugInfo(site);
   if (debug_info.is_null()) {
-    JVMCI_ERROR(err_msg("debug info expected at infopoint at %i", pc_offset));
+    JVMCI_ERROR("debug info expected at infopoint at %i", pc_offset);
   }
 
   _debug_recorder->add_non_safepoint(pc_offset);
@@ -937,7 +937,7 @@
     CodeInstaller::pd_relocate_ForeignCall(inst, foreign_call_destination, CHECK);
   } else { // method != NULL
     if (debug_info.is_null()) {
-      JVMCI_ERROR(err_msg("debug info expected at call at %i", pc_offset));
+      JVMCI_ERROR("debug info expected at call at %i", pc_offset);
     }
 
     TRACE_jvmci_3("method call");
@@ -964,17 +964,17 @@
     } else if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
       pd_patch_MetaspaceConstant(pc_offset, constant, CHECK);
     } else {
-      JVMCI_ERROR(err_msg("unknown constant type in data patch: %s", constant->klass()->signature_name()));
+      JVMCI_ERROR("unknown constant type in data patch: %s", constant->klass()->signature_name());
     }
   } else if (reference->is_a(CompilationResult_DataSectionReference::klass())) {
     int data_offset = CompilationResult_DataSectionReference::offset(reference);
     if (0 <= data_offset && data_offset < _constants_size) {
       pd_patch_DataSectionReference(pc_offset, data_offset);
     } else {
-      JVMCI_ERROR(err_msg("data offset 0x%X points outside data section (size 0x%X)", data_offset, _constants_size));
+      JVMCI_ERROR("data offset 0x%X points outside data section (size 0x%X)", data_offset, _constants_size);
     }
   } else {
-    JVMCI_ERROR(err_msg("unknown data patch type: %s", reference->klass()->signature_name()));
+    JVMCI_ERROR("unknown data patch type: %s", reference->klass()->signature_name());
   }
 }
 
@@ -983,7 +983,7 @@
 
   if (id_obj.not_null()) {
     if (!java_lang_boxing_object::is_instance(id_obj(), T_INT)) {
-      JVMCI_ERROR(err_msg("expected Integer id, got %s", id_obj->klass()->signature_name()));
+      JVMCI_ERROR("expected Integer id, got %s", id_obj->klass()->signature_name());
     }
     jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT));
 
@@ -1023,7 +1023,7 @@
       case CARD_TABLE_ADDRESS:
         break;
       default:
-        JVMCI_ERROR(err_msg("invalid mark id: %d", id));
+        JVMCI_ERROR("invalid mark id: %d", id);
         break;
     }
   }
--- a/src/share/vm/jvmci/jvmciCodeInstaller.hpp	Wed Nov 04 16:11:58 2015 +0100
+++ b/src/share/vm/jvmci/jvmciCodeInstaller.hpp	Tue Nov 03 16:55:51 2015 +0100
@@ -27,10 +27,18 @@
 #include "jvmci/jvmciCompiler.hpp"
 #include "jvmci/jvmciEnv.hpp"
 
-#define JVMCI_ERROR(message)      THROW_MSG(vmSymbols::jdk_vm_ci_common_JVMCIError(), message)
-#define JVMCI_ERROR_0(message)    THROW_MSG_0(vmSymbols::jdk_vm_ci_common_JVMCIError(), message)
-#define JVMCI_ERROR_NULL(message) THROW_MSG_NULL(vmSymbols::jdk_vm_ci_common_JVMCIError(), message)
-#define JVMCI_ERROR_OK(message)   THROW_MSG_(vmSymbols::jdk_vm_ci_common_JVMCIError(), message, JVMCIEnv::ok)
+#define JVMCI_ERROR(...)       \
+  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return; }
+
+#define JVMCI_ERROR_0(...)     \
+  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return 0; }
+
+#define JVMCI_ERROR_NULL(...)  \
+  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return NULL; }
+
+#define JVMCI_ERROR_OK(...)    \
+  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return JVMCIEnv::ok; }
+
 #define CHECK_OK                  CHECK_(JVMCIEnv::ok)
 
 /*