diff options
| author | shafik <syaghmour@apple.com> | 2019-12-05 09:28:08 -0800 |
|---|---|---|
| committer | shafik <syaghmour@apple.com> | 2019-12-05 10:03:53 -0800 |
| commit | fffd70291e124efc4a5bd475dccfc41cbc4bca8a (patch) | |
| tree | c4ae742441f5f3ec6fc4a90a18d5e82cd2171d21 /lldb/source/Utility | |
| parent | ef7267def69f9416b53388a5b5ea612bed9573d9 (diff) | |
| download | bcm5719-llvm-fffd70291e124efc4a5bd475dccfc41cbc4bca8a.tar.gz bcm5719-llvm-fffd70291e124efc4a5bd475dccfc41cbc4bca8a.zip | |
[LLDB] Replacing use of ul suffix in GetMaxU64Bitfield since it not guarenteed to be 64 bit
GetMaxU64Bitfield(...) uses the ul suffix but we require a 64 bit unsigned integer and ul could be 32 bit. So this replacing it with a explicit cast and refactors the code around it to use an early exit.
Differential Revision: https://reviews.llvm.org/D70992
Diffstat (limited to 'lldb/source/Utility')
| -rw-r--r-- | lldb/source/Utility/DataExtractor.cpp | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/lldb/source/Utility/DataExtractor.cpp b/lldb/source/Utility/DataExtractor.cpp index f642a8fc763..4e45baf3aa4 100644 --- a/lldb/source/Utility/DataExtractor.cpp +++ b/lldb/source/Utility/DataExtractor.cpp @@ -577,18 +577,28 @@ int64_t DataExtractor::GetMaxS64(offset_t *offset_ptr, size_t byte_size) const { uint64_t DataExtractor::GetMaxU64Bitfield(offset_t *offset_ptr, size_t size, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset) const { + assert(bitfield_bit_size <= 64); uint64_t uval64 = GetMaxU64(offset_ptr, size); - if (bitfield_bit_size > 0) { - int32_t lsbcount = bitfield_bit_offset; - if (m_byte_order == eByteOrderBig) - lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size; - if (lsbcount > 0) - uval64 >>= lsbcount; - uint64_t bitfield_mask = ((1ul << bitfield_bit_size) - 1); - if (!bitfield_mask && bitfield_bit_offset == 0 && bitfield_bit_size == 64) - return uval64; - uval64 &= bitfield_mask; - } + + if (bitfield_bit_size == 0) + return uval64; + + int32_t lsbcount = bitfield_bit_offset; + if (m_byte_order == eByteOrderBig) + lsbcount = size * 8 - bitfield_bit_offset - bitfield_bit_size; + + if (lsbcount > 0) + uval64 >>= lsbcount; + + uint64_t bitfield_mask = + (bitfield_bit_size == 64 + ? std::numeric_limits<uint64_t>::max() + : ((static_cast<uint64_t>(1) << bitfield_bit_size) - 1)); + if (!bitfield_mask && bitfield_bit_offset == 0 && bitfield_bit_size == 64) + return uval64; + + uval64 &= bitfield_mask; + return uval64; } |

