On Fri, 16 Jul 2021 10:24:56 GMT, Nick Gasson <ngas...@openjdk.org> wrote:
> The clhsdb jstack command crashes when the debugged program is run with > `-Xcomp -XX:+StressGCM -XX:StressSeed=2` on AArch64: > > > sun.jvm.hotspot.utilities.AssertionFailure: sanity check > at jdk.hotspot.agent/sun.jvm.hotspot.utilities.Assert.that(Assert.java:32) > at > jdk.hotspot.agent/sun.jvm.hotspot.runtime.RegisterMap.setLocation(RegisterMap.java:160) > at > jdk.hotspot.agent/sun.jvm.hotspot.compiler.ImmutableOopMapSet.updateRegisterMap(ImmutableOopMapSet.java:303) > at > jdk.hotspot.agent/sun.jvm.hotspot.runtime.aarch64.AARCH64Frame.senderForCompiledFrame(AARCH64Frame.java:407) > > > The assertion failure here is: > > > Assert.that(0 <= i && i < regCount, "sanity check"); > > > I.e. there's an invalid register in the oop map. > > The problem seems to be caused by the changes in JDK-8231586 which changed > `OopMapValue::oop_types` from a bit mask to normal integer enum. However the > changes in the C++ code weren't mirrored in SA's OopMapStream which still > treats OopTypes as a bit mask. > > The particular oop map this is crashing on looks like this: > > > ImmutableOopMap {[24]=Oop [32]=Oop [40]=Derived_oop_[24] } pc offsets: 324 > > > The code is looking for callee saved values (type=2) by AND-ing with each oop > value type in the set, so it wrongly interprets the derived oop [40] (type=3) > as a callee saved register. > > This patch just mirrors the changes to the C++ code into the corresponding SA > classes. The C++ OopMapStream constructor no longer takes a type filter > argument and callers are expected filter themselves, so I've made the same > change to the Java code. > > This bug can also be seen using the clhsdb "disassemble" command. For > example the above oop map is currently printed incorrectly as: > > > OopMap: > NarrowOops:[40] > Callee saved:[40] = [24] > Derived oops:[40] = [24] > > > With this patch it becomes: > > > OopMap: > Oops:[24] [32] > Derived oops:[40] = [24] > > > This bug was reported on AArch64 but it seems to be just luck that we don't > see it on other platforms. > > Tested tier1 and hotspot_serviceability on AArch64 and x86. Good. ------------- Marked as reviewed by kvn (Reviewer). PR: https://git.openjdk.java.net/jdk/pull/4807