From fc13f3f80a06452c200f656dcd6d39d9d2b45990 Mon Sep 17 00:00:00 2001 From: Ryan Prichard Date: Wed, 12 Dec 2018 22:45:06 +0000 Subject: [PATCH] [hwasan] Android: Switch from TLS_SLOT_TSAN(8) to TLS_SLOT_SANITIZER(6) Summary: The change is needed to support ELF TLS in Android. See D55581 for the same change in compiler-rt. Reviewers: srhines, eugenis Reviewed By: eugenis Subscribers: srhines, llvm-commits Differential Revision: https://reviews.llvm.org/D55592 llvm-svn: 348983 --- lib/Transforms/Instrumentation/HWAddressSanitizer.cpp | 4 +++- test/Instrumentation/HWAddressSanitizer/prologue.ll | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 91021604169..0123b28773a 100644 --- a/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -703,10 +703,12 @@ Value *HWAddressSanitizer::untagPointer(IRBuilder<> &IRB, Value *PtrLong) { Value *HWAddressSanitizer::getHwasanThreadSlotPtr(IRBuilder<> &IRB, Type *Ty) { Module *M = IRB.GetInsertBlock()->getParent()->getParent(); if (TargetTriple.isAArch64() && TargetTriple.isAndroid()) { + // Android provides a fixed TLS slot for sanitizers. See TLS_SLOT_SANITIZER + // in Bionic's libc/private/bionic_tls.h. Function *ThreadPointerFunc = Intrinsic::getDeclaration(M, Intrinsic::thread_pointer); Value *SlotPtr = IRB.CreatePointerCast( - IRB.CreateConstGEP1_32(IRB.CreateCall(ThreadPointerFunc), 0x40), + IRB.CreateConstGEP1_32(IRB.CreateCall(ThreadPointerFunc), 0x30), Ty->getPointerTo(0)); return SlotPtr; } diff --git a/test/Instrumentation/HWAddressSanitizer/prologue.ll b/test/Instrumentation/HWAddressSanitizer/prologue.ll index 6b02b9863cd..d8e6d581904 100644 --- a/test/Instrumentation/HWAddressSanitizer/prologue.ll +++ b/test/Instrumentation/HWAddressSanitizer/prologue.ll @@ -29,7 +29,7 @@ define i32 @test_load(i32* %a) sanitize_hwaddress { ; CHECK-GLOBAL: load i64, i64* @__hwasan_shadow_memory_dynamic_address ; CHECK-TLS: %[[A:[^ ]*]] = call i8* @llvm.thread.pointer() -; CHECK-TLS: %[[B:[^ ]*]] = getelementptr i8, i8* %[[A]], i32 64 +; CHECK-TLS: %[[B:[^ ]*]] = getelementptr i8, i8* %[[A]], i32 48 ; CHECK-TLS: %[[C:[^ ]*]] = bitcast i8* %[[B]] to i64* ; CHECK-TLS: %[[D:[^ ]*]] = load i64, i64* %[[C]] ; CHECK-TLS: %[[E:[^ ]*]] = or i64 %[[D]], 4294967295 @@ -60,7 +60,7 @@ define void @test_alloca() sanitize_hwaddress { ; CHECK-GLOBAL: load i64, i64* @__hwasan_shadow_memory_dynamic_address ; CHECK-TLS: %[[A:[^ ]*]] = call i8* @llvm.thread.pointer() -; CHECK-TLS: %[[B:[^ ]*]] = getelementptr i8, i8* %[[A]], i32 64 +; CHECK-TLS: %[[B:[^ ]*]] = getelementptr i8, i8* %[[A]], i32 48 ; CHECK-TLS: %[[C:[^ ]*]] = bitcast i8* %[[B]] to i64* ; CHECK-TLS: %[[D:[^ ]*]] = load i64, i64* %[[C]]