On Fri, 31 May 2024 12:21:09 GMT, Dan Heidinga <heidi...@openjdk.org> wrote:

>> If you look at the version in the Leyden repo, there are many different 
>> types of references that are handled in 
>> `ClassPrelinker::maybe_resolve_fmi_ref`
>> 
>> https://github.com/openjdk/leyden/blob/4faa72029abb86b55cb33b00acf9f3a18ade4b77/src/hotspot/share/cds/classPrelinker.cpp#L307
>> 
>> My goal is to defer all the safety checks to 
>> `InterpreterRuntime::resolve_xxx` so that we don't need to think about what 
>> is safe to pre-resolve, and what is not. Some of the checks are very complex 
>> (see linkResolver.cpp as well) and may change as the language evolve.
>
> The current algorithm says:
> 
> for each bytecode in each method:
>   switch(bytecode) {
>     case getfield:
>     case outfield:
>       InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false 
> /*initialize_holder*/, CHECK);
>       break;
>    ....
>   }
> 
> What I'm proposing is:
> 
> for each ResolvedFieldEntry
>    bool success = InterpreterRuntime::resolve_get_put(getfield, raw_index, 
> nullptr /* mh */, cp, false /*initialize_holder*/, CHECK);
>    if (success) {
>      // also resolve for put
>      InterpreterRuntime::resolve_get_put(putfield, raw_index, nullptr /* mh 
> */, cp, false /*initialize_holder*/, CHECK);
>    }
> 
> 
> The `method` parameter is not critical as the "current" algorithm attempts 
> resolution with multiple methods - once for each method that references the 
> ResolvedFieldEntry.  The resolution logic already has to handle dealing with 
> different rules for different types of methods (ie `<clinit>` & `<init>`) for 
> normal execution and "knows" not to resolve entries (like puts of field 
> fields) regardless of the method as they need to do additional runtime checks 
> on every access.
> 
> The same will apply to invoke bytecodes later.... it feels safer to do only 
> what the bytecodes in some method have asked for but the runtime already has 
> to be robust against different kinds of gets/puts or invokes targeting the 
> same cp entries.  By eagerly resolving we're not giving up any safety.
> 
> If you really want to only resolve the exact cases (ie: gets not puts, etc) 
> that were resolved in the training run, then we need to write out as part of 
> the classlist more explicitly what needs to be resolved:
> ie:
> 
> @cp_resolved_gets 4, 7 8
> @cp_resolved_puts 7 8 10

This makes sense. I will try to prototype it in the Leyden repo and then update 
this PR.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19355#discussion_r1622828712

Reply via email to