[Fwd: Request for review (S): CR 6889740 - G1: OpenDS fails with "unhandled exception in compiled code"]
john cuthbertson - Sun Microsystems
John.Cuthbertson at Sun.COM
Wed Oct 28 11:01:38 PDT 2009
Hi Tom,
I think you only need the additional variant that takes the void* in
order to make this a compile time problem. Adding that prototype first
flagged the other calls in do_oop_store as compile time errors. As long
as we have that then any call to store_heap_oop added in the future
would be caught.
JohnC
On 10/28/09 10:35, Tom Rodriguez wrote:
> But don't you need all three variants to turn this into a compile time
> problem? I'm ok with what you've done. You should note that the new
> variant is only there to deal with the use of NULL since all other oop
> constants should be using jobject.
>
> tom
>
> On Oct 28, 2009, at 9:35 AM, john cuthbertson - Sun Microsystems wrote:
>
>> Hi Christian,
>>
>> The main reason was just to avoid changing the call-sites and make it
>> consistent with the other generator routines. I don't have a strong
>> preference either way.
>>
>> Thanks for looking at the code,
>>
>> JohnC
>>
>> On 10/28/09 01:36, Christian Thalinger wrote:
>>> On Tue, 2009-10-27 at 15:10 -0700, john cuthbertson - Sun Microsystems
>>> wrote:
>>>
>>>
>>>> Can I have a couple of volunteers to review the proposed fix for this
>>>> bug? The webrev can be found at
>>>>
>>>> http://cr.openjdk.java.net/~johnc/6889740/webrev.0/
>>>> .
>>>>
>>>> The issue is that bad code was being generated for the store operation
>>>> in the null case of the aastore bytecode template. The bad code was
>>>> caused by there being only one version of the store_heap_oop routine
>>>> that took a Register as the second argument. When the calling code
>>>> passed in NULL_WORD (0) to this routine the value was used as a
>>>> Register
>>>> encoding and converted to Register(0), which is rax. Thus the
>>>> generated
>>>> store was "mov (dst), $rax" instead of "mov (dst), $0x0". This is
>>>> normally not a problem as the preceding code in the template
>>>> fetches the
>>>> value to be stored into rax. When the G1 pre-barrier code calls the
>>>> runtime, however, the value in rax can be overwritten and the heap can
>>>> become corrupted.
>>>>
>>>>
>>>
>>> Why do you actually pass in a src and then assert on it's value?
>>>
>>> +void MacroAssembler::store_heap_oop(Address dst, intptr_t src) {
>>> + assert(src == NULL_WORD, "use something else otherwise");
>>>
>>> It seems it must be null anyway and we could use something like:
>>>
>>> void MacroAssembler::store_heap_oop_null(Address dst) {
>>>
>>> -- Christian
>>>
>>>
>>>
>>
>
More information about the hotspot-compiler-dev
mailing list