[9] RFR(S): 8071654: disassembler handles embedded OOPs not uniformly
Zoltán Majó
zoltan.majo at oracle.com
Wed Jan 28 18:37:44 UTC 2015
Hi Vladimir,
thank you for the feedback.
On 01/28/2015 07:09 PM, Vladimir Kozlov wrote:
> Good. Thank you for clarifying.
> I was confused because bugs says it produce different results. But you
> are saying that currently it produces the same output and we need only
> to cleanup code which is not used anymore. Right?
that is right. Currently the same output is produced and it would be
nice to keep it that way.
I think the bug description was not clear enough, sorry for that.
Thank you and best regards,
Zoltan
>
> Thanks,
> Vladimir
>
> On 1/28/15 9:59 AM, Zoltán Majó wrote:
>> Hi Vladimir,
>>
>>
>> thank you for the feedback.
>>
>> On 01/28/2015 06:33 PM, Vladimir Kozlov wrote:
>>> So this is just clean up since Universe::heap()->is_in(obj->klass()
>>> is false after PermGen removal.
>>
>> That is right.
>>
>>> Now you get only hexadecimal value and no comment when binutils does
>>> not indicate VM that the instruction has embedded
>>> oop. Right or I am wrong?
>>
>> No, we still get a comment in that case.
>>
>> If binutils does not indicate to the VM that an instruction contains
>> an embedded OOP, decode_env::print_address() is not
>> called. Therefore_nm->embeddedOop_at() is not called either. As a
>> result, we don't process the relocation information
>> for _nm and a hexadecimal value is printed.
>>
>> But decode_env::end_insn() is always called right after the current
>> instruction has been processed. Therefore,
>> _nm->print_code_comment_on() is called as well and all relocation
>> information (including those with type 'oop_type') are
>> printed.
>>
>> I checked by changing binutils to do some extra VM notifications.
>>
>> Please let me know if you think I miss/oversee anything.
>>
>> Thank you very much!
>>
>> Best regards,
>>
>>
>> Zoltan
>>
>>> If I am right, can we do something about that? I agree that we
>>> should not replace hexadecimal address but can we
>>> generate comment too because even if binutils does not report VM can
>>> see it: _nm->embeddedOop_at(cur_insn())
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 1/28/15 7:51 AM, Zoltán Majó wrote:
>>>> Hi,
>>>>
>>>>
>>>> please review the following small patch.
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8071654
>>>>
>>>>
>>>> Problem: The disassembler has two different ways of handling OOPs
>>>> embedded into instructions.
>>>>
>>>> 1) Embedded OOPs are printed in hexadecimal within a disassembled
>>>> instruction. The comment block following the
>>>> instruction contains the name of the OOP's class. For example:
>>>>
>>>> 0x00007f52ed58e3e4: mov $0x7f52c4e03d78,%rdi ; {oop(a
>>>> 'java/lang/Class' = 'java/lang/invoke/MethodHandle')}
>>>>
>>>> 2) Embedded OOPs are replaced in the disassembled instruction by
>>>> the OOP's class name (this functionality was available
>>>> only before PermGen removal, see JDK-8066438 for more details). The
>>>> comment block following the disassembled instruction
>>>> contains the same information *again* (the name of the OOP's
>>>> class). For example:
>>>>
>>>> 0x01882738: cmp edx, a 'sun/dyn/ToGeneric$A2'; {oop(a
>>>> 'sun/dyn/ToGeneric$A2')}
>>>>
>>>> (output taken from
>>>> https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly)
>>>>
>>>> Whether an OOP is replaced with its class name depends on the
>>>> external binutils library. For some types of instructions
>>>> (e.g., compares, jumps and calls on x86), binutils indicates to the
>>>> VM that there are addresses embedded into the
>>>> instruction (and then the VM applies Way 1). For some instructions
>>>> (e.g., movs on x86), binutils does not indicate to
>>>> the VM that the instruction contains an embedded address and the VM
>>>> applies Way 2.
>>>>
>>>>
>>>> Solution: This patch proposes that the disassembler handles OOPs in
>>>> a single way (Way 1): An embedded OOP's is printed
>>>> in hexadecimal within the instruction; the comment following the
>>>> disassembled instruction prints the OOP's class. This
>>>> way both the OOP as raw address and the OOP's class is available in
>>>> the disassembly by default.
>>>>
>>>> The patch proposes to not print an OOP's class in
>>>> decode_env::print_address() anymore; printing should be done only in
>>>> nmethod::print_code_comment_on(). Thenmethod::embeddedOop_at method
>>>> is not needed any more and is therefore removed.
>>>>
>>>> Webrev: http://cr.openjdk.java.net/~zmajo/8071654/webrev.00/
>>>>
>>>> Testing: manual testing, built + minimal tests with JPRT on all
>>>> supported platforms.
>>>>
>>>> Thank you!
>>>>
>>>> Best regards,
>>>>
>>>>
>>>> Zoltan
>>>>
>>
More information about the hotspot-compiler-dev
mailing list