# HG changeset patch # User Christos Kotselidis # Date 1370367376 -7200 # Node ID 4d5872186e76e8092640b77fd2ca74354832514a # Parent d14b65dac937c393e25fc6681ba6ce9d775d4dc3 Add compressed oops support in Graal/Hotspot site diff -r d14b65dac937 -r 4d5872186e76 src/share/vm/graal/graalCodeInstaller.cpp --- 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); diff -r d14b65dac937 -r 4d5872186e76 src/share/vm/graal/graalCompilerToVM.hpp --- 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; } diff -r d14b65dac937 -r 4d5872186e76 src/share/vm/oops/klass.hpp --- 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 diff -r d14b65dac937 -r 4d5872186e76 src/share/vm/prims/unsafe.cpp --- 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.