[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
ampandey-1995 wrote: Fixes https://github.com/llvm/llvm-project/pull/125857 https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
nico wrote: This seems to break tests on my bot: http://45.33.8.238/linux/159455/step_6.txt Does the error make sense to you? https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 closed https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -1106,8 +1106,12 @@ bool AMDGPUToolChain::shouldSkipSanitizeOption(
// For simplicity, we only allow -fsanitize=address
SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
+ if (K != SanitizerKind::Address) {
ampandey-1995 wrote:
Hi @Joseph ,
Does this patch resolves the above issue
https://github.com/llvm/llvm-project/pull/125095.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 deleted https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -1106,8 +1106,12 @@ bool AMDGPUToolChain::shouldSkipSanitizeOption(
// For simplicity, we only allow -fsanitize=address
SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
+ if (K != SanitizerKind::Address) {
ampandey-1995 wrote:
Hi @Joseph ,
Does this patch resolves the above issue
https://github.com/llvm/llvm-project/pull/125095.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/yxsamliu approved this pull request. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -71,10 +71,10 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
- for (Arg *A : Args) {
-if (!llvm::is_contained(*DAL, A))
+ for (Arg *A : Args)
+if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
ampandey-1995 wrote:
Currently I think the scope of ```shouldSkipSanitizeOption``` is limited to
AMDGPU Derived Toolchains only.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -1106,8 +1106,12 @@ bool AMDGPUToolChain::shouldSkipSanitizeOption(
// For simplicity, we only allow -fsanitize=address
SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
+ if (K != SanitizerKind::Address) {
ampandey-1995 wrote:
Done.
Hi @yxsamliu & @jhuber6 , there is one complication with respect to OpenMP
toolchain i.e ```AMDGPUOpenMPToolchain```.
I am seeing diagnoseUnsupportedSanitizers is getting called twice for
AMDGPUOpenMP toolchain.
In ```Driver.cpp``` AMDGPUOpenMPToolchain objects are created twice.
**1. At line number 988.**
`#0 clang::driver::toolchains::ROCMToolChain::diagnoseUnsupportedSanitizers
(this=0x7e1ff5c21900, Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/AMDGPU.h:154
#1 0x5c2e0b53 in
clang::driver::toolchains::AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain
(this=0x7e1ff5c21900, D=..., Triple=..., HostTC=..., Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp:41
#2 0x5c22489b in
std::make_unique (__parameter_pack#0=...,
__parameter_pack#1=..., __parameter_pack#2=..., __parameter_pack#3=...) at
/usr/include/c++/12/bits/unique_ptr.h:1065
#3 0x5c1fa1ca in
clang::driver::Driver::CreateOffloadingDeviceToolChains (this=0x7fff8420,
C=..., Inputs=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:988
#4 0x5c2006d6 in clang::driver::Driver::BuildCompilation
(this=0x7fff8420, ArgList=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:1780
#5 0x59685f47 in clang_main(int, char**, llvm::ToolContext const&) ()
#6 0x5969a83a in main ()`
**2. At line number 1058**
`#0 clang::driver::toolchains::ROCMToolChain::diagnoseUnsupportedSanitizers
(this=0x7e1ff5c23100, Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/AMDGPU.h:154
#1 0x5c2e0b53 in
clang::driver::toolchains::AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain
(this=0x7e1ff5c23100, D=..., Triple=..., HostTC=..., Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp:41
#2 0x5c22489b in
std::make_unique (__parameter_pack#0=...,
__parameter_pack#1=..., __parameter_pack#2=..., __parameter_pack#3=...) at
/usr/include/c++/12/bits/unique_ptr.h:1065
#3 0x5c1fad00 in
clang::driver::Driver::CreateOffloadingDeviceToolChains (this=0x7fff8420,
C=..., Inputs=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:1058
#4 0x5c2006d6 in clang::driver::Driver::BuildCompilation
(this=0x7fff8420, ArgList=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:1780
#5 0x59685f47 in clang_main(int, char**, llvm::ToolContext const&) ()
#6 0x5969a83a in main ()`
With Hip there is only one HIPAMD toolchain.
`#0 clang::driver::toolchains::ROCMToolChain::diagnoseUnsupportedSanitizers
(this=0x7e1ff5c21900, Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/AMDGPU.h:154
#1 0x5c3e4727 in
clang::driver::toolchains::HIPAMDToolChain::HIPAMDToolChain
(this=0x7e1ff5c21900, D=..., Triple=..., HostTC=..., Args=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/ToolChains/HIPAMD.cpp:220
#2 0x5c23278a in
std::make_unique (__parameter_pack#0=...,
__parameter_pack#1=..., __parameter_pack#2=..., __parameter_pack#3=...) at
/usr/include/c++/12/bits/unique_ptr.h:1065
#3 0x5c21df4c in clang::driver::Driver::getOffloadingDeviceToolChain
(this=0x7fff8400, Args=..., Target=..., HostTC=...,
TargetDeviceOffloadKind=@0x7fff78f0: clang::driver::Action::OFK_HIP) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:6817
#4 0x5c1f9b47 in
clang::driver::Driver::CreateOffloadingDeviceToolChains (this=0x7fff8400,
C=..., Inputs=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:922
#5 0x5c2006d6 in clang::driver::Driver::BuildCompilation
(this=0x7fff8400, ArgList=...) at
/home/ampandey/trunk-toolchain/src-home/llvm-project/clang/lib/Driver/Driver.cpp:1780
#6 0x59685f47 in clang_main(
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/jhuber6 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -71,10 +71,10 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
- for (Arg *A : Args) {
-if (!llvm::is_contained(*DAL, A))
+ for (Arg *A : Args)
+if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
jhuber6 wrote:
I think this should probably go in `TranslateOpenMPTargetArgs` instead.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -1106,8 +1106,12 @@ bool AMDGPUToolChain::shouldSkipSanitizeOption(
// For simplicity, we only allow -fsanitize=address
SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
+ if (K != SanitizerKind::Address) {
yxsamliu wrote:
moving diag to this function will cause repeated diagnostic message since the
function is called for each argument.
you may want to refactor the diag handling to a common function but keep the
call sites at their original locations.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
ampandey-1995 wrote: ping https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 updated
https://github.com/llvm/llvm-project/pull/124754
>From 960eb5de4abcf21dec34e8932c94621733b9d11b Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Mon, 3 Feb 2025 10:57:17 +0530
Subject: [PATCH 1/4] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications using
option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 37
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 95 insertions(+)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 24d244ba6f0e18b..01f84a4e4bc5637 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -71,6 +81,33 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
+ if (DeviceOffloadKind == Action::OFK_OpenMP) {
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
+DAL->append(A);
+}
+
+if (!DAL->hasArg(options::OPT_march_EQ)) {
+ StringRef Arch = BoundArch;
+ if (Arch.empty()) {
+auto ArchsOrErr = getSystemGPUArchs(Args);
+if (!ArchsOrErr) {
+ std::string ErrMsg =
+ llvm::formatv("{0}", llvm::fmt_consume(ArchsOrErr.takeError()));
+ getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+ << llvm::Triple::getArchTypeName(getArch()) << ErrMsg <<
"-march";
+ Arch = OffloadArchToString(OffloadArch::HIPDefault);
+} else {
+ Arch = Args.MakeArgString(ArchsOrErr->front());
+}
+ }
+ DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), Arch);
+}
+
+return DAL;
+ }
+
for (Arg *A : Args) {
if (!llvm::is_contained(*DAL, A))
DAL->append(A);
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 000..03adeb8e6a7833c
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN:
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 updated
https://github.com/llvm/llvm-project/pull/124754
>From 960eb5de4abcf21dec34e8932c94621733b9d11b Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Mon, 3 Feb 2025 10:57:17 +0530
Subject: [PATCH 1/4] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications using
option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 37
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 95 insertions(+)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 24d244ba6f0e18b..01f84a4e4bc5637 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -71,6 +81,33 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
+ if (DeviceOffloadKind == Action::OFK_OpenMP) {
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
+DAL->append(A);
+}
+
+if (!DAL->hasArg(options::OPT_march_EQ)) {
+ StringRef Arch = BoundArch;
+ if (Arch.empty()) {
+auto ArchsOrErr = getSystemGPUArchs(Args);
+if (!ArchsOrErr) {
+ std::string ErrMsg =
+ llvm::formatv("{0}", llvm::fmt_consume(ArchsOrErr.takeError()));
+ getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+ << llvm::Triple::getArchTypeName(getArch()) << ErrMsg <<
"-march";
+ Arch = OffloadArchToString(OffloadArch::HIPDefault);
+} else {
+ Arch = Args.MakeArgString(ArchsOrErr->front());
+}
+ }
+ DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), Arch);
+}
+
+return DAL;
+ }
+
for (Arg *A : Args) {
if (!llvm::is_contained(*DAL, A))
DAL->append(A);
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 000..03adeb8e6a7833c
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN:
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 updated
https://github.com/llvm/llvm-project/pull/124754
>From 741fcf90830c6a30be851c43924e9ab95c40b8a7 Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Tue, 28 Jan 2025 15:15:01 +0530
Subject: [PATCH 1/3] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications
using option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 16 -
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 72 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 2b8917106afc14..243d9aac019498 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -72,9 +82,11 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
if (DeviceOffloadKind == Action::OFK_OpenMP) {
-for (Arg *A : Args)
- if (!llvm::is_contained(*DAL, A))
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
DAL->append(A);
+}
if (!DAL->hasArg(options::OPT_march_EQ)) {
StringRef Arch = BoundArch;
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 00..03adeb8e6a7833
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// FAIL-DAG: error: cannot find ROCm device library for ABI version 5; provide
its path via '--rocm-path' or '--rocm-device-lib-path', o
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 edited https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 updated
https://github.com/llvm/llvm-project/pull/124754
>From 741fcf90830c6a30be851c43924e9ab95c40b8a7 Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Tue, 28 Jan 2025 15:15:01 +0530
Subject: [PATCH 1/2] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications
using option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 16 -
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 72 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 2b8917106afc14..243d9aac019498 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -72,9 +82,11 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
if (DeviceOffloadKind == Action::OFK_OpenMP) {
-for (Arg *A : Args)
- if (!llvm::is_contained(*DAL, A))
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
DAL->append(A);
+}
if (!DAL->hasArg(options::OPT_march_EQ)) {
StringRef Arch = BoundArch;
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 00..03adeb8e6a7833
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// FAIL-DAG: error: cannot find ROCm device library for ABI version 5; provide
its path via '--rocm-path' or '--rocm-device-lib-path', o
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
ampandey-1995 wrote:
Yes Thanks for reviewing.
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 updated
https://github.com/llvm/llvm-project/pull/124754
>From 913db08256a8ee3077067d55667e37628d9ebd7c Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Tue, 28 Jan 2025 15:15:01 +0530
Subject: [PATCH 1/2] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications
using option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 16 -
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 72 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 3f0b3f2d86b3ede..9e9ee7ed26f5018 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -72,9 +82,11 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
if (DeviceOffloadKind == Action::OFK_OpenMP) {
-for (Arg *A : Args)
- if (!llvm::is_contained(*DAL, A))
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
DAL->append(A);
+}
if (!DAL->hasArg(options::OPT_march_EQ)) {
StringRef Arch = BoundArch;
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 000..03adeb8e6a7833c
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// FAIL-DAG: error: cannot find ROCm device library for ABI version 5; provide
its path via '--rocm-path' or '--rocm-device-lib-path
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
yxsamliu wrote:
HIPAMD toolchain has similar code. Is it possible to refactor them to share
common code?
https://github.com/llvm/llvm-project/pull/124754
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D, // Lookup binaries into the driver directory, this is used to // discover the 'amdgpu-arch' executable. getProgramPaths().push_back(getDriver().Dir); + // Diagnose unsupported sanitizer options only once. + if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize, ampandey-1995 wrote: Yes. We actually had a flag ```**-fgpu-sanitize**``` from the beginning of ASan project which actually used by every toolchain(hip,openmp,opencl) to enable device code instrumentation. Using ```**-fsanitize=address**``` enables asan instrumentation for host code , now for device when ```**-fgpu-sanitize**[Default always on]``` can be used alongwith ```**-fsanitize=address**``` but since it value is by default on so using ```-fgpu-sanitize``` only(without -fsanitize=address) would be a no-op effect for both host and device code. We only use the negative ```-fno-gpu-sanitize``` to disable device code asan instrumentation leaving only the host code asan instrumented. BTW, other checks are also done in progression i.e in ```shouldSkipSanitizeFunction``` which checks for ```:xnack+``` feature also in ```--offload-arch=``` option. In short asan instrumentation for both host and device is done using ```-fsanitize=address``` , there are inbuilt clang-driver checks for hip,openmp,opencl which if successful allows -fsanitize=address to pass forward to device toolchain cmd line job invocation otherwise it is skipped. If any edge tests cases missing please let me know @b-sumner , @yxsamliu , @jhuber6 ? https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
ampandey-1995 wrote: Hi all , the lit test is failing because it is dependent on PR **https://github.com/llvm/llvm-project/pull/123922** . Requesting @b-sumner , @yxsamliu , @jhuber6 to rereview again. Sorry in advance! https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D, // Lookup binaries into the driver directory, this is used to // discover the 'amdgpu-arch' executable. getProgramPaths().push_back(getDriver().Dir); + // Diagnose unsupported sanitizer options only once. + if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize, b-sumner wrote: Yes. This is the option to control GPU instrumentation and it is set by default via -fsanitze=address. Explicitly setting it allows one to disable GPU instrumentation for debugging, etc. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D, // Lookup binaries into the driver directory, this is used to // discover the 'amdgpu-arch' executable. getProgramPaths().push_back(getDriver().Dir); + // Diagnose unsupported sanitizer options only once. + if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize, yxsamliu wrote: -fgpu-sanitize was added during development of sanitizer for AMDGPU. Now it is mainly for debugging purpose to disable sanitizer on device side. Since there are existing apps using it, we need to send a deprecation note in ROCm release before removing it. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D, // Lookup binaries into the driver directory, this is used to // discover the 'amdgpu-arch' executable. getProgramPaths().push_back(getDriver().Dir); + // Diagnose unsupported sanitizer options only once. + if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize, jhuber6 wrote: @b-sumner I'm basing it on this, but it seems this isn't a new flag, so it's probably some existing behavior? https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
b-sumner wrote: > I'm referring to the fact that for a normal compile, if the user passes > `-fsanitize=address`, should that enable it for both the host and device? My > argument is that the user is capable of passing something like `-Xarch_host > -fsanitize=undefined -Xarch_device -fsanitize=address` if they want > fine-grained control, or don't want it on the CPU but want it on the CPU and > vice-versa. This patch adds `-fanitize-gpu` which is a completely separate > option that only works in this single case. I agree, -fsanitize=address is supposed to enable instrumentation on both host and device...and that is exactly what happens now. If this patch is affecting the existing behavior then something is wrong. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
jhuber6 wrote: > I'm not sure I follow the question exactly, but in my opinion it does not > make sense to independently control instrumentation for host and device. We > had to implement a means to control instrumentation on the device when > development started and after we changed its default once development was > complete we kept the option just in case. I'm referring to the fact that for a normal compile, if the user passes `-fsanitize=address`, should that enable it for both the host and device? My argument is that the user is capable of passing something like `-Xarch_host -fsanitize=undefined -Xarch_device -fsanitize=address` if they want fine-grained control, or don't want it on the CPU but want it on the CPU and vice-versa. This patch adds `-fanitize-gpu` which is a completely separate option that only works in this single case. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
b-sumner wrote: > Broad question, should we instead aim for having `-fsanitize` work for both > sides? I've always been very much against all these `*-gpu` bloat flags when > we could just do `-Xarch_host -fsanitize` or `-Xarch_device -fsanitize`. The > word against that it usually whether or not it would force people to update > some makefiles. I'm not sure I follow the question exactly, but in my opinion it does not make sense to independently control instrumentation for host and device. We had to implement a means to control instrumentation on the device when development started and after we changed its default once development was complete we kept the option just in case. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/jhuber6 commented: Broad question, should we instead aim for having `-fsanitize` work for both sides? I've always been very much against all these `*-gpu` bloat flags when we could just do `-Xarch_host -fsanitize` or `-Xarch_device -fsanitize`. The word against that it usually whether or not it would force people to update some makefiles. https://github.com/llvm/llvm-project/pull/124754 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
llvmbot wrote:
@llvm/pr-subscribers-clang
Author: Amit Kumar Pandey (ampandey-1995)
Changes
Enable device code ASan instrumentation for openmp offload applications using
option '-fsanitize=address'.
---
Full diff: https://github.com/llvm/llvm-project/pull/124754.diff
2 Files Affected:
- (modified) clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp (+14-2)
- (added) clang/test/Driver/amdgpu-openmp-sanitize-options.c (+58)
``diff
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 3f0b3f2d86b3ed..9e9ee7ed26f501 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -72,9 +82,11 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
if (DeviceOffloadKind == Action::OFK_OpenMP) {
-for (Arg *A : Args)
- if (!llvm::is_contained(*DAL, A))
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
DAL->append(A);
+}
if (!DAL->hasArg(options::OPT_march_EQ)) {
StringRef Arch = BoundArch;
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 00..03adeb8e6a7833
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// FAIL-DAG: error: cannot find ROCm device library for ABI version 5; provide
its path via '--rocm-path' or '--rocm-device-lib-path', or pass '-nogpulib' to
build without ROCm device library
+// UNSUPPORTED-DAG: warning: ignoring '-fsanitize=leak' option as it is not
currently supported for target 'amdgcn-amd-amdhsa'
+
+// NOXNACK: warning: ignoring '-fsanit
[clang] [OpenMP][ASan] Enable ASan Instrumentation for AMDGPUOpenMPToolChain. (PR #124754)
https://github.com/ampandey-1995 created
https://github.com/llvm/llvm-project/pull/124754
Enable device code ASan instrumentation for openmp offload applications using
option '-fsanitize=address'.
>From 913db08256a8ee3077067d55667e37628d9ebd7c Mon Sep 17 00:00:00 2001
From: Amit Pandey
Date: Tue, 28 Jan 2025 15:15:01 +0530
Subject: [PATCH] [OpenMP][ASan] Enable ASan Instrumentation for
AMDGPUOpenMPToolChain.
Enable device code ASan instrumentation for openmp offload applications
using option '-fsanitize=address'.
---
clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp | 16 -
.../Driver/amdgpu-openmp-sanitize-options.c | 58 +++
2 files changed, 72 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Driver/amdgpu-openmp-sanitize-options.c
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 3f0b3f2d86b3ed..9e9ee7ed26f501 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -37,6 +37,16 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
+ // Diagnose unsupported sanitizer options only once.
+ if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
+true))
+return;
+ for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
+SanitizerMask K = parseSanitizerValue(A->getValue(),
/*AllowGroups=*/false);
+if (K != SanitizerKind::Address)
+ D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
+ << A->getAsString(Args) << getTriple().str();
+ }
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -72,9 +82,11 @@ llvm::opt::DerivedArgList
*AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
if (DeviceOffloadKind == Action::OFK_OpenMP) {
-for (Arg *A : Args)
- if (!llvm::is_contained(*DAL, A))
+for (Arg *A : Args) {
+ if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
+ !llvm::is_contained(*DAL, A))
DAL->append(A);
+}
if (!DAL->hasArg(options::OPT_march_EQ)) {
StringRef Arch = BoundArch;
diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c
b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
new file mode 100644
index 00..03adeb8e6a7833
--- /dev/null
+++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c
@@ -0,0 +1,58 @@
+// REQUIRES: x86-registered-target, amdgpu-registered-target
+
+// Fail on invalid ROCm Path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fgpu-sanitize -nogpuinc --rocm-path=%S/Inputs/rocm-invalid
%s 2>&1 \
+// RUN: | FileCheck --check-prefix=FAIL %s
+
+// Enable multiple sanitizer's apart from ASan with invalid rocm-path.
+// RUN: not %clang -### -fopenmp --offload-arch=gfx908:xnack+
-fsanitize=address -fsanitize=leak -fgpu-sanitize
--rocm-path=%S/Inputs/rocm-invalid -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefixes=UNSUPPORTED,FAIL %s
+
+// Memory, Leak, UndefinedBehaviour and Thread Sanitizer are not supported.
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fsanitize=leak -fgpu-sanitize --rocm-path=%S/Inputs/rocm -nogpuinc %s 2>&1 \
+// RUN: | FileCheck --check-prefix=UNSUPPORTED %s
+
+
+// ASan Enabled Test Cases
+// ASan enabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOXNACK,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=XNACKNEG,GPUSAN %s
+
+// ASan enabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fgpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=GPUSAN %s
+
+// ASan Disabled Test Cases
+// ASan disabled for amdgpu-arch [gfx908]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908 -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack-]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack- -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// ASan disabled for amdgpu-arch [gfx908:xnack+]
+// RUN: %clang -### -fopenmp --offload-arch=gfx908:xnack+ -fsanitize=address
-fno-gpu-sanitize --rocm-path=%S/Inputs/rocm %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=NOGPUSAN %s
+
+// FAIL-DAG: error: cannot find
