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;
688 void *dst_void_ptr,
offset_t dst_len,
697 assert(dst_void_ptr !=
nullptr);
702 assert(dst_byte_order ==
m_byte_order || dst_len == 1 || dst_len == 2 ||
703 dst_len == 4 || dst_len == 8 || dst_len == 10 || dst_len == 16 ||
712 uint8_t *dst =
static_cast<uint8_t *
>(dst_void_ptr);
713 const uint8_t *src =
PeekData(src_offset, src_len);
715 if (dst_len >= src_len) {
719 const size_t num_zeroes = dst_len - src_len;
723 ::memset(dst, 0, num_zeroes);
726 ::memcpy(dst + num_zeroes, src, src_len);
728 for (uint32_t i = 0; i < src_len; ++i)
729 dst[i + num_zeroes] = src[src_len - 1 - i];
734 for (uint32_t i = 0; i < src_len; ++i)
735 dst[i] = src[src_len - 1 - i];
737 ::memcpy(dst, src, src_len);
741 ::memset(dst + src_len, 0, num_zeroes);
751 ::memcpy(dst, src + (src_len - dst_len), dst_len);
754 for (uint32_t i = 0; i < dst_len; ++i)
755 dst[i] = src[dst_len - 1 - i];
761 for (uint32_t i = 0; i < dst_len; ++i)
762 dst[i] = src[src_len - 1 - i];
765 ::memcpy(dst, src, dst_len);
900 offset_t length, uint64_t base_addr,
901 uint32_t num_per_line,
910 for (offset = start_offset, end_offset = offset + length, count = 0;
911 ValidOffset(offset) && offset < end_offset; ++count) {
912 if ((count % num_per_line) == 0) {
920 sstr.
Printf(
"0x%8.8" PRIx64
":",
921 static_cast<uint64_t
>(base_addr + (offset - start_offset)));
929 char ch =
GetU8(&offset);
930 sstr.
Printf(
" %c", llvm::isPrint(ch) ? ch :
' ');