mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-19 10:34:38 +02:00
8226778: [JVMCI] Handle unpacking properly in Deoptimiziation::get_cached_box()
Properly decode StackValue on big-endian machines Reviewed-by: kvn
This commit is contained in:
parent
ff1f2fad6e
commit
a7511da8af
2 changed files with 24 additions and 12 deletions
|
@ -840,6 +840,15 @@ public:
|
||||||
}
|
}
|
||||||
return NULL;
|
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<jint, java_lang_Integer_IntegerCache, java_lang_Integer> IntegerBoxCache;
|
typedef BoxCache<jint, java_lang_Integer_IntegerCache, java_lang_Integer> IntegerBoxCache;
|
||||||
|
@ -878,6 +887,11 @@ public:
|
||||||
}
|
}
|
||||||
return _singleton;
|
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) {
|
oop lookup(jboolean value) {
|
||||||
if (value != 0) {
|
if (value != 0) {
|
||||||
return JNIHandles::resolve_non_null(_true_cache);
|
return JNIHandles::resolve_non_null(_true_cache);
|
||||||
|
@ -892,18 +906,14 @@ oop Deoptimization::get_cached_box(AutoBoxObjectValue* bv, frame* fr, RegisterMa
|
||||||
Klass* k = java_lang_Class::as_Klass(bv->klass()->as_ConstantOopReadValue()->value()());
|
Klass* k = java_lang_Class::as_Klass(bv->klass()->as_ConstantOopReadValue()->value()());
|
||||||
BasicType box_type = SystemDictionary::box_klass_type(k);
|
BasicType box_type = SystemDictionary::box_klass_type(k);
|
||||||
if (box_type != T_OBJECT) {
|
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) {
|
switch(box_type) {
|
||||||
case T_INT: return IntegerBoxCache::singleton(THREAD)->lookup(value->get_int());
|
case T_INT: return IntegerBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
case T_LONG: {
|
case T_CHAR: return CharacterBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
StackValue* low = StackValue::create_stack_value(fr, reg_map, bv->field_at(1));
|
case T_SHORT: return ShortBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
jlong res = (jlong)low->get_int();
|
case T_BYTE: return ByteBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
return LongBoxCache::singleton(THREAD)->lookup(res);
|
case T_BOOLEAN: return BooleanBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
}
|
case T_LONG: return LongBoxCache::singleton(THREAD)->lookup_raw(value->get_int());
|
||||||
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());
|
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -475,7 +475,9 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||||
methodData = new HotSpotMethodData(metaspaceMethodData, this);
|
methodData = new HotSpotMethodData(metaspaceMethodData, this);
|
||||||
String methodDataFilter = Option.TraceMethodDataFilter.getString();
|
String methodDataFilter = Option.TraceMethodDataFilter.getString();
|
||||||
if (methodDataFilter != null && this.format("%H.%n").contains(methodDataFilter)) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue