diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -565,7 +565,9 @@ "__amdgpu_device_library_preserve_asan_functions_ptr", nullptr, llvm::GlobalVariable::NotThreadLocal); addCompilerUsedGlobal(Var); - getModule().addModuleFlag(llvm::Module::Override, "amdgpu_hostcall", 1); + if (!getModule().getModuleFlag("amdgpu_hostcall")) { + getModule().addModuleFlag(llvm::Module::Override, "amdgpu_hostcall", 1); + } } emitLLVMUsed(); diff --git a/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu b/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa \ +// RUN: -fcuda-is-device -target-cpu gfx906 -fsanitize=address \ +// RUN: -O3 -x hip | FileCheck -check-prefixes=MFCHECK %s + +// MFCHECK: !llvm.module.flags = !{![[FLAG1:[0-9]+]], ![[FLAG2:[0-9]+]]} +// MFCHECK: ![[FLAG1]] = !{i32 4, !"amdgpu_hostcall", i32 1} + +// Test to check hostcall module flag metadata is generated correctly +// when a program has printf call and compiled with -fsanitize=address. +#include "Inputs/cuda.h" +__device__ void non_kernel() { + printf("sanitized device function"); +} + +__global__ void kernel() { + non_kernel(); +} +