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.

-------------

Commit messages:
 - 8261236: C2: ClhsdbJstackXcompStress test fails when StressGCM is enabled

Changes: https://git.openjdk.java.net/jdk/pull/4807/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4807&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8261236
  Stats: 58 lines in 3 files changed: 12 ins; 28 del; 18 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4807.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4807/head:pull/4807

PR: https://git.openjdk.java.net/jdk/pull/4807

Reply via email to