Index: lib/hwasan/hwasan.cc =================================================================== --- lib/hwasan/hwasan.cc +++ lib/hwasan/hwasan.cc @@ -449,6 +449,23 @@ return AddTagToPointer(p, tag); } +struct GlobalInfo { + uptr addr; + uptr size; + uptr tag; +}; + +void __hwasan_register_globals(void *globals, uptr count) { + GlobalInfo *gi = static_cast(globals); + for (uptr i = 0; i < count; ++i) + TagMemoryAligned(gi[i].addr, gi[i].size, gi[i].tag); +} + +void __hwasan_unregister_globals(void *globals, uptr count) { + GlobalInfo *gi = static_cast(globals); + for (uptr i = 0; i < count; ++i) TagMemoryAligned(gi[i].addr, gi[i].size, 0); +} + void __hwasan_handle_longjmp(const void *sp_dst) { uptr dst = (uptr)sp_dst; // HWASan does not support tagged SP. Index: lib/hwasan/hwasan_interface_internal.h =================================================================== --- lib/hwasan/hwasan_interface_internal.h +++ lib/hwasan/hwasan_interface_internal.h @@ -201,6 +201,10 @@ void *__hwasan_memset(void *s, int c, uptr n); SANITIZER_INTERFACE_ATTRIBUTE void *__hwasan_memmove(void *dest, const void *src, uptr n); +SANITIZER_INTERFACE_ATTRIBUTE +void __hwasan_register_globals(void *globals, uptr count); +SANITIZER_INTERFACE_ATTRIBUTE +void __hwasan_unregister_globals(void *globals, uptr count); } // extern "C" #endif // HWASAN_INTERFACE_INTERNAL_H Index: test/hwasan/TestCases/globals.c =================================================================== --- test/hwasan/TestCases/globals.c +++ test/hwasan/TestCases/globals.c @@ -0,0 +1,15 @@ +// RUN: %clang_hwasan %s -mllvm -hwasan-instrument-globals -o %t && not %run %t 2>&1 | FileCheck %s +// REQUIRES: stable-runtime + +#include +long Q = 42; + +int main() { + memset(&Q, 0, 32); + // CHECK: ERROR: HWAddressSanitizer: tag-mismatch on address + // CHECK: WRITE of size 32 at {{.*}} tags: [[PTR_TAG:..]]/[[MEM_TAG:..]] (ptr/mem) + // CHECK: Offset to first bad byte is in range [16, 32) + // CHECK: Memory tags around the buggy address (one tag corresponds to 16 bytes): + // CHECK: =>{{.*}}[[PTR_TAG]]{{[[:space:]]\[}}[[MEM_TAG]] + return 0; +}