--- old/src/hotspot/share/ci/ciEnv.cpp 2018-12-10 21:15:52.700330675 -0800 +++ new/src/hotspot/share/ci/ciEnv.cpp 2018-12-10 21:15:52.556325338 -0800 @@ -394,7 +394,8 @@ ciKlass* ciEnv::get_klass_by_name_impl(ciKlass* accessing_klass, const constantPoolHandle& cpool, ciSymbol* name, - bool require_local) { + bool require_local, + bool is_value_type) { ASSERT_IN_VM; EXCEPTION_CONTEXT; @@ -408,7 +409,8 @@ sym->utf8_length()-2, KILL_COMPILE_ON_FATAL_(_unloaded_ciinstance_klass)); ciSymbol* strippedname = get_symbol(strippedsym); - return get_klass_by_name_impl(accessing_klass, cpool, strippedname, require_local); + is_value_type = (sym->byte_at(0) == 'Q'); + return get_klass_by_name_impl(accessing_klass, cpool, strippedname, require_local, is_value_type); } // Check for prior unloaded klass. The SystemDictionary's answers @@ -463,11 +465,12 @@ KILL_COMPILE_ON_FATAL_(fail_type)); // Get element ciKlass recursively. + is_value_type = (sym->byte_at(1) == 'Q'); ciKlass* elem_klass = get_klass_by_name_impl(accessing_klass, cpool, get_symbol(elem_sym), - require_local); + require_local, is_value_type); if (elem_klass != NULL && elem_klass->is_loaded()) { // Now make an array for it if (elem_klass->is_valuetype() && elem_klass->as_value_klass()->flatten_array()) { @@ -505,17 +508,23 @@ i++; } if (i > 0 && sym->byte_at(i) == 'Q') { - // An unloaded array class of value types is an ObjArrayKlass, an - // unloaded value type class is an InstanceKlass. For consistency, - // make the signature of the unloaded array of value type use L - // rather than Q. - char *new_name = CURRENT_THREAD_ENV->name_buffer(sym->utf8_length()+1); - strncpy(new_name, (char*)sym->base(), sym->utf8_length()); - new_name[i] = 'L'; - new_name[sym->utf8_length()] = '\0'; - return get_unloaded_klass(accessing_klass, ciSymbol::make(new_name)); + if (EnableValhallaC1) { + return get_unloaded_klass(accessing_klass, name, true); + } else { + // FIXME - C2 can't handle unloaded ciValueKlass + + // An unloaded array class of value types is an ObjArrayKlass, an + // unloaded value type class is an InstanceKlass. For consistency, + // make the signature of the unloaded array of value type use L + // rather than Q. + char *new_name = CURRENT_THREAD_ENV->name_buffer(sym->utf8_length()+1); + strncpy(new_name, (char*)sym->base(), sym->utf8_length()); + new_name[i] = 'L'; + new_name[sym->utf8_length()] = '\0'; + return get_unloaded_klass(accessing_klass, ciSymbol::make(new_name), false); + } } - return get_unloaded_klass(accessing_klass, name); + return get_unloaded_klass(accessing_klass, name, is_value_type); } // ------------------------------------------------------------------