On Tue, 7 Mar 2023 13:30:50 GMT, Coleen Phillimore <[email protected]> wrote:
>> The current structure used to store the resolution information for
>> invokedynamic, ConstantPoolCacheEntry, is difficult to interpret due to its
>> ambigious fields f1 and f2. This structure can hold information for fields,
>> methods, and invokedynamics and each of its fields can hold different types
>> of values depending on the entry.
>>
>> This enhancement proposes a new structure to exclusively contain
>> invokedynamic information in a manner that is easy to interpret and easy to
>> extend. Resolved invokedynamic entries will be stored in an array in the
>> constant pool cache and the operand of the invokedynamic bytecode will be
>> rewritten to be the index into this array.
>>
>> Any areas that previously accessed invokedynamic data from
>> ConstantPoolCacheEntry will be replaced with accesses to this new array and
>> structure. Verified with tier1-9 tests.
>>
>> The PPC was provided by @reinrich and the RISCV port was provided by
>> @DingliZhang and @zifeihan.
>>
>> This change supports the following platforms: x86, aarch64, PPC, and RISCV
>
> src/hotspot/cpu/ppc/templateTable_ppc_64.cpp line 53:
>
>> 51:
>> 52: #undef __
>> 53: #define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__,
>> __LINE__, _masm)->
>
> What is this? Is this something useful for debugging the template
> interpreter? Probably doesn't belong with this change but might be nice to
> have (?) @reinrich
Yes this is really useful when debugging the template interpreter. It annotates
the disassembly with the generator source code. It helped tracking down a bug
in the ppc part oft this pr. Other platforms have it too.
Example:
invokedynamic 186 invokedynamic [0x00003fff80075a00, 0x00003fff80075dc8] 968
bytes
--------------------------------------------------------------------------------
0x00003fff80075a00: std r17,0(r15) ;;@FILE:
src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
;; 2185: aep = __
pc(); __ push_ptr(); __ b(L);
0x00003fff80075a04: addi r15,r15,-8
0x00003fff80075a08: b 0x00003fff80075a40 ;; 2185: aep = __
pc(); __ push_ptr(); __ b(L);
0x00003fff80075a0c: stfs f15,0(r15) ;; 2186: fep = __
pc(); __ push_f(); __ b(L);
0x00003fff80075a10: addi r15,r15,-8
0x00003fff80075a14: b 0x00003fff80075a40 ;; 2186: fep = __
pc(); __ push_f(); __ b(L);
0x00003fff80075a18: stfd f15,-8(r15) ;; 2187: dep = __
pc(); __ push_d(); __ b(L);
0x00003fff80075a1c: addi r15,r15,-16
0x00003fff80075a20: b 0x00003fff80075a40 ;; 2187: dep = __
pc(); __ push_d(); __ b(L);
0x00003fff80075a24: li r0,0 ;; 2188: lep = __
pc(); __ push_l(); __ b(L);
0x00003fff80075a28: std r0,0(r15)
0x00003fff80075a2c: std r17,-8(r15)
0x00003fff80075a30: addi r15,r15,-16
0x00003fff80075a34: b 0x00003fff80075a40 ;; 2188: lep = __
pc(); __ push_l(); __ b(L);
0x00003fff80075a38: stw r17,0(r15) ;; 2189: __
align(32, 12, 24); // align L
;; 2191: iep = __
pc(); __ push_i();
0x00003fff80075a3c: addi r15,r15,-8
0x00003fff80075a40: li r21,1 ;; 2192: vep = __
pc();
;; 2193: __
bind(L);
;;@FILE:
src/hotspot/share/interpreter/templateInterpreterGenerator.cpp
;; 366: __
verify_FPU(1, t->tos_in());
;;@FILE:
src/hotspot/cpu/ppc/templateTable_ppc_64.cpp
;; 2293: __
load_resolved_indy_entry(cache, index);
0x00003fff80075a44: lwax r21,r14,r21
0x00003fff80075a48: nand r21,r21,r21
0x00003fff80075a4c: ld r31,40(r27)
0x00003fff80075a50: rldicr r21,r21,4,59
0x00003fff80075a54: addi r21,r21,8
0x00003fff80075a58: add r31,r31,r21
0x00003fff80075a5c: ld r22,0(r31) ;; 2294: __
ld_ptr(method, in_bytes(ResolvedIndyEntry::method_offset()), cache);
0x00003fff80075a60: cmpdi r22,0 ;; 2297: __
cmpdi(CCR0, method, 0);
0x00003fff80075a64: bne- 0x00003fff80075b94 ;; 2298: __
bne(CCR0, resolved);,bo=0b00100[no_hint]
0x00003fff80075a68: li r4,186 ;; 2304: __
li(R4_ARG2, code);
0x00003fff80075a6c: ld r11,0(r1) ;; 2305: __
call_VM(noreg, entry, R4_ARG2, true);
-------------
PR: https://git.openjdk.org/jdk/pull/12778