Undefined behavior in C1 LIR_OprDesc causes SEGV in fastdebug build

XMLWordPrintable

    • b24

      Building HotSpot with LLVM 13 fails due to SEGV at FrameMap::java_calling_convention(GrowableArray<BasicType> const*, bool). See attached log.

      The root cause is the following code in LIR_OprDesc:
        // Conversion
        intptr_t value() const { return (intptr_t) this; }

      This pattern is a source of undefined behavior in C++. This is similar to the issue with markOop/markOopDesc that was fixed in JDK-8229258.

      In this case, the undefined behavior happens with:
        bool check_value_mask(intptr_t mask, intptr_t masked_value) const {
          return (value() & mask) == masked_value;
        }
      Compiler can make various optimizations if it believes "this" pointer is aligned. The LLVM optimization that tripped this is https://reviews.llvm.org/rG16d03818412415c56efcd482d18c0cbdf712524c , which is a roll-forward of https://reviews.llvm.org/D99790.

      Properly fixing this requires wide refactoring of the use cases of LIR_OprDesc.

      Colleagues James Y Knight and [~rasbold] have contributed a workaround patch with some hacks to reduce the patch size. I will publish this partial fix to collect initial feedback, and see if we could proceed with the patch, or if there are volunteers to pick up this work.

            Assignee:
            Man Cao
            Reporter:
            Man Cao
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: