584 uint32_t bitfield_bit_size,
585 uint32_t bitfield_bit_offset)
const {
586 assert(bitfield_bit_size <= 64);
587 uint64_t uval64 =
GetMaxU64(offset_ptr, size);
589 if (bitfield_bit_size == 0)
592 int32_t lsbcount = bitfield_bit_offset;
594 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
599 uint64_t bitfield_mask =
600 (bitfield_bit_size == 64
601 ? std::numeric_limits<uint64_t>::max()
602 : ((
static_cast<uint64_t
>(1) << bitfield_bit_size) - 1));
603 if (!bitfield_mask && bitfield_bit_offset == 0 && bitfield_bit_size == 64)
606 uval64 &= bitfield_mask;
612 uint32_t bitfield_bit_size,
613 uint32_t bitfield_bit_offset)
const {
614 assert(size >= 1 &&
"GetMaxS64Bitfield size must be >= 1");
615 assert(size <= 8 &&
"GetMaxS64Bitfield size must be <= 8");
616 int64_t sval64 =
GetMaxS64(offset_ptr, size);
617 if (bitfield_bit_size == 0)
619 int32_t lsbcount = bitfield_bit_offset;
621 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
624 uint64_t bitfield_mask = llvm::maskTrailingOnes<uint64_t>(bitfield_bit_size);
625 sval64 &= bitfield_mask;
627 if (sval64 & ((
static_cast<uint64_t
>(1)) << (bitfield_bit_size - 1)))
628 sval64 |= ~bitfield_mask;
697 void *dst_void_ptr,
offset_t dst_len,
706 assert(dst_void_ptr !=
nullptr);
711 assert(dst_byte_order ==
m_byte_order || dst_len == 1 || dst_len == 2 ||
712 dst_len == 4 || dst_len == 8 || dst_len == 10 || dst_len == 16 ||
721 uint8_t *dst =
static_cast<uint8_t *
>(dst_void_ptr);
722 const uint8_t *src =
PeekData(src_offset, src_len);
724 if (dst_len >= src_len) {
728 const size_t num_zeroes = dst_len - src_len;
732 ::memset(dst, 0, num_zeroes);
735 ::memcpy(dst + num_zeroes, src, src_len);
737 for (uint32_t i = 0; i < src_len; ++i)
738 dst[i + num_zeroes] = src[src_len - 1 - i];
743 for (uint32_t i = 0; i < src_len; ++i)
744 dst[i] = src[src_len - 1 - i];
746 ::memcpy(dst, src, src_len);
750 ::memset(dst + src_len, 0, num_zeroes);
760 ::memcpy(dst, src + (src_len - dst_len), dst_len);
763 for (uint32_t i = 0; i < dst_len; ++i)
764 dst[i] = src[dst_len - 1 - i];
770 for (uint32_t i = 0; i < dst_len; ++i)
771 dst[i] = src[src_len - 1 - i];
774 ::memcpy(dst, src, dst_len);
909 offset_t length, uint64_t base_addr,
910 uint32_t num_per_line,
919 for (offset = start_offset, end_offset = offset + length, count = 0;
920 ValidOffset(offset) && offset < end_offset; ++count) {
921 if ((count % num_per_line) == 0) {
929 sstr.
Printf(
"0x%8.8" PRIx64
":",
930 static_cast<uint64_t
>(base_addr + (offset - start_offset)));
938 char ch =
GetU8(&offset);
939 sstr.
Printf(
" %c", llvm::isPrint(ch) ? ch :
' ');