RFR: ShenandoahRuntime::load_reference_barrier_native should not accept second parameter
Zhengyu Gu
zgu at redhat.com
Thu Sep 5 20:12:04 UTC 2019
Looks good.
Thanks,
-Zhengyu
On 9/5/19 3:45 PM, Aleksey Shipilev wrote:
> Hi,
>
> There are massive x86_32 failures with sh/jdk, but only in release mode. Zhengyu pinpointed it to
> this changeset:
>
> changeset: 56771:40c0f1f47ca5
> parent: 56666:af48b07d0312
> parent: 56770:28ab01c06755
> user: rkennke
> date: Sun Jul 28 22:14:16 2019 +0200
> summary: Merge
>
> However, both parents (af48b07d0312 and 28ab01c06755) are running fine! So whatever broke it was
> done in the merge itself.
>
> I believe the cause is calling ShenandoahRuntime::load_reference_barrier_native from everywhere with
> only one argument (the object itself), but the native method signature actually expects another
> argument. So calling convention gets foobared. This might be why we only see it with x86_32, where
> second argument is passed on stack, and so stack becomes foobared after this call.
>
> Fix:
>
> diff -r 40c0f1f47ca5 src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp
> --- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Sun Jul 28 22:14:16 2019 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Thu Sep 05 21:38:06 2019 +0200
> @@ -74,5 +74,5 @@
> JRT_END
>
> -JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_native(oopDesc * src, oop* load_addr))
> +JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_native(oopDesc * src))
> return (oopDesc*) ShenandoahBarrierSet::barrier_set()->oop_load_from_native_barrier(oop(src));
> JRT_END
> diff -r 40c0f1f47ca5 src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp
> --- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Sun Jul 28 22:14:16 2019 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Thu Sep 05 21:38:06 2019 +0200
> @@ -42,5 +42,5 @@
> static oopDesc* load_reference_barrier_fixup_narrow(oopDesc* src, narrowOop* load_addr);
>
> - static oopDesc* load_reference_barrier_native(oopDesc* src, oop* load_addr);
> + static oopDesc* load_reference_barrier_native(oopDesc* src);
>
> static void shenandoah_clone_barrier(oopDesc* obj);
>
> Testing: hotspot_gc_shenandoah x86_32 {fastdebug,release}
>
More information about the shenandoah-dev
mailing list