From afa208212aca7b80bd7ce45a80fad3b82c2d858c Mon Sep 17 00:00:00 2001 From: "Zhao, Yang2" Date: Wed, 12 Jun 2024 22:34:32 -0700 Subject: [PATCH 1/5] fix metadata in esimd --- .../Instrumentation/AddressSanitizer.cpp | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 92d72184f759a..d2c5328fd75d6 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1289,9 +1289,7 @@ static void ExtendSpirKernelArgs(Module &M, FunctionAnalysisManager &FAM) { Types.push_back(I->getType()); } - // New argument type: uintptr_t as(1)*, as it's allocated in USM buffer, and - // it can also be treated as a pointer point to the base address of private - // shadow memory + // New argument: uintptr_t as(1)*, which is allocated in shared USM buffer Types.push_back(IntptrTy->getPointerTo(kSpirOffloadGlobalAS)); FunctionType *NewFTy = FunctionType::get(F->getReturnType(), Types, false); @@ -1333,18 +1331,34 @@ static void ExtendSpirKernelArgs(Module &M, FunctionAnalysisManager &FAM) { // Fixup metadata IRBuilder<> Builder(M.getContext()); - auto FixupMetadata = [&NewF](StringRef MDName, Constant *NewV) { + auto FixupMetadata = [&NewF](StringRef MDName, Metadata *NewV) { auto *Node = NewF->getMetadata(MDName); if (!Node) return; SmallVector NewMD(Node->operands()); - NewMD.emplace_back(ConstantAsMetadata::get(NewV)); + NewMD.emplace_back(NewV); + // NewMD.emplace_back(ConstantAsMetadata::get(NewV)); NewF->setMetadata(MDName, llvm::MDNode::get(NewF->getContext(), NewMD)); }; - FixupMetadata("kernel_arg_buffer_location", Builder.getInt32(-1)); - FixupMetadata("kernel_arg_runtime_aligned", Builder.getFalse()); - FixupMetadata("kernel_arg_exclusive_ptr", Builder.getFalse()); + FixupMetadata("kernel_arg_buffer_location", + ConstantAsMetadata::get(Builder.getInt32(-1))); + FixupMetadata("kernel_arg_runtime_aligned", + ConstantAsMetadata::get(Builder.getFalse())); + FixupMetadata("kernel_arg_exclusive_ptr", + ConstantAsMetadata::get(Builder.getFalse())); + + FixupMetadata( + "kernel_arg_addr_space", + ConstantAsMetadata::get(Builder.getInt32(kSpirOffloadGlobalAS))); + FixupMetadata("kernel_arg_access_qual", + MDString::get(M.getContext(), "read_write")); + FixupMetadata("kernel_arg_type", MDString::get(M.getContext(), "void*")); + FixupMetadata("kernel_arg_base_type", + MDString::get(M.getContext(), "void*")); + FixupMetadata("kernel_arg_type_qual", MDString::get(M.getContext(), "")); + FixupMetadata("kernel_arg_accessor_ptr", + ConstantAsMetadata::get(Builder.getFalse())); SpirFuncs.emplace_back(F, NewF); } From 429525766c1213ced720b284635dfec83e64e9a0 Mon Sep 17 00:00:00 2001 From: "Zhao, Yang2" Date: Mon, 24 Jun 2024 22:26:59 -0700 Subject: [PATCH 2/5] disbale asan when found esimd --- .../Transforms/Instrumentation/AddressSanitizer.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index d2c5328fd75d6..dfe46af45511b 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1273,7 +1273,8 @@ struct FunctionStackPoisoner : public InstVisitor { static void ExtendSpirKernelArgs(Module &M, FunctionAnalysisManager &FAM) { SmallVector SpirFixupFuncs; for (Function &F : M) { - if (F.getCallingConv() == CallingConv::SPIR_KERNEL) { + if (F.getCallingConv() == CallingConv::SPIR_KERNEL && + F.hasFnAttribute(Attribute::SanitizeAddress)) { SpirFixupFuncs.emplace_back(&F); } } @@ -1420,6 +1421,15 @@ PreservedAnalyses AddressSanitizerPass::run(Module &M, ClUseStackSafety ? &MAM.getResult(M) : nullptr; if (Triple(M.getTargetTriple()).isSPIR()) { + for (Function &F : M) { + // ESIMD kernel doesn't support noinline functions, so we can't + // support sanitizer for it + if (F.hasMetadata("sycl_explicit_simd")) { + // FIXME: we can't check if the kernel is ESIMD at UR, so we + // have to disable asan completely + return PreservedAnalyses::all(); + } + } ExtendSpirKernelArgs(M, FAM); } From 03128bedd068cadb712f60a7b1911fd81a46c5de Mon Sep 17 00:00:00 2001 From: "Zhao, Yang2" Date: Mon, 24 Jun 2024 22:35:34 -0700 Subject: [PATCH 3/5] disbale asan when found esimd --- .../Instrumentation/AddressSanitizer.cpp | 1 + .../AddressSanitizer/SPIRV/sycl_esimd.ll | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 llvm/test/Instrumentation/AddressSanitizer/SPIRV/sycl_esimd.ll diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index dfe46af45511b..f61aadc98f102 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1425,6 +1425,7 @@ PreservedAnalyses AddressSanitizerPass::run(Module &M, // ESIMD kernel doesn't support noinline functions, so we can't // support sanitizer for it if (F.hasMetadata("sycl_explicit_simd")) { + F.removeFnAttr(Attribute::SanitizeAddress); // FIXME: we can't check if the kernel is ESIMD at UR, so we // have to disable asan completely return PreservedAnalyses::all(); diff --git a/llvm/test/Instrumentation/AddressSanitizer/SPIRV/sycl_esimd.ll b/llvm/test/Instrumentation/AddressSanitizer/SPIRV/sycl_esimd.ll new file mode 100644 index 0000000000000..1e1bc38c2f189 --- /dev/null +++ b/llvm/test/Instrumentation/AddressSanitizer/SPIRV/sycl_esimd.ll @@ -0,0 +1,17 @@ +; RUN: opt < %s -passes=asan -asan-instrumentation-with-call-threshold=0 -asan-stack=0 -asan-globals=0 -S | FileCheck %s + +target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64" +target triple = "spir64-unknown-unknown" + +@__spirv_BuiltInGlobalInvocationId = external addrspace(1) constant <3 x i64> + +; Function Attrs: sanitize_address +define spir_kernel void @esimd_kernel() #0 !sycl_explicit_simd !1 { +entry: + %0 = load i64, ptr addrspace(1) getelementptr inbounds (i8, ptr addrspace(1) @__spirv_BuiltInGlobalInvocationId, i64 8), align 8 + ret void +} +; CHECK-NOT: {{ sanitize_address }} + +attributes #0 = { sanitize_address } +!1 = !{} From 192c0ea537efc7537e007779159df3eee07b0f87 Mon Sep 17 00:00:00 2001 From: "Zhao, Yang2" Date: Wed, 26 Jun 2024 01:10:21 -0700 Subject: [PATCH 4/5] revert FixupMetadata --- .../Instrumentation/AddressSanitizer.cpp | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index f61aadc98f102..6de6c09cacb78 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1332,34 +1332,18 @@ static void ExtendSpirKernelArgs(Module &M, FunctionAnalysisManager &FAM) { // Fixup metadata IRBuilder<> Builder(M.getContext()); - auto FixupMetadata = [&NewF](StringRef MDName, Metadata *NewV) { + auto FixupMetadata = [&NewF](StringRef MDName, Constant *NewV) { auto *Node = NewF->getMetadata(MDName); if (!Node) return; SmallVector NewMD(Node->operands()); - NewMD.emplace_back(NewV); - // NewMD.emplace_back(ConstantAsMetadata::get(NewV)); + NewMD.emplace_back(ConstantAsMetadata::get(NewV)); NewF->setMetadata(MDName, llvm::MDNode::get(NewF->getContext(), NewMD)); }; - FixupMetadata("kernel_arg_buffer_location", - ConstantAsMetadata::get(Builder.getInt32(-1))); - FixupMetadata("kernel_arg_runtime_aligned", - ConstantAsMetadata::get(Builder.getFalse())); - FixupMetadata("kernel_arg_exclusive_ptr", - ConstantAsMetadata::get(Builder.getFalse())); - - FixupMetadata( - "kernel_arg_addr_space", - ConstantAsMetadata::get(Builder.getInt32(kSpirOffloadGlobalAS))); - FixupMetadata("kernel_arg_access_qual", - MDString::get(M.getContext(), "read_write")); - FixupMetadata("kernel_arg_type", MDString::get(M.getContext(), "void*")); - FixupMetadata("kernel_arg_base_type", - MDString::get(M.getContext(), "void*")); - FixupMetadata("kernel_arg_type_qual", MDString::get(M.getContext(), "")); - FixupMetadata("kernel_arg_accessor_ptr", - ConstantAsMetadata::get(Builder.getFalse())); + FixupMetadata("kernel_arg_buffer_location", Builder.getInt32(-1)); + FixupMetadata("kernel_arg_runtime_aligned", Builder.getFalse()); + FixupMetadata("kernel_arg_exclusive_ptr", Builder.getFalse()); SpirFuncs.emplace_back(F, NewF); } From 8c552f42aa1feb3ba45d8cfafe39a23444943250 Mon Sep 17 00:00:00 2001 From: "Zhao, Yang2" Date: Wed, 26 Jun 2024 01:29:58 -0700 Subject: [PATCH 5/5] fix removeFnAttr logic --- .../Instrumentation/AddressSanitizer.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 6de6c09cacb78..3f6380aa9b181 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1405,16 +1405,21 @@ PreservedAnalyses AddressSanitizerPass::run(Module &M, ClUseStackSafety ? &MAM.getResult(M) : nullptr; if (Triple(M.getTargetTriple()).isSPIR()) { - for (Function &F : M) { - // ESIMD kernel doesn't support noinline functions, so we can't - // support sanitizer for it + bool HasESIMDKernel = false; + + // ESIMD kernel doesn't support noinline functions, so we can't + // support sanitizer for it + for (Function &F : M) if (F.hasMetadata("sycl_explicit_simd")) { F.removeFnAttr(Attribute::SanitizeAddress); - // FIXME: we can't check if the kernel is ESIMD at UR, so we - // have to disable asan completely - return PreservedAnalyses::all(); + HasESIMDKernel = true; } - } + + // FIXME: we can't check if the kernel is ESIMD kernel at UR, so we + // have to disable ASan completely in this case + if (HasESIMDKernel) + return PreservedAnalyses::all(); + ExtendSpirKernelArgs(M, FAM); }