tberghammer created this revision. tberghammer added reviewers: labath, clayborg. tberghammer added a subscriber: lldb-commits.
Fix 2 LLVM assertion caused by an API miss-ues in Scalar APInt::trunc only works if the destination size is strictly smaller then the source size while APInt::sext and APInt::zext only works if the destination size is strictly larger then the source size. http://reviews.llvm.org/D19535 Files: source/Core/Scalar.cpp Index: source/Core/Scalar.cpp =================================================================== --- source/Core/Scalar.cpp +++ source/Core/Scalar.cpp @@ -2787,16 +2787,28 @@ case Scalar::e_slonglong: case Scalar::e_sint128: case Scalar::e_sint256: - m_integer = m_integer.ashr(bit_offset).trunc(bit_size).sext(8 * GetByteSize()); + { + m_integer = m_integer.ashr(bit_offset); + if (m_integer.getBitWidth() > bit_size) + m_integer = m_integer.trunc(bit_size); + if (m_integer.getBitWidth() < bit_size) + m_integer = m_integer.sext(8 * GetByteSize()); return true; + } case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: case Scalar::e_uint256: - m_integer = m_integer.lshr(bit_offset).trunc(bit_size).zext(8 * GetByteSize()); + { + m_integer = m_integer.lshr(bit_offset); + if (m_integer.getBitWidth() > bit_size) + m_integer = m_integer.trunc(bit_size); + if (m_integer.getBitWidth() < bit_size) + m_integer = m_integer.zext(8 * GetByteSize()); return true; + } } return false; }
Index: source/Core/Scalar.cpp =================================================================== --- source/Core/Scalar.cpp +++ source/Core/Scalar.cpp @@ -2787,16 +2787,28 @@ case Scalar::e_slonglong: case Scalar::e_sint128: case Scalar::e_sint256: - m_integer = m_integer.ashr(bit_offset).trunc(bit_size).sext(8 * GetByteSize()); + { + m_integer = m_integer.ashr(bit_offset); + if (m_integer.getBitWidth() > bit_size) + m_integer = m_integer.trunc(bit_size); + if (m_integer.getBitWidth() < bit_size) + m_integer = m_integer.sext(8 * GetByteSize()); return true; + } case Scalar::e_uint: case Scalar::e_ulong: case Scalar::e_ulonglong: case Scalar::e_uint128: case Scalar::e_uint256: - m_integer = m_integer.lshr(bit_offset).trunc(bit_size).zext(8 * GetByteSize()); + { + m_integer = m_integer.lshr(bit_offset); + if (m_integer.getBitWidth() > bit_size) + m_integer = m_integer.trunc(bit_size); + if (m_integer.getBitWidth() < bit_size) + m_integer = m_integer.zext(8 * GetByteSize()); return true; + } } return false; }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits