On Thu, 3 Apr 2025 22:02:01 GMT, Vladimir Kozlov <k...@openjdk.org> wrote:
>>> @iklam one annoying thing in current ergonomic setting for AOTCode flags in >>> mainline is checking which phase we are executing. We agreed before that we >>> should only save/load AOT code when `AOTClassLinking` is on because AOT >>> code needs classes to be preloaded. >>> >>> I have to do next checks to enable AOTCode in >>> `CDSConfig::check_vm_args_consistency()`: >>> >>> ``` >>> if (AOTClassLinking && is_using_archive() && !is_dumping_archive() && >>> !FLAG_IS_DEFAULT(AOTCache)) { >>> FLAG_SET_ERGO_IF_DEFAULT(LoadAOTCode, true); >>> ... >>> if (AOTClassLinking && is_dumping_final_static_archive()) { >>> FLAG_SET_ERGO_IF_DEFAULT(StoreAOTCode, true); >>> ``` >>> >>> First, I am not sure these conditions are correct. >>> >>> Second, it would be nice to have simple checks instead: >>> `is_dumping_aot_archive()` and `is_using_aot_archive()`. >>> >>> May be also consider it is error if both conditions are true (we don't >>> support updating archive yet). >> >> There are a lot of dependencies between different AOT capabilities, and it's >> hard to control that using global variables. At the point of >> `CDSConfig::check_vm_args_consistency()`, we don't have complete knowledge >> whether the AOT cache exists, or whether the cache contains AOT code, or >> whether the GC compressed oops settings are compatible with the AOT code. >> >> In the handling of such "AOT capability flags", I have been using the >> following pattern: >> >> In `CDSConfig::check_vm_args_consistency()` we update the default values of >> the flags according to their dependencies on other flags. E.g., by >> specifying `-XX:AOTMode=create`, `AOTClassLinking` and >> `AOTInvokeDynamicLinking` are enabled by default. >> >> >> if (!FLAG_IS_DEFAULT(AOTMode)) { >> // Using any form of the new AOTMode switch enables enhanced >> optimizations. >> FLAG_SET_ERGO_IF_DEFAULT(AOTClassLinking, true); >> } >> >> if (AOTClassLinking) { >> // If AOTClassLinking is specified, enable all AOT optimizations by >> default. >> FLAG_SET_ERGO_IF_DEFAULT(AOTInvokeDynamicLinking, true); >> } else { >> // AOTInvokeDynamicLinking depends on AOTClassLinking. >> FLAG_SET_ERGO(AOTInvokeDynamicLinking, false); >> } >> >> >> However, the values of these flags are just advisory. Even if a flag is >> enabled, the underlying capability may be disabled. For example, >> `AOTClassLinking` requires the ability of dumping heap objects, which is not >> available if ZGC is used. >> >> Because the dependencies are complex, it's difficult to resolve them >> statically and set a globa... > > Thank you @iklam for explanation. I can do final adjustment to > `Store|LoadAOTCode` flags values in `StoreAOTCode::initialize()` which is > called from `initialize_shared_spaces()`: > > > MetaspaceShared::initialize_shared_spaces() { > ... > static_mapinfo->patch_heap_embedded_pointers(); > ArchiveHeapLoader::finish_initialization(); > Universe::load_archived_object_instances(); > + AOTCodeCache::initialize(); > > > The question: at this place are all CDS AOT flags are final (flags > compatibility and cache presence are verified)? > > Note, `Store|LoadAOTCode` flags are diagnostic and disabled by default. I > need to set them to `true` somewhere. Thanks @vnkozlov @ashu-mehra @DanHeidinga @lmesnik for the review ------------- PR Comment: https://git.openjdk.org/jdk/pull/24401#issuecomment-2790037592