RFR: 8163014: Mysterious/wrong value for "long" frame local variable on 64-bit

dean.long at oracle.com dean.long at oracle.com
Fri Sep 9 17:54:17 UTC 2016

  614   movq(Address(rsp, 0), r);
615 movptr(Address(rsp, Interpreter::expr_offset_in_bytes(1)), NULL_WORD );

I wish these two looked more similar.  I guess movq is the same as 
movprt, and


could be used at 614?

329 str(zr, pre(esp, -wordSize));
330 str(r, pre(esp, -wordsize));

Do you want to use a single stp here?


On 9/9/16 9:51 AM, Max Ockner wrote:
> Oops. Here is version 2: 
> http://cr.openjdk.java.net/~mockner/8163014.hotspot.03/
> Max
> On 9/8/2016 12:26 PM, Max Ockner wrote:
>> Here is version 2 of this fix.
>>  - Added copyright to LocalLongHelper.java
>>  - Switched LocalLongTest.java to run with -Xint instead of -Xcomp, 
>> and cleaned up some copypaste garbage.
>>  - changed the test directory name from locallong to LocalLong.
>> Reran test with -Xint.
>> Thanks,
>> Max
>> On 9/7/2016 9:47 AM, Coleen Phillimore wrote:
>>> Max,
>>> http://cr.openjdk.java.net/~mockner/8163014.01/test/runtime/locallong/LocalLongHelper.java.html 
>>> There's a lot in this test, but I can't think of a different way to 
>>> inspect the stack to find out if the long unused slot is zeroed. 
>>> This file is missing a copyright, and I think the directory should 
>>> be LocalLong (I think our new convention of test directory names is 
>>> capitalized).  I think we should keep the test in the hotspot 
>>> repository even though it uses the StackWalk API because otherwise 
>>> it won't be run with hotspot changes on an ad-hoc or nightly basis.
>>> http://cr.openjdk.java.net/~mockner/8163014.01/test/runtime/locallong/LocalLongTest.java.html 
>>> I thought the idea was to run this with -Xint not -Xcomp?
>>> The interpreter changes look good.
>>> Coleen
>>> On 9/6/16 5:33 PM, Max Ockner wrote:
>>>> Hello,
>>>> Please review this multi-platform fix for the stack walk API.
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8163014
>>>> Webrev: http://cr.openjdk.java.net/~mockner/8163014.01/
>>>> In 64 bits, long values can fit into a single slot, but two slots 
>>>> are still used. The high slot contains garbage. This normally 
>>>> wouldn't matter since it is never read from but the stack walk API 
>>>> expects to display useful information. This is an issue when 
>>>> displaying longs from local variables, so this means we can kill 
>>>> any garbage off by zeroing it when it is pushed to the stack in the 
>>>> previous frame. This solution zeroes the high byte of a long value 
>>>> when it is being pushed to the stack (in push_l).
>>>> This applies to x86, aarch64, and sparc. This change does not apply 
>>>> to ppc, though the bug almost certainly does affect it. I have left 
>>>> ppc untouched since I don't have access to the hardware required to 
>>>> reproduce the bug and test the fix.
>>>> I have adapted the reproducer from the bug into a test. It is 
>>>> curently sitting in runtime/locallong, but I believe there must be 
>>>> a better place for it.
>>>> Thanks,
>>>> Max

More information about the hotspot-runtime-dev mailing list