RFR: 8309811: BytecodePrinter cannot handle unlinked classes

Ioi Lam iklam at openjdk.org
Fri Jun 23 05:26:20 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.

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

Commit messages:
 - more clean up
 - added invokehandle test
 - added test for ldc MethodHandle
 - more tests
 - step2
 - step1

Changes: https://git.openjdk.org/jdk/pull/14623/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14623&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8309811
  Stats: 666 lines in 6 files changed: 393 ins; 183 del; 90 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