diff --git a/compiler-rt/lib/hwasan/hwasan.h b/compiler-rt/lib/hwasan/hwasan.h --- a/compiler-rt/lib/hwasan/hwasan.h +++ b/compiler-rt/lib/hwasan/hwasan.h @@ -37,8 +37,15 @@ // TBI (Top Byte Ignore) feature of AArch64: bits [63:56] are ignored in address // translation and can be used to store a tag. -const unsigned kAddressTagShift = 56; -const uptr kAddressTagMask = 0xFFUL << kAddressTagShift; +constexpr unsigned kAddressTagShift = 56; +constexpr unsigned kTagBits = 8; + +// Mask for extracting tag bits from the lower 8 bits. +constexpr uptr kTagMask = (1UL << kTagBits) - 1; + +// Masks for extracting and removing tags from full pointers. +constexpr uptr kAddressTagMask = 0xFFUL << kAddressTagShift; +constexpr uptr kAddressUntagMask = ~(kTagMask << kAddressTagShift); // Minimal alignment of the shadow base address. Determines the space available // for threads and stack histories. This is an ABI constant. @@ -54,7 +61,7 @@ } static inline uptr UntagAddr(uptr tagged_addr) { - return tagged_addr & ~kAddressTagMask; + return tagged_addr & kAddressUntagMask; } static inline void *UntagPtr(const void *tagged_ptr) { @@ -63,7 +70,7 @@ } static inline uptr AddTagToPointer(uptr p, tag_t tag) { - return (p & ~kAddressTagMask) | ((uptr)tag << kAddressTagShift); + return (p & kAddressUntagMask) | ((uptr)tag << kAddressTagShift); } namespace __hwasan { diff --git a/compiler-rt/lib/hwasan/hwasan_checks.h b/compiler-rt/lib/hwasan/hwasan_checks.h --- a/compiler-rt/lib/hwasan/hwasan_checks.h +++ b/compiler-rt/lib/hwasan/hwasan_checks.h @@ -81,7 +81,7 @@ template __attribute__((always_inline, nodebug)) static void CheckAddress(uptr p) { - uptr ptr_raw = p & ~kAddressTagMask; + uptr ptr_raw = p & kAddressUntagMask; tag_t mem_tag = *(tag_t *)MemToShadow(ptr_raw); if (UNLIKELY(!PossiblyShortTagMatches(mem_tag, p, 1 << LogSize))) { SigTrap<0x20 * (EA == ErrorAction::Recover) + @@ -97,7 +97,7 @@ if (sz == 0) return; tag_t ptr_tag = GetTagFromPointer(p); - uptr ptr_raw = p & ~kAddressTagMask; + uptr ptr_raw = p & kAddressUntagMask; tag_t *shadow_first = (tag_t *)MemToShadow(ptr_raw); tag_t *shadow_last = (tag_t *)MemToShadow(ptr_raw + sz); for (tag_t *t = shadow_first; t < shadow_last; ++t) diff --git a/compiler-rt/lib/hwasan/hwasan_thread.cpp b/compiler-rt/lib/hwasan/hwasan_thread.cpp --- a/compiler-rt/lib/hwasan/hwasan_thread.cpp +++ b/compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -121,10 +121,10 @@ if (!random_buffer_) random_buffer_ = random_state_ = xorshift(random_state_); CHECK(random_buffer_); - tag = random_buffer_ & 0xFF; - random_buffer_ >>= 8; + tag = random_buffer_ & kTagMask; + random_buffer_ >>= kTagBits; } else { - tag = random_state_ = (random_state_ + 1) & 0xFF; + tag = random_state_ = (random_state_ + 1) & kTagMask; } } while (!tag); return tag;