On Fri, 8 Apr 2022 16:45:54 GMT, Ioi Lam <ik...@openjdk.org> wrote:

>> Thomas Schatzl has updated the pull request incrementally with two 
>> additional commits since the last revision:
>> 
>>  - iklam review
>>  - Test case
>
> src/hotspot/share/classfile/systemDictionaryShared.cpp line 1727:
> 
>> 1725:     ArchivedMirrorPatcher::update_array_klasses(k);
>> 1726:   }
>> 1727:   
>> ArchivedMirrorPatcher::update_array_klasses(Universe::fillerArrayKlassObj());
> 
> I think this is not necessary. `Universe::fillerArrayKlassObj()` shares the 
> same mirror as `Universe::intArrayKlassObj()`, which has already been updated 
> in the loop above.
> 
> `ArchivedMirrorPatcher::update_array_klasses(k)` will essentially do 
> `k->mirror->pointer_back_to_klass += delta`, so it will incorrectly set the 
> pointer when delta is not zero.
> 
> I would suggest running with
> 
> 
> -XX:ArchiveRelocationMode=1 -Xlog:cds -Xlog:class+load=debug
> 
> 
> and step into the following code: 
> 
> 
> void java_lang_Class::update_archived_mirror_native_pointers(oop 
> archived_mirror) {
>   assert(MetaspaceShared::relocation_delta() != 0, "must be");
> 
>   Klass* k = ((Klass*)archived_mirror->metadata_field(_klass_offset));
>   archived_mirror->metadata_field_put(_klass_offset,
>       (Klass*)(address(k) + MetaspaceShared::relocation_delta())); <<<< HERE

Stepping into that code (well, I added some logging) indicated that the mirrors 
for these klasses (`_fillerArrayKlassObj` and `intArrayKlassObj`) are 
different, so the field is not updated multiple times. So this code seems 
required, also because there are lots of crashes when removing the 
`ArchivedMirrorPatcher::update_array_klasses` call.

(Say, if you print the `java_mirror()` after Universe initialization)

The problem with the compiler we had (which was resolved by initializing the 
filler array before the int-array) was that in the component mirror, there is a 
reference to the arrayklass that represents an array of that basic type.
So as the code earlier initialized the filler array klass after the int array 
klass, the compiler used the filler array klass for array instantiation which 
tests did not like.

-------------

PR: https://git.openjdk.java.net/jdk/pull/8156

Reply via email to