# HG changeset patch # User iveresov # Date 1561783264 25200 # Node ID d4de822dc42134ebb1f7f667933d3f88b7c178e8 # Parent e6331cf7484031a4f65f032821eac617f7e86790 8226778: [JVMCI] Handle unpacking properly in Deoptimiziation::get_cached_box() Summary: Properly decode StackValue on big-endian machines Reviewed-by: kvn diff -r e6331cf74840 -r d4de822dc421 src/hotspot/share/runtime/deoptimization.cpp --- a/src/hotspot/share/runtime/deoptimization.cpp Fri Jun 28 16:06:44 2019 -0700 +++ b/src/hotspot/share/runtime/deoptimization.cpp Fri Jun 28 21:41:04 2019 -0700 @@ -840,6 +840,15 @@ } return NULL; } + oop lookup_raw(intptr_t raw_value) { + // Have to cast to avoid little/big-endian problems. + if (sizeof(PrimitiveType) > sizeof(jint)) { + jlong value = (jlong)raw_value; + return lookup(value); + } + PrimitiveType value = (PrimitiveType)*((jint*)&raw_value); + return lookup(value); + } }; typedef BoxCache IntegerBoxCache; @@ -878,6 +887,11 @@ } return _singleton; } + oop lookup_raw(intptr_t raw_value) { + // Have to cast to avoid little/big-endian problems. + jboolean value = (jboolean)*((jint*)&raw_value); + return lookup(value); + } oop lookup(jboolean value) { if (value != 0) { return JNIHandles::resolve_non_null(_true_cache); @@ -892,18 +906,14 @@ Klass* k = java_lang_Class::as_Klass(bv->klass()->as_ConstantOopReadValue()->value()()); BasicType box_type = SystemDictionary::box_klass_type(k); if (box_type != T_OBJECT) { - StackValue* value = StackValue::create_stack_value(fr, reg_map, bv->field_at(0)); + StackValue* value = StackValue::create_stack_value(fr, reg_map, bv->field_at(box_type == T_LONG ? 1 : 0)); switch(box_type) { - case T_INT: return IntegerBoxCache::singleton(THREAD)->lookup(value->get_int()); - case T_LONG: { - StackValue* low = StackValue::create_stack_value(fr, reg_map, bv->field_at(1)); - jlong res = (jlong)low->get_int(); - return LongBoxCache::singleton(THREAD)->lookup(res); - } - case T_CHAR: return CharacterBoxCache::singleton(THREAD)->lookup(value->get_int()); - case T_SHORT: return ShortBoxCache::singleton(THREAD)->lookup(value->get_int()); - case T_BYTE: return ByteBoxCache::singleton(THREAD)->lookup(value->get_int()); - case T_BOOLEAN: return BooleanBoxCache::singleton(THREAD)->lookup(value->get_int()); + case T_INT: return IntegerBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); + case T_CHAR: return CharacterBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); + case T_SHORT: return ShortBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); + case T_BYTE: return ByteBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); + case T_BOOLEAN: return BooleanBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); + case T_LONG: return LongBoxCache::singleton(THREAD)->lookup_raw(value->get_int()); default:; } } diff -r e6331cf74840 -r d4de822dc421 src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Jun 28 16:06:44 2019 -0700 +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Jun 28 21:41:04 2019 -0700 @@ -475,7 +475,9 @@ methodData = new HotSpotMethodData(metaspaceMethodData, this); String methodDataFilter = Option.TraceMethodDataFilter.getString(); if (methodDataFilter != null && this.format("%H.%n").contains(methodDataFilter)) { - System.out.println(methodData.toString()); + String line = methodData.toString() + System.lineSeparator(); + byte[] lineBytes = line.getBytes(); + CompilerToVM.compilerToVM().writeDebugOutput(lineBytes, 0, lineBytes.length, true, true); } } }