575 uint32_t bitfield_bit_size,
576 uint32_t bitfield_bit_offset)
const {
577 assert(bitfield_bit_size <= 64);
578 uint64_t uval64 =
GetMaxU64(offset_ptr, size);
580 if (bitfield_bit_size == 0)
583 int32_t lsbcount = bitfield_bit_offset;
585 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
590 uint64_t bitfield_mask =
591 (bitfield_bit_size == 64
592 ? std::numeric_limits<uint64_t>::max()
593 : ((
static_cast<uint64_t
>(1) << bitfield_bit_size) - 1));
594 if (!bitfield_mask && bitfield_bit_offset == 0 && bitfield_bit_size == 64)
597 uval64 &= bitfield_mask;
603 uint32_t bitfield_bit_size,
604 uint32_t bitfield_bit_offset)
const {
605 assert(size >= 1 &&
"GetMaxS64Bitfield size must be >= 1");
606 assert(size <= 8 &&
"GetMaxS64Bitfield size must be <= 8");
607 int64_t sval64 =
GetMaxS64(offset_ptr, size);
608 if (bitfield_bit_size == 0)
610 int32_t lsbcount = bitfield_bit_offset;
612 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
615 uint64_t bitfield_mask = llvm::maskTrailingOnes<uint64_t>(bitfield_bit_size);
616 sval64 &= bitfield_mask;
618 if (sval64 & ((
static_cast<uint64_t
>(1)) << (bitfield_bit_size - 1)))
619 sval64 |= ~bitfield_mask;
661 ByteOrder dst_byte_order,
void *dst)
const {
662 const uint8_t *src =
PeekData(offset, length);
666 assert(length == 1 || length == 2 || length == 4 || length == 8 ||
667 length == 10 || length == 16 || length == 32);
669 for (uint32_t i = 0; i < length; ++i)
670 (
static_cast<uint8_t *
>(dst))[i] = src[length - i - 1];
672 ::memcpy(dst, src, length);
692 void *dst_void_ptr,
offset_t dst_len,
701 assert(dst_void_ptr !=
nullptr);
706 assert(dst_byte_order ==
m_byte_order || dst_len == 1 || dst_len == 2 ||
707 dst_len == 4 || dst_len == 8 || dst_len == 10 || dst_len == 16 ||
716 uint8_t *dst =
static_cast<uint8_t *
>(dst_void_ptr);
717 const uint8_t *src =
PeekData(src_offset, src_len);
719 if (dst_len >= src_len) {
723 const size_t num_zeroes = dst_len - src_len;
727 ::memset(dst, 0, num_zeroes);
730 ::memcpy(dst + num_zeroes, src, src_len);
732 for (uint32_t i = 0; i < src_len; ++i)
733 dst[i + num_zeroes] = src[src_len - 1 - i];
738 for (uint32_t i = 0; i < src_len; ++i)
739 dst[i] = src[src_len - 1 - i];
741 ::memcpy(dst, src, src_len);
745 ::memset(dst + src_len, 0, num_zeroes);
755 ::memcpy(dst, src + (src_len - dst_len), dst_len);
758 for (uint32_t i = 0; i < dst_len; ++i)
759 dst[i] = src[dst_len - 1 - i];
765 for (uint32_t i = 0; i < dst_len; ++i)
766 dst[i] = src[src_len - 1 - i];
769 ::memcpy(dst, src, dst_len);
904 offset_t length, uint64_t base_addr,
905 uint32_t num_per_line,
914 for (offset = start_offset, end_offset = offset + length, count = 0;
915 ValidOffset(offset) && offset < end_offset; ++count) {
916 if ((count % num_per_line) == 0) {
924 sstr.
Printf(
"0x%8.8" PRIx64
":",
925 static_cast<uint64_t
>(base_addr + (offset - start_offset)));
933 char ch =
GetU8(&offset);
934 sstr.
Printf(
" %c", llvm::isPrint(ch) ? ch :
' ');