diff src/share/vm/jvmci/jvmciCodeInstaller.cpp @ 21730:b9f9b8af17ff

Simplify interface to reference map
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Wed, 03 Jun 2015 19:57:38 -0700
parents ce2113326bc8
children df9d2375512a
line wrap: on
line diff
--- a/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Wed Jun 03 19:33:17 2015 -0700
+++ b/src/share/vm/jvmci/jvmciCodeInstaller.cpp	Wed Jun 03 19:57:38 2015 -0700
@@ -69,83 +69,59 @@
   return asMethod(HotSpotResolvedJavaMethodImpl::metaspaceMethod(hotspot_method));
 }
 
-const int MapWordBits = 64;
-
-static int entry_value(typeArrayOop words, int i) {
-  jint words_idx = i / MapWordBits;
-  assert(words_idx >= 0 && words_idx < words->length(), "unexpected index");
-  jlong word = words->long_at(words_idx);
-  return (word >> (i % MapWordBits)) & 15LL;
-}
-
-static int fixedmap_size(oop bitset) {
-  typeArrayOop arr = HotSpotOopMap::words(bitset);
-  return arr->length() * MapWordBits;
-}
-
-static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) {
-  int value = entry_value(words, 4 * idx);
-  switch (value) {
-    case 10:
-      map->set_oop(reg);
-      break;
-    case 5:
-      map->set_narrowoop(reg);
-      map->set_narrowoop(reg->next());
-      break;
-    case 1:
-      map->set_narrowoop(reg);
-      break;
-    case 4:
-      map->set_narrowoop(reg->next());
-      break;
-    case 0:
-      break;
-    default:
-      assert(false, err_msg("unexpected bit pattern at %d = 0x%x", idx, value));
-      ShouldNotReachHere();
+// creates a HotSpot oop map out of the byte arrays provided by DebugInfo
+OopMap* CodeInstaller::create_oop_map(oop debug_info) {
+  oop reference_map = DebugInfo::referenceMap(debug_info);
+  OopMap* map = new OopMap(_total_frame_size, _parameter_count);
+  objArrayOop objects = HotSpotReferenceMap::objects(reference_map);
+  typeArrayOop bytesPerArray = HotSpotReferenceMap::bytesPerElement(reference_map);
+  for (int i = 0; i < objects->length(); i++) {
+    oop value = objects->obj_at(i);
+    oop lirKind = AbstractValue::lirKind(value);
+    oop platformKind = LIRKind::platformKind(lirKind);
+    int bytesPerElement = bytesPerArray->int_at(i);
+    assert(bytesPerElement == 4 || bytesPerElement == 8, "wrong sizes");
+    jint referenceMask = LIRKind::referenceMask(lirKind);
+    assert(referenceMask != 0, "must be a reference type");
+    assert(referenceMask != -1, "must not be a derived reference type");
+    
+    VMReg vmReg;
+    if (value->is_a(RegisterValue::klass())) {
+      oop reg = RegisterValue::reg(value);
+      jint number = code_Register::number(reg);
+      vmReg = CodeInstaller::get_hotspot_reg(number);
+    } else if (value->is_a(StackSlot::klass())) {
+      jint offset = StackSlot::offset(value);
+#ifdef TARGET_ARCH_sparc
+      if(offset >= 0) {
+        offset += 128;
+      }
+#endif
+      if (StackSlot::addFrameSize(value)) {
+        offset += _total_frame_size;
+      }
+      assert(offset % 4 == 0, "must be aligned");
+      vmReg = VMRegImpl::stack2reg(offset / 4);
+    }
+      
+    int bit = 1;
+    while (referenceMask != 0) {
+      if (referenceMask & bit) {
+        if (bytesPerElement == 8) {
+          map->set_oop(vmReg);
+        } else {
+          map->set_narrowoop(vmReg);
+        }
+        referenceMask &= ~bit;
+      }
+      vmReg = vmReg->next();
+      if (bytesPerElement == 8) {
+        vmReg = vmReg->next();
+      }
+      bit <<= 1;
+    }
   }
-}
-
-// creates a HotSpot oop map out of the byte arrays provided by DebugInfo
-static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) {
-  OopMap* map = new OopMap(total_frame_size, parameter_count);
-  oop reference_map = DebugInfo::referenceMap(debug_info);
-  oop register_map = HotSpotReferenceMap::registerRefMap(reference_map);
-  oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map);
   oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
-
-  if (register_map != NULL) {
-    typeArrayOop words = HotSpotOopMap::words(register_map);
-    int mapIdx = 0;
-    for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
-      set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, mapIdx);
-      mapIdx++;
-    }
-#ifdef TARGET_ARCH_x86
-    for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) {
-      VMReg reg = as_XMMRegister(i)->as_VMReg();
-      for (jint j = 0; j < 4; j++) {
-        set_vmreg_oops(map, reg->next(2 * j), words, mapIdx++);
-      }
-    }
-#endif
-#ifdef TARGET_ARCH_sparc
-    for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
-      VMReg reg = as_FloatRegister(i)->as_VMReg();
-      set_vmreg_oops(map, reg, words, mapIdx++);
-    }
-#endif
-  }
-
-  typeArrayOop words = HotSpotOopMap::words(frame_map);
-  int size = fixedmap_size(frame_map) / 4;
-  for (jint i = 0; i < size; i++) {
-    // HotSpot stack slots are 4 bytes
-    VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
-    set_vmreg_oops(map, reg, words, i);
-  }
-
   if (callee_save_info != NULL) {
     objArrayOop registers = RegisterSaveLayout::registers(callee_save_info);
     typeArrayOop slots = RegisterSaveLayout::slots(callee_save_info);
@@ -261,7 +237,17 @@
       return value;
     }
   } else if (value->is_a(StackSlot::klass())) {
-      Location::Type locationType;
+    jint offset = StackSlot::offset(value);
+#ifdef TARGET_ARCH_sparc
+    if(offset >= 0) {
+      offset += 128;
+    }
+#endif
+    if (StackSlot::addFrameSize(value)) {
+      offset += _total_frame_size;
+    }
+
+    Location::Type locationType;
     if (type == T_LONG) {
       locationType = reference ? Location::oop : Location::lng;
     } else if (type == T_INT) {
@@ -278,15 +264,6 @@
       assert(type == T_OBJECT && reference, "unexpected type in stack slot");
       locationType = Location::oop;
     }
-    jint offset = StackSlot::offset(value);
-#ifdef TARGET_ARCH_sparc
-    if(offset >= 0) {
-      offset += 128;
-    }
-#endif
-    if (StackSlot::addFrameSize(value)) {
-      offset += _total_frame_size;
-    }
     ScopeValue* value = new LocationValue(Location::new_stk_loc(locationType, offset));
     if (type == T_DOUBLE || (type == T_LONG && !reference)) {
       second = value;
@@ -856,7 +833,7 @@
 
   // 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(_total_frame_size, _parameter_count, debug_info));
+  _debug_recorder->add_safepoint(pc_offset, create_oop_map(debug_info));
   record_scope(pc_offset, debug_info);
   _debug_recorder->end_safepoint(pc_offset);
 }
@@ -891,7 +868,7 @@
   jint next_pc_offset = CodeInstaller::pd_next_offset(inst, pc_offset, hotspot_method);
 
   if (debug_info != NULL) {
-    _debug_recorder->add_safepoint(next_pc_offset, create_oop_map(_total_frame_size, _parameter_count, debug_info));
+    _debug_recorder->add_safepoint(next_pc_offset, create_oop_map(debug_info));
     record_scope(next_pc_offset, debug_info);
   }