changeset 9887:4d5872186e76

Add compressed oops support in Graal/Hotspot site
author Christos Kotselidis <christos.kotselidis@oracle.com>
date Tue, 04 Jun 2013 19:36:16 +0200
parents d14b65dac937
children 3d658d3b56f5
files src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalCompilerToVM.hpp src/share/vm/oops/klass.hpp src/share/vm/prims/unsafe.cpp
diffstat 4 files changed, 56 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Tue Jun 04 18:52:22 2013 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Tue Jun 04 19:36:16 2013 +0200
@@ -256,7 +256,13 @@
     arrayOop values = (arrayOop) VirtualObject::values(value);
     for (jint i = 0; i < values->length(); i++) {
       ScopeValue* cur_second = NULL;
-      ScopeValue* value = get_hotspot_value(((oop*) values->base(T_OBJECT))[i], total_frame_size, objects, cur_second, oop_recorder);
+      oop object;
+      if(UseCompressedOops) {
+        object=oopDesc::decode_heap_oop(((narrowOop*) values->base(T_OBJECT))[i]);
+      } else {
+        object=((oop*) (values->base(T_OBJECT)))[i];
+      }
+      ScopeValue* value = get_hotspot_value(object, total_frame_size, objects, cur_second, oop_recorder);
 
       if (isLongArray && cur_second == NULL) {
         // we're trying to put ints into a long array... this isn't really valid, but it's used for some optimizations.
@@ -437,9 +443,13 @@
   memcpy(_instructions->start(), _code->base(T_BYTE), _code_size);
   _instructions->set_end(_instructions->start() + _code_size);
 
-  oop* sites = (oop*) _sites->base(T_OBJECT);
+  oop site;
   for (int i = 0; i < _sites->length(); i++) {
-    oop site = sites[i];
+    if(UseCompressedOops) {
+      site=oopDesc::decode_heap_oop(((narrowOop*) _sites->base(T_OBJECT))[i]);
+    } else {
+      site=((oop*) (_sites->base(T_OBJECT)))[i];
+    }
     jint pc_offset = CompilationResult_Site::pcOffset(site);
 
     if (site->is_a(CompilationResult_Call::klass())) {
@@ -533,7 +543,12 @@
   if (_exception_handlers != NULL) {
     oop* exception_handlers = (oop*) _exception_handlers->base(T_OBJECT);
     for (int i = 0; i < _exception_handlers->length(); i++) {
-      oop exc = exception_handlers[i];
+      oop exc;
+      if(UseCompressedOops) {
+        exc=oopDesc::decode_heap_oop(((narrowOop*) _exception_handlers->base(T_OBJECT))[i]);
+      } else {
+        exc=((oop*) (_exception_handlers->base(T_OBJECT)))[i];
+      }
       jint pc_offset = CompilationResult_Site::pcOffset(exc);
       jint handler_offset = CompilationResult_ExceptionHandler::handlerPos(exc);
 
@@ -605,8 +620,12 @@
 
   for (jint i = 0; i < values->length(); i++) {
     ScopeValue* second = NULL;
-    oop value = ((oop*) values->base(T_OBJECT))[i];
-
+    oop value;
+    if(UseCompressedOops) {
+      value=oopDesc::decode_heap_oop(((narrowOop*) values->base(T_OBJECT))[i]);
+    } else {
+      value = ((oop*) values->base(T_OBJECT))[i];
+    }
     if (i < local_count) {
       ScopeValue* first = get_hotspot_value(value, _total_frame_size, objects, second, _oop_recorder);
       if (second != NULL) {
@@ -625,10 +644,15 @@
     if (second != NULL) {
       i++;
       assert(i < values->length(), "double-slot value not followed by Value.ILLEGAL");
-      assert(((oop*) values->base(T_OBJECT))[i] == Value::ILLEGAL(), "double-slot value not followed by Value.ILLEGAL");
+      if(UseCompressedOops) {
+        assert(oopDesc::decode_heap_oop(((narrowOop*) values->base(T_OBJECT))[i]) == Value::ILLEGAL(), "double-slot value not followed by Value.ILLEGAL");
+      } else {
+        assert(((oop*) values->base(T_OBJECT))[i] == Value::ILLEGAL(), "double-slot value not followed by Value.ILLEGAL");
+      }
     }
   }
 
+
   _debug_recorder->dump_object_pool(objects);
 
   DebugToken* locals_token = _debug_recorder->create_scope_values(locals);
--- a/src/share/vm/graal/graalCompilerToVM.hpp	Tue Jun 04 18:52:22 2013 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.hpp	Tue Jun 04 19:36:16 2013 +0200
@@ -54,7 +54,12 @@
 
   oop next_arg(BasicType expectedType) {
     assert(_index < _args->length(), "out of bounds");
-    oop arg = ((oop*) _args->base(T_OBJECT))[_index++];
+    oop arg;
+    if(UseCompressedOops) {
+      arg = oopDesc::decode_heap_oop(((narrowOop*) _args->base(T_OBJECT))[_index++]);
+    } else {
+      arg = ((oop*) _args->base(T_OBJECT))[_index++];
+    }
     assert(expectedType == T_OBJECT || java_lang_boxing_object::is_instance(arg, expectedType), "arg type mismatch");
     return arg;
   }
--- a/src/share/vm/oops/klass.hpp	Tue Jun 04 18:52:22 2013 +0200
+++ b/src/share/vm/oops/klass.hpp	Tue Jun 04 19:36:16 2013 +0200
@@ -255,7 +255,7 @@
 #ifdef GRAAL
   // Graal mirror
   oop graal_mirror() const               { return _graal_mirror; }
-  void set_graal_mirror(oop m)           { oop_store((oop*) &_graal_mirror, m); }
+  void set_graal_mirror(oop m)           { klass_oop_store((oop*) &_graal_mirror, m); }
 #endif
 
   // modifier flags
--- a/src/share/vm/prims/unsafe.cpp	Tue Jun 04 18:52:22 2013 +0200
+++ b/src/share/vm/prims/unsafe.cpp	Tue Jun 04 19:36:16 2013 +0200
@@ -174,17 +174,27 @@
   OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
 
 // Macros for oops that check UseCompressedOops
-
+#ifndef GRAAL
 #define GET_OOP_FIELD(obj, offset, v) \
-  oop p = JNIHandles::resolve(obj);   \
-  oop v;                              \
-  if (UseCompressedOops) {            \
+  oop p = JNIHandles::resolve(obj); \
+  oop v; \
+  if (UseCompressedOops) { \
     narrowOop n = *(narrowOop*)index_oop_from_field_offset_long(p, offset); \
-    v = oopDesc::decode_heap_oop(n);                                \
-  } else {                            \
-    v = *(oop*)index_oop_from_field_offset_long(p, offset);                 \
+    v = oopDesc::decode_heap_oop(n); \
+  } else { \
+    v = *(oop*)index_oop_from_field_offset_long(p, offset); \
   }
-
+#else
+#define GET_OOP_FIELD(obj, offset, v) \
+   oop p = JNIHandles::resolve(obj); \
+   oop v; \
+   if (UseCompressedOops && p!=NULL && offset>=oopDesc::header_size()) { \
+     narrowOop n = *(narrowOop*)index_oop_from_field_offset_long(p, offset); \
+     v = oopDesc::decode_heap_oop(n); \
+   } else { \
+     v = *(oop*)index_oop_from_field_offset_long(p, offset); \
+   }
+#endif
 
 // Get/SetObject must be special-cased, since it works with handles.