498 uint32_t bitfield_bit_size,
499 uint32_t bitfield_bit_offset)
const {
500 assert(bitfield_bit_size <= 64);
501 uint64_t uval64 =
GetMaxU64(offset_ptr, size);
503 if (bitfield_bit_size == 0)
506 int32_t lsbcount = bitfield_bit_offset;
508 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
513 uint64_t bitfield_mask =
514 (bitfield_bit_size == 64
515 ? std::numeric_limits<uint64_t>::max()
516 : ((
static_cast<uint64_t
>(1) << bitfield_bit_size) - 1));
517 if (!bitfield_mask && bitfield_bit_offset == 0 && bitfield_bit_size == 64)
520 uval64 &= bitfield_mask;
526 uint32_t bitfield_bit_size,
527 uint32_t bitfield_bit_offset)
const {
528 assert(size >= 1 &&
"GetMaxS64Bitfield size must be >= 1");
529 assert(size <= 8 &&
"GetMaxS64Bitfield size must be <= 8");
530 int64_t sval64 =
GetMaxS64(offset_ptr, size);
531 if (bitfield_bit_size == 0)
533 int32_t lsbcount = bitfield_bit_offset;
535 lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size;
538 uint64_t bitfield_mask = llvm::maskTrailingOnes<uint64_t>(bitfield_bit_size);
539 sval64 &= bitfield_mask;
541 if (sval64 & ((
static_cast<uint64_t
>(1)) << (bitfield_bit_size - 1)))
542 sval64 |= ~bitfield_mask;
611 void *dst_void_ptr,
offset_t dst_len,
620 assert(dst_void_ptr !=
nullptr);
625 assert(dst_byte_order ==
m_byte_order || dst_len == 1 || dst_len == 2 ||
626 dst_len == 4 || dst_len == 8 || dst_len == 10 || dst_len == 16 ||
635 uint8_t *dst =
static_cast<uint8_t *
>(dst_void_ptr);
636 const uint8_t *src =
PeekData(src_offset, src_len);
638 if (dst_len >= src_len) {
642 const size_t num_zeroes = dst_len - src_len;
646 ::memset(dst, 0, num_zeroes);
649 ::memcpy(dst + num_zeroes, src, src_len);
651 for (uint32_t i = 0; i < src_len; ++i)
652 dst[i + num_zeroes] = src[src_len - 1 - i];
657 for (uint32_t i = 0; i < src_len; ++i)
658 dst[i] = src[src_len - 1 - i];
660 ::memcpy(dst, src, src_len);
664 ::memset(dst + src_len, 0, num_zeroes);
674 ::memcpy(dst, src + (src_len - dst_len), dst_len);
677 for (uint32_t i = 0; i < dst_len; ++i)
678 dst[i] = src[dst_len - 1 - i];
684 for (uint32_t i = 0; i < dst_len; ++i)
685 dst[i] = src[src_len - 1 - i];
688 ::memcpy(dst, src, dst_len);
823 offset_t length, uint64_t base_addr,
824 uint32_t num_per_line,
833 for (offset = start_offset, end_offset = offset + length, count = 0;
834 ValidOffset(offset) && offset < end_offset; ++count) {
835 if ((count % num_per_line) == 0) {
843 sstr.
Printf(
"0x%8.8" PRIx64
":",
844 static_cast<uint64_t
>(base_addr + (offset - start_offset)));
852 char ch =
GetU8(&offset);
853 sstr.
Printf(
" %c", llvm::isPrint(ch) ? ch :
' ');