RFR(S): 8026407: VM is crashed on linux-ppc and linux-i586 when there is not enough ReservedCodeCacheSize specified
Albert Noll
albert.noll at oracle.com
Thu Oct 24 07:39:09 PDT 2013
John, Christian,
thanks for providing background information to this bug. This certainly
helps me in understanding this issue better.
I will file a bug to further work on this issue.
Best,
Albert
On 23.10.2013 19:41, Christian Thalinger wrote:
>
> On Oct 23, 2013, at 10:25 AM, John Rose <john.r.rose at oracle.com
> <mailto:john.r.rose at oracle.com>> wrote:
>
>> On Oct 22, 2013, at 4:25 PM, Christian Thalinger
>> <christian.thalinger at oracle.com
>> <mailto:christian.thalinger at oracle.com>> wrote:
>>
>>>
>>> On Oct 22, 2013, at 7:23 AM, Albert Noll <albert.noll at oracle.com
>>> <mailto:albert.noll at oracle.com>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> I worked on this bug for some time but so far I was not able to
>>>> determine its root cause.
>>>> However, I have found a work around that hides the problem. Since
>>>> it is important
>>>> for the embedded version of hotspot to work with small code cache
>>>> sizes + nashorn,
>>>> I would suggest to apply this workaround, and file another bug that
>>>> investigates the problem
>>>> (e.g., a P4) that we can defer.
>>>>
>>>> bug:https://bugs.openjdk.java.net/browse/JDK-8026407
>>>> webrev:http://cr.openjdk.java.net/~anoll/8026407/webrev.00/
>>>> <http://cr.openjdk.java.net/%7Eanoll/8026407/webrev.00/>
>>>>
>>>> problem: If we do not create native wrapper for method handle
>>>> intrinsics, we get
>>>> segfaults in compiled code. Also, if
>>>> -XX:VerifyAdapterCalls is enabled, we
>>>> get:
>>>>
>>>> assert(false) failed: DEBUG MESSAGE: i2c adapter
>>>> must return to an interpreter frame
>>>>
>>>> The bug seems to be specific to method handle
>>>> intrinsics. I assume that we either call
>>>> the wrong entry point to a compiled method, or there
>>>> is a bug somewhere in the generated
>>>> adapters. Method handle intrinsics are treated
>>>> specifically in various parts of the code and
>>>> I do not yet really understand everything.
>>>
>>> I can tell you why (as could John): in order to properly handle the
>>> appendix argument for out-of-line calls we are using a small
>>> trampoline that pops off the appendix argument and jumps to the
>>> target (see gen_special_dispatch in SharedRuntime).
>>>
>>> Since normal compiled-to-compiled calls are not able to handle such
>>> a thing we MUST generate an adapter in this case. If we can't
>>> generate one and use it we can not execute the out-of-line method
>>> handle calls.
>>>
>>
>> Thanks, Chris; that's correct.
>>
>> Albert, I think you are seeing edge cases (common enough when memory
>> is tight) where compiled code A gets successfully compiled but a stub
>> B that it needs fails to compile.
>>
>> If this is so, the order of compilation needs to change somehow so
>> that B precedes A, or else A needs to ensure that B compiles before A
>> needs it.
>>
>> An analogous case is the i2c/c2i adapters for all methods. There was
>> a time (IIRC) that they were generated more lazily, but we had to
>> make them eager, since we could get the same failure pattern: A
>> compiles but B doesn't, where B is the i2c or c2i adapter.
>
> That is some interesting bit of history and finally gives an answer to
> my question why the I2C/C2I adapters are eagerly generated. The
> reason why I stumbled across this a couple weeks ago is I wanted to
> see if we can generate some (all?) of our adapters from snippet type
> code and not have handwritten assembler code for them.
>
>>
>> A third option, which I would prefer if it were feasible, would be to
>> make the compiled paths for the method handle stubs always inlined
>> into the compiled code. But this is probably difficult, because
>> method handles can point to method handle methods (and do pretty
>> often!), so that it is not always possible for the compiler to know
>> that a call will need to go through a stub's compiled entry point.
>> There are ways around this also, but it's tricky.
>>
>> It seems likely to me that there is some kind of economical way to
>> make sure that the stubs (B) are always created before their users
>> (A) get compiled.
>>
>> Albert, thank you for dissecting this, and so many other gnarly code
>> storage issues.
>>
>> — John
>>
>>
>>>> solution: As mentioned above, the solution is a workaround and does
>>>> not solve the real problem.
>>>> Nevertheless it improves stability of hotspot and the
>>>> impact of the proposed changes are
>>>> marginal.
>>>>
>>>> testing: Running nashorn with small code cache size (3m) on PPC and x86
>>>>
>>>> There will be a separate mail for closed part changes.
>>>>
>>>> Many thanks in advance,
>>>> Albert
>>>>
>>>> P.S.: If anyone has an idea of where the problem could be, please
>>>> let me know!
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20131024/42d5222f/attachment.html
More information about the hotspot-compiler-dev
mailing list