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

Reply via email to