diff --git a/compiler-rt/test/hwasan/TestCases/global.c b/compiler-rt/test/hwasan/TestCases/global.c index 5a1dcb47ad3a0b..e1a7fd72f2b883 100644 --- a/compiler-rt/test/hwasan/TestCases/global.c +++ b/compiler-rt/test/hwasan/TestCases/global.c @@ -5,8 +5,7 @@ // RUN: not %run %t -1 2>&1 | FileCheck --check-prefixes=CHECK,LSYM %s // RUN: not %env_hwasan_opts=symbolize=0 %run %t -1 2>&1 | FileCheck --check-prefixes=CHECK,LNOSYM %s -// Global aliasing is not implemented on x86. -// XFAIL: x86_64 +// REQUIRES: pointer-tagging int x = 1; diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 060cc1c98c45f0..a1f7486b010bea 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -501,9 +501,7 @@ void HWAddressSanitizer::initializeModule() { // x86_64 currently has two modes: // - Intel LAM (default) - // - pointer aliasing - // Pointer aliasing mode is heap only. LAM mode is heap+stack, with support - // planned for globals as well. + // - pointer aliasing (heap only) bool IsX86_64 = TargetTriple.getArch() == Triple::x86_64; UsePageAliases = ClUsePageAliases && IsX86_64; InstrumentWithCalls = IsX86_64 ? true : ClInstrumentWithCalls; @@ -554,8 +552,7 @@ void HWAddressSanitizer::initializeModule() { bool InstrumentGlobals = ClGlobals.getNumOccurrences() ? ClGlobals : NewRuntime; - // TODO: Support globals for x86_64 in non-aliasing mode. - if (InstrumentGlobals && !IsX86_64) + if (InstrumentGlobals && !UsePageAliases) instrumentGlobals(); bool InstrumentPersonalityFunctions = @@ -1494,7 +1491,7 @@ void HWAddressSanitizer::instrumentGlobals() { Hasher.update(M.getSourceFileName()); MD5::MD5Result Hash; Hasher.final(Hash); - uint8_t Tag = Hash[0]; + uint8_t Tag = Hash[0] & TagMaskByte; for (GlobalVariable *GV : Globals) { // Skip tag 0 in order to avoid collisions with untagged memory. diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/X86/globals.ll b/llvm/test/Instrumentation/HWAddressSanitizer/X86/globals.ll new file mode 100644 index 00000000000000..a0860279f875d6 --- /dev/null +++ b/llvm/test/Instrumentation/HWAddressSanitizer/X86/globals.ll @@ -0,0 +1,33 @@ +; RUN: opt < %s -S -hwasan -mtriple=x86_64-unknown-linux-gnu | FileCheck %s + +; CHECK: @__start_hwasan_globals = external hidden constant [0 x i8] +; CHECK: @__stop_hwasan_globals = external hidden constant [0 x i8] + +; CHECK: @hwasan.note = private constant { i32, i32, i32, [8 x i8], i32, i32 } { i32 8, i32 8, i32 3, [8 x i8] c"LLVM\00\00\00\00", i32 trunc (i64 sub (i64 ptrtoint ([0 x i8]* @__start_hwasan_globals to i64), i64 ptrtoint ({ i32, i32, i32, [8 x i8], i32, i32 }* @hwasan.note to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([0 x i8]* @__stop_hwasan_globals to i64), i64 ptrtoint ({ i32, i32, i32, [8 x i8], i32, i32 }* @hwasan.note to i64)) to i32) }, section ".note.hwasan.globals", comdat($hwasan.module_ctor), align 4 + +; CHECK: @hwasan.dummy.global = private constant [0 x i8] zeroinitializer, section "hwasan_globals", comdat($hwasan.module_ctor), !associated [[NOTE:![0-9]+]] + +; CHECK: @four.hwasan = private global { i32, [12 x i8] } { i32 1, [12 x i8] c"\00\00\00\00\00\00\00\00\00\00\00," }, align 16 +; CHECK: @four.hwasan.descriptor = private constant { i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint ({ i32, [12 x i8] }* @four.hwasan to i64), i64 ptrtoint ({ i32, i32 }* @four.hwasan.descriptor to i64)) to i32), i32 738197508 }, section "hwasan_globals", !associated [[FOUR:![0-9]+]] + +; CHECK: @sixteen.hwasan = private global [16 x i8] zeroinitializer, align 16 +; CHECK: @sixteen.hwasan.descriptor = private constant { i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint ([16 x i8]* @sixteen.hwasan to i64), i64 ptrtoint ({ i32, i32 }* @sixteen.hwasan.descriptor to i64)) to i32), i32 754974736 }, section "hwasan_globals", !associated [[SIXTEEN:![0-9]+]] + +; CHECK: @huge.hwasan = private global [16777232 x i8] zeroinitializer, align 16 +; CHECK: @huge.hwasan.descriptor = private constant { i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint ([16777232 x i8]* @huge.hwasan to i64), i64 ptrtoint ({ i32, i32 }* @huge.hwasan.descriptor to i64)) to i32), i32 788529136 }, section "hwasan_globals", !associated [[HUGE:![0-9]+]] +; CHECK: @huge.hwasan.descriptor.1 = private constant { i32, i32 } { i32 trunc (i64 add (i64 sub (i64 ptrtoint ([16777232 x i8]* @huge.hwasan to i64), i64 ptrtoint ({ i32, i32 }* @huge.hwasan.descriptor.1 to i64)), i64 16777200) to i32), i32 771751968 }, section "hwasan_globals", !associated [[HUGE]] + +; CHECK: @four = alias i32, inttoptr (i64 add (i64 ptrtoint ({ i32, [12 x i8] }* @four.hwasan to i64), i64 6341068275337658368) to i32*) +; CHECK: @sixteen = alias [16 x i8], inttoptr (i64 add (i64 ptrtoint ([16 x i8]* @sixteen.hwasan to i64), i64 6485183463413514240) to [16 x i8]*) +; CHECK: @huge = alias [16777232 x i8], inttoptr (i64 add (i64 ptrtoint ([16777232 x i8]* @huge.hwasan to i64), i64 6629298651489370112) to [16777232 x i8]*) + +; CHECK: [[NOTE]] = !{{{{}} i32, i32, i32, [8 x i8], i32, i32 }* @hwasan.note} +; CHECK: [[FOUR]] = !{{{{}} i32, [12 x i8] }* @four.hwasan} +; CHECK: [[SIXTEEN]] = !{[16 x i8]* @sixteen.hwasan} +; CHECK: [[HUGE]] = !{[16777232 x i8]* @huge.hwasan} + +source_filename = "foo" + +@four = global i32 1 +@sixteen = global [16 x i8] zeroinitializer +@huge = global [16777232 x i8] zeroinitializer