RFR: 8337396: Cleanup usage of ExternalAddess
Vladimir Kozlov
kvn at openjdk.org
Wed Jul 31 23:46:45 UTC 2024
`ExternalAddess` should be used only for data load. For calls (and jump) instructions we should use `RuntimeAddress` which uses `runtime_call_Relocation`.
I found few places where `ExternalAddess` is used incorrectly and fixed them.
I also added code to print "hottest" (most referenced) `ExternalAddess` addresses in global table to move them into static global tables which will be introduced by [JDK-8334691](https://bugs.openjdk.org/browse/JDK-8334691) and [JDK-8337519](https://bugs.openjdk.org/browse/JDK-8337519).
Here is current output from debug VM on MacBook M1 (Aarch64):
External addresses table: 6 entries, 324 accesses
0: 158 0x00000001082de0f0 : extn: vmClasses::_klasses+480
1: 84 0x00000001082ddf20 : extn: vmClasses::_klasses+16
2: 40 0x00000001082c4790 : extn: SharedRuntime::_partial_subtype_ctr
3: 24 0x00000001082bdb04 : extn: JvmtiExport::_should_notify_object_alloc
4: 18 0x0000000118384080 : stub: forward exception
on MacOS-x64:
External addresses table: 143 entries, 44405 accesses
0: 11766 0x00000001047922a0 : extn: CompressedOops::_narrow_oop
1: 11002 0x0000000104474384 : 'should not reach here'
2: 9672 0x0000000104581a90 : extn: ClassLoader::file_name_for_class_name(char const*, int)::class_suffix+882068
3: 2447 0x0000000104508005 : extn: ClassLoader::file_name_for_class_name(char const*, int)::class_suffix+383753
4: 1916 0x000000010458188e : extn: ClassLoader::file_name_for_class_name(char const*, int)::class_suffix+881554
and on linux-x64:
External addresses table: 143 entries, 77297 accesses
0: 22334 0x00007f35d5b9c000 : ''
1: 19789 0x00007f35d55eea1f : 'should not reach here'
2: 18366 0x00007f35d5747bb8 : 'MacroAssembler::decode_heap_oop: heap base corrupted?'
3: 5036 0x00007f35d56e4d40 : 'uncommon trap returned which should never happen'
4: 3643 0x00007f35d57479f8 : 'MacroAssembler::encode_heap_oop: heap base corrupted?'
Few points about difference in output:
1. aarch64 does not use `ExternalAddess` or any relocation for messages (strings).
2. `stub: forward exception` corresponds to `StubRoutines::forward_exception_entry()` for which C2 generates tail-call from [C2's stubs](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/generateOptoStub.cpp#L258C48-L258C87). It is difficult to convert it to `RuntimeAddress` because how relocation for constants in C2 are handled.
3. linux-x64 implementation of `dlladdr()`, I used to print C++ symbol name, only works for functions:
`0x00007f35d5b9c000` points to `CompressedOops::_narrow_oop._base` from code in [MacroAssembler::verify_heapbase()](https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/x86/macroAssembler_x86.cpp#L5760) and on aarch64 [verify_heapbase()](https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp#L2959) is empty (guarded by `#if 0`).
4. I think `ClassLoader::file_name_for_class_name()+...` on MacOSX-x64 corresponds to strings on linux-x64.
Additionally I moved asserts before locks in `ExternalsRecorder` methods.
Tested: tier1-3, xcomp, stress
-------------
Commit messages:
- 8337396: Cleanup usage of ExternalAddess
Changes: https://git.openjdk.org/jdk/pull/20412/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=20412&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8337396
Stats: 104 lines in 5 files changed: 86 ins; 3 del; 15 mod
Patch: https://git.openjdk.org/jdk/pull/20412.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/20412/head:pull/20412
PR: https://git.openjdk.org/jdk/pull/20412
More information about the hotspot-dev
mailing list