RFR: 8351958: Some compile commands should be made diagnostic
Marc Chevalier
mchevalier at openjdk.org
Fri May 9 16:29:03 UTC 2025
Error when using a `CompileCommand` that is an alias for a diagnostic option when `-XX:+UnlockDiagnosticVMOptions` is not provided.
The argument processing works this way:
1. Flags are parsed, setting the value accordingly. For `CompileCommand`, each option is added to a `\n`-separated string. At this step, if a flag is diagnostic but `-XX:+UnlockDiagnosticVMOptions` is not provided, then an error message is emitted, argument parsing fails and the VM terminates. Yet, the value of `CompileCommand` is still an unparsed list of string.
2. Eventually, `CompileCommand` is parsed. For some of them, the value of regular flag is used as the default value, and as far as I know, it's the only mapping between `CompileCommand` and the equivalent flag. Moreover, at this point, the order of the various command line arguments is lost: it is not possible to know which `CompileCommand` comes before or after the `-XX:+UnlockDiagnosticVMOptions`.
Moreover, `CompileCommand` are parsed in the same way as compiler directives coming from a file. If we complain about diagnostic `CompileCommand`, we should also when coming from a directive file, for consistency. But then, while the relative order of `CompileCommand` and `-XX:+UnlockDiagnosticVMOptions` is lost, it simply makes no sense to compare the ordering of command line arguments and directives from a file.
So, before the difficulty and the relative lack of sense, I defaulted to ignore the ordering requirement. And by using the `CompileCommand` error reporting mechanism, we get an error that is consistent with other `CompileCommand`-parsing related errors, e.g.
CompileCommand: An error occurred during parsing
Error: VM option 'PrintAssembly' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.
Line: 'PrintAssembly,*::*'
Usage: '-XX:CompileCommand=<option>,<method pattern>' - to set boolean option to true
Usage: '-XX:CompileCommand=<option>,<method pattern>,<value>'
Use: '-XX:CompileCommand=help' for more information and to list all option.
CompileCommand: compileonly Test.* bool compileonly = true
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
The other problem is how to identify that a `CompileCommand` is an alias for a diagnostic flag. I refrained from hardcoding the list, but there is no nice mapping stating "this is an alias for...", only the default value for some:
https://github.com/openjdk/jdk/blob/9f9e73d5f9fcb5e926a2674c54cbbc92012b75f6/src/hotspot/share/compiler/compilerDirectives.hpp#L37-L60
But I couldn't recycle `compilerdirectives_common_flags` (or similar) to define this mapping because the alias is just the default value. It can also be a literal. While `PrintAssembly` is an alias for `PrintAssembly`, `MemLimit` is not an alias for `0`, it's just the default value. The best I could find is to assume that if there is a flag, it bears the same name. The only thing that looks like an exception is `Log` and `LogCompilation`, but actually, the `CompileCommand` `Log` requires the `LogCompilation` flag (which is diagnostic) to be set. So it is not actually an alias.
-------------
Commit messages:
- Add some UnlockDiagnosticVMOptions
- Make some compile command locked by UnlockDiagnosticVMOptions
Changes: https://git.openjdk.org/jdk/pull/25150/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25150&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8351958
Stats: 67 lines in 6 files changed: 48 ins; 0 del; 19 mod
Patch: https://git.openjdk.org/jdk/pull/25150.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/25150/head:pull/25150
PR: https://git.openjdk.org/jdk/pull/25150
More information about the hotspot-dev
mailing list