RFR: 8309811: BytecodePrinter cannot handle unlinked classes [v3]
Ioi Lam
iklam at openjdk.org
Wed Jun 28 15:00:00 UTC 2023
> `BytecodePrinter` assumes that it's printing a method from a linked class (e.g., it assumes that the two bytes following an `invokestatic` bytecode have been rewritten to be a `ConstantPoolCache` index.)
>
> This works fine for `-XX:+TraceBytecodes`, which prints only code from linked classes. However, it doesn't work `Method::print_codes_on()` for a method from an unlinked class.
>
> The old code in `BytecodePrinter` uses a very convoluted logic to go from the rewritten index back to the `cp_index`. It's also difficult to understand the type of the indices from the badly named variables like `i` and `orig_i`.
>
> I had to rewrite all the logic for fetching the indices. Now they are in this form:
>
>
> case Bytecodes::_putfield:
> case Bytecodes::_getfield:
> {
> int cp_index;
> if (is_linked()) {
> int cpcache_index = get_native_index_u2();
> cp_index = cpcache()->entry_at(cpcache_index)->constant_pool_index();
> } else {
> cp_index = get_Java_index_u2();
> }
> print_field_or_method(cp_index, st);
> }
>
>
> The indices have names like `cp_index`, `cpcache_index`, `indy_index` so we know exactly what we are dealing with.
>
> Other changes:
> - Added test cases to cover both linked/unlinked classes for the bytecodes modified by this PR
> - Fixed the printing of strings to escape unprintable characters (E.g., "\u0001" is very common used by indified string concat)
> - Added a test case for `-XX:+TraceBytecodes`
> - Added a develop flag `-XX:TraceBytecodesStopAt=` so the test cases won't produce excessive output.
Ioi Lam has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains eight additional commits since the last revision:
- Merge branch 'master' into 8309811-bytecode-tracer-unlinked-classes
- @coleenp comments
- more clean up
- added invokehandle test
- added test for ldc MethodHandle
- more tests
- step2
- step1
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/14623/files
- new: https://git.openjdk.org/jdk/pull/14623/files/17163f39..d2a32a7a
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=14623&range=02
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=14623&range=01-02
Stats: 12816 lines in 624 files changed: 5440 ins; 3697 del; 3679 mod
Patch: https://git.openjdk.org/jdk/pull/14623.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14623/head:pull/14623
PR: https://git.openjdk.org/jdk/pull/14623
More information about the hotspot-runtime-dev
mailing list