diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2013-11-06 16:48:53 +0000 | 
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2013-11-06 16:48:53 +0000 | 
| commit | f21a844f60ae6c74fcf1fddca32461acce3c1ee0 (patch) | |
| tree | 56d79f94966870db1cecd65a7264510a25fd1cba /source/Core/DataExtractor.cpp | |
| parent | 37d22554be9f5a677dad2a95b7ef22fe59c66a8a (diff) | |
Notes
Diffstat (limited to 'source/Core/DataExtractor.cpp')
| -rw-r--r-- | source/Core/DataExtractor.cpp | 74 | 
1 files changed, 54 insertions, 20 deletions
| diff --git a/source/Core/DataExtractor.cpp b/source/Core/DataExtractor.cpp index 518faeb71ea7..d1f3c09c2305 100644 --- a/source/Core/DataExtractor.cpp +++ b/source/Core/DataExtractor.cpp @@ -935,6 +935,10 @@ DataExtractor::ExtractBytes (offset_t offset, offset_t length, ByteOrder dst_byt      {          if (dst_byte_order != GetByteOrder())          { +            // Validate that only a word- or register-sized dst is byte swapped +            assert (length == 1 || length == 2 || length == 4 || length == 8 || +                    length == 10 || length == 16 || length == 32); +              for (uint32_t i=0; i<length; ++i)                  ((uint8_t*)dst)[i] = src[length - i - 1];          } @@ -945,6 +949,21 @@ DataExtractor::ExtractBytes (offset_t offset, offset_t length, ByteOrder dst_byt      return 0;  } +// Extract data as it exists in target memory +lldb::offset_t +DataExtractor::CopyData (offset_t offset, +                         offset_t length, +                         void *dst) const +{ +    const uint8_t *src = PeekData (offset, length); +    if (src) +    { +        ::memcpy (dst, src, length); +        return length; +    } +    return 0; +} +  // Extract data and swap if needed when doing the copy  lldb::offset_t  DataExtractor::CopyByteOrderedData (offset_t src_offset, @@ -963,7 +982,12 @@ DataExtractor::CopyByteOrderedData (offset_t src_offset,      assert (dst_void_ptr != NULL);      assert (dst_len > 0);      assert (dst_byte_order == eByteOrderBig || dst_byte_order == eByteOrderLittle); -     + +    // Validate that only a word- or register-sized dst is byte swapped +    assert (dst_byte_order == m_byte_order || dst_len == 1 || dst_len == 2 || +            dst_len == 4 || dst_len == 8 || dst_len == 10 || dst_len == 16 || +            dst_len == 32); +      // Must have valid byte orders set in this object and for destination      if (!(dst_byte_order == eByteOrderBig || dst_byte_order == eByteOrderLittle) ||          !(m_byte_order == eByteOrderBig || m_byte_order == eByteOrderLittle)) @@ -1330,18 +1354,22 @@ DumpAPInt (Stream *s, const DataExtractor &data, lldb::offset_t offset, lldb::of  static float half2float (uint16_t half)  { +#ifdef _MSC_VER +    llvm_unreachable("half2float not implemented for MSVC"); +#else      union{ float       f; uint32_t    u;}u;      int32_t v = (int16_t) half;      if( 0 == (v & 0x7c00))      {          u.u = v & 0x80007FFFU; -        return u.f * 0x1.0p125f; +        return u.f * ldexpf(1, 125);      }      v <<= 13;      u.u = v | 0x70000000U; -    return u.f * 0x1.0p-112f; +    return u.f * ldexpf(1, -112); +#endif  }  lldb::offset_t @@ -1703,29 +1731,35 @@ DataExtractor::Dump (Stream *s,          case eFormatHexUppercase:              {                  bool wantsuppercase  = (item_format == eFormatHexUppercase); -                if (item_byte_size <= 8) +                switch (item_byte_size)                  { +                case 1: +                case 2: +                case 4: +                case 8:                      s->Printf(wantsuppercase ? "0x%*.*" PRIX64 : "0x%*.*" PRIx64, (int)(2 * item_byte_size), (int)(2 * item_byte_size), GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, item_bit_offset)); -                } -                else -                { -                    assert (item_bit_size == 0 && item_bit_offset == 0); -                    s->PutCString("0x"); -                    const uint8_t *bytes = (const uint8_t* )GetData(&offset, item_byte_size); -                    if (bytes) +                    break; +                default:                      { -                        uint32_t idx; -                        if (m_byte_order == eByteOrderBig) -                        { -                            for (idx = 0; idx < item_byte_size; ++idx) -                                s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[idx]); -                        } -                        else +                        assert (item_bit_size == 0 && item_bit_offset == 0); +                        const uint8_t *bytes = (const uint8_t* )GetData(&offset, item_byte_size); +                        if (bytes)                          { -                            for (idx = 0; idx < item_byte_size; ++idx) -                                s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[item_byte_size - 1 - idx]); +                            s->PutCString("0x"); +                            uint32_t idx; +                                if (m_byte_order == eByteOrderBig) +                            { +                                for (idx = 0; idx < item_byte_size; ++idx) +                                    s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[idx]); +                            } +                            else +                            { +                                for (idx = 0; idx < item_byte_size; ++idx) +                                    s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[item_byte_size - 1 - idx]); +                            }                          }                      } +                    break;                  }              }              break; | 
