summaryrefslogtreecommitdiffstats
path: root/source/Core/DataExtractor.cpp
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2013-11-06 16:48:53 +0000
committeremaste <emaste@FreeBSD.org>2013-11-06 16:48:53 +0000
commitc727fe695d28799acb499e9961f11ec07d4f9fe2 (patch)
tree56d79f94966870db1cecd65a7264510a25fd1cba /source/Core/DataExtractor.cpp
parent2e8c9206a971efee1b77ad2ae852265d6f4ecaa0 (diff)
downloadFreeBSD-src-c727fe695d28799acb499e9961f11ec07d4f9fe2.zip
FreeBSD-src-c727fe695d28799acb499e9961f11ec07d4f9fe2.tar.gz
Import lldb as of SVN r194122
Sponsored by: DARPA, AFRL
Diffstat (limited to 'source/Core/DataExtractor.cpp')
-rw-r--r--source/Core/DataExtractor.cpp74
1 files changed, 54 insertions, 20 deletions
diff --git a/source/Core/DataExtractor.cpp b/source/Core/DataExtractor.cpp
index 518faeb..d1f3c09 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;
OpenPOWER on IntegriCloud