This is the 7th and final PR for [JEP 483: Ahead-of-Time Class Loading & 
Linking](https://bugs.openjdk.org/browse/JDK-8315737).

This PR implements the AOT-linking of invokedynamic callsites:
- We only link lambda expressions (`LambdaMetafactory::metafactory`) and string 
concat (`StringConcatFactory::makeConcatWithConstants()`) as the results of 
these bootstrap methods do not have environment dependencies and can be safely 
cached.
- The resolved CallSites are represented as Java heap objects. Thus, this 
optimizations is supported only for the static CDS archive, which can store 
heap objects. The dynamic CDS archive is not supported.

**Review Notes:**

- Start with `AOTConstantPoolResolver::preresolve_indy_cp_entries()` -- it 
checks all indys that were linked during the training run, and aot-links only 
those for lambdas and string concats
- `SystemDictionaryShared::find_all_archivable_classes()` finds all the hidden 
classes that are reachable from the indy CallSites
- In `MetaspaceShared::preload_and_dump_impl()` we call 
`MethodType::createArchivedObjects()` to record all MethodTypes that were 
created in the assembly phase. This is necessary because the identity of 
MethodTypes is significant (they are compared with the `==` operator). Also see 
MethodType.java for the corresponding code that are used in the production run.
- Afterwards, we enter the safepoint (`VM_PopulateDumpSharedSpace::doit()`). In 
this safepoint,  
`ConstantPoolCache::remove_resolved_indy_entries_if_non_deterministic()` is 
called to remove any resolved indy callsites that cannot be archived. (Such 
CallSites may be created as a side effect of Java code execution in the 
assembly phase. E.g., the bootstrap of the module system).

**Rough Edges:**

- Many archived CallSites references (directly or indirectly) the static fields 
of the classes listed under 
`AOTClassInitializer::can_archive_initialized_mirror()`, where the object 
identity of these static fields is significant. Therefore, we must preserve the 
initialized states of these classes. Otherwise, we might run into problems such 
as [JDK-8340836](https://bugs.openjdk.org/browse/JDK-8340836). Unfortunately, 
the list is created by trial-and-error, and may need to be updated to match 
changes in the `java.lang.invoke` and `jdk.internal.constant` packages. We 
expect Project Leyden to come with a general solution to this problem.
- If the identity is significant for a static field in a complex class, but not 
all of the static fields of this class can be archived, I use the `AOTHolder` 
pattern to break out the fields that need to be archived. See discussion on 
[leyden-dev](https://mail.openjdk.org/pipermail/leyden-dev/2024-August/000911.html).

---
See [here](https://bugs.openjdk.org/browse/JDK-8315737) for the sequence of 
dependent RFEs for implementing JEP 483.

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

Depends on: https://git.openjdk.org/jdk/pull/21049

Commit messages:
 - improve checks for not changing <clinit> order for aot linking of lambda; 
added comprehensive test cases: AOTLinkedLambdasApp::testClinitOrder()
 - Clean up of aotClassInitializer and cdsHeaVerifier; added lambda test cases 
for <clinit> order of app classes
 - Merge branch 'jep-483-step-06-8311071-avoid-soft-refs-in-java-lang-invoke' 
into jep-483-step-07-8293336-store-lambda-forms-in-cds-archive
 - Require all <clinit> of supertypes of aot-inited classes to be executed in 
assembly phase
 - Limit the use of AOTHolder
 - Merge branch 'jep-483-step-06-8311071-avoid-soft-refs-in-java-lang-invoke' 
into jep-483-step-07-8293336-store-lambda-forms-in-cds-archive
 - Merge branch 'remerge' into 
jep-483-step-07-8293336-store-lambda-forms-in-cds-archive
 - more clean up
 - Cleaned up AOTClassInitializer::can_archive_initialized_mirror()
 - more clean up
 - ... and 14 more: https://git.openjdk.org/jdk/compare/1b067b7b...195303f2

Changes: https://git.openjdk.org/jdk/pull/21143/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21143&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8293336
  Stats: 1674 lines in 52 files changed: 1534 ins; 39 del; 101 mod
  Patch: https://git.openjdk.org/jdk/pull/21143.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21143/head:pull/21143

PR: https://git.openjdk.org/jdk/pull/21143

Reply via email to