[clang] clang: Add BoundArch/OffloadKind argument to getSupportedSanitizers (PR #196503)

via cfe-commits cfe-commits at lists.llvm.org
Fri May 8 03:08:09 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-driver

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

Currently the AMDGPU HIP and OpenMP toolchains falsely report
all host sanitizers are supported, and then go out of their way
to skip forwarding those to the device compiles. Add an offloading
kind argument so that in the future this can be handled in one
place in the base toolchain.

Co-authored-by: Claude Sonnet 4 <noreply@<!-- -->anthropic.com>

---

Patch is 40.47 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/196503.diff


46 Files Affected:

- (modified) clang/include/clang/Driver/ToolChain.h (+3-1) 
- (modified) clang/lib/Driver/SanitizerArgs.cpp (+2-1) 
- (modified) clang/lib/Driver/ToolChain.cpp (+3-1) 
- (modified) clang/lib/Driver/ToolChains/AMDGPU.h (+11-2) 
- (modified) clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/AMDGPUOpenMP.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/BareMetal.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/BareMetal.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/CrossWindows.cpp (+4-2) 
- (modified) clang/lib/Driver/ToolChains/CrossWindows.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Cuda.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Cuda.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Darwin.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Darwin.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/FreeBSD.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/FreeBSD.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Fuchsia.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Fuchsia.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/HIPAMD.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/HIPAMD.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/HIPSPV.cpp (+6-3) 
- (modified) clang/lib/Driver/ToolChains/HIPSPV.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Haiku.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Haiku.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Linux.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Linux.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/MSVC.cpp (+4-2) 
- (modified) clang/lib/Driver/ToolChains/MSVC.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Managarm.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Managarm.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/MinGW.cpp (+4-2) 
- (modified) clang/lib/Driver/ToolChains/MinGW.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/NetBSD.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/NetBSD.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/OHOS.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/OHOS.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/OpenBSD.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/OpenBSD.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/PS4CPU.cpp (+8-4) 
- (modified) clang/lib/Driver/ToolChains/PS4CPU.h (+6-2) 
- (modified) clang/lib/Driver/ToolChains/Serenity.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Serenity.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/Solaris.cpp (+5-2) 
- (modified) clang/lib/Driver/ToolChains/Solaris.h (+3-1) 
- (modified) clang/lib/Driver/ToolChains/WebAssembly.cpp (+4-2) 
- (modified) clang/lib/Driver/ToolChains/WebAssembly.h (+3-1) 


``````````diff
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 25f5f83ad7b98..8676318d6f9d4 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -843,7 +843,9 @@ class ToolChain {
                                 llvm::opt::ArgStringList &CmdArgs) const {}
 
   /// Return sanitizers which are available in this toolchain.
-  virtual SanitizerMask getSupportedSanitizers() const;
+  virtual SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const;
 
   /// Return sanitizers which are enabled by default.
   virtual SanitizerMask getDefaultSanitizers() const {
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 4ae46d0b6c9f1..4bf011ab3dedf 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -412,7 +412,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
   SanitizerMask IgnoreForUbsanFeature; // Accumulated set of values passed to
                                        // `-fsanitize-ignore-for-ubsan-feature`.
   SanitizerMask Kinds;
-  const SanitizerMask Supported = setGroupBits(TC.getSupportedSanitizers());
+  const SanitizerMask Supported =
+      setGroupBits(TC.getSupportedSanitizers("", Action::OFK_None));
 
   CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
                              options::OPT_fno_sanitize_cfi_cross_dso, false);
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 98936b25ce650..6e5148101d4ec 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1759,7 +1759,9 @@ ToolChain::getSystemGPUArchs(const llvm::opt::ArgList &Args) const {
   return SmallVector<std::string>();
 }
 
-SanitizerMask ToolChain::getSupportedSanitizers() const {
+SanitizerMask
+ToolChain::getSupportedSanitizers(StringRef BoundArch,
+                                  Action::OffloadKind DeviceOffloadKind) const {
   // Return sanitizers which don't require runtime support and are not
   // platform dependent.
 
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.h b/clang/lib/Driver/ToolChains/AMDGPU.h
index 20b9365c91bbf..1698786f0e27a 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.h
+++ b/clang/lib/Driver/ToolChains/AMDGPU.h
@@ -151,11 +151,20 @@ class LLVM_LIBRARY_VISIBILITY ROCMToolChain : public AMDGPUToolChain {
                           llvm::StringRef GPUArch,
                           Action::OffloadKind DeviceOffloadingKind) const;
 
-  SanitizerMask getSupportedSanitizers() const override {
+  // FIXME: Remove this and make use of OffloadKind argument to
+  // getSupportedSanitizers
+  static constexpr SanitizerMask getOffloadSupportedSanitizers() {
     return SanitizerKind::Address | SanitizerKind::Undefined |
            SanitizerKind::UndefinedGroup;
   }
 
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override {
+    assert(DeviceOffloadKind == Action::OFK_None);
+    return getOffloadSupportedSanitizers();
+  }
+
   bool diagnoseUnsupportedOption(const llvm::opt::Arg *A,
                                  const llvm::opt::DerivedArgList &DAL,
                                  const llvm::opt::ArgList &DriverArgs,
@@ -203,7 +212,7 @@ class LLVM_LIBRARY_VISIBILITY ROCMToolChain : public AMDGPUToolChain {
     SmallVector<const char *, 4> SupportedSanitizers;
     SmallVector<const char *, 4> UnSupportedSanitizers;
 
-    SanitizerMask Supported = ROCMToolChain::getSupportedSanitizers();
+    SanitizerMask Supported = ROCMToolChain::getOffloadSupportedSanitizers();
     SanitizerMask SupportedMask;
     for (const char *Value : A->getValues()) {
       SanitizerMask K = parseSanitizerValue(Value, /*Allow Groups*/ true);
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 1a30875807d30..226779d9eb80b 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -105,7 +105,8 @@ void AMDGPUOpenMPToolChain::AddIAMCUIncludeArgs(const ArgList &Args,
   HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
 }
 
-SanitizerMask AMDGPUOpenMPToolChain::getSupportedSanitizers() const {
+SanitizerMask AMDGPUOpenMPToolChain::getSupportedSanitizers(
+    StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {
   // The AMDGPUOpenMPToolChain only supports sanitizers in the sense that it
   // allows sanitizer arguments on the command line if they are supported by the
   // host toolchain. The AMDGPUOpenMPToolChain will later filter unsupported
@@ -114,7 +115,9 @@ SanitizerMask AMDGPUOpenMPToolChain::getSupportedSanitizers() const {
   // This behavior is necessary because the host and device toolchains
   // invocations often share the command line, so the device toolchain must
   // tolerate flags meant only for the host toolchain.
-  return HostTC.getSupportedSanitizers();
+
+  // FIXME: Be accurate and use DeviceOffloadKind.
+  return HostTC.getSupportedSanitizers(BoundArch, DeviceOffloadKind);
 }
 
 VersionTuple
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.h b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.h
index cbafdf57fa466..ff4ba9cc9cda4 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.h
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.h
@@ -51,7 +51,9 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUOpenMPToolChain final
   void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                            llvm::opt::ArgStringList &CC1Args) const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 
   VersionTuple
   computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 3ba592666647a..4293295f20541 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -649,12 +649,15 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA,
 // BareMetal toolchain allows all sanitizers where the compiler generates valid
 // code, ignoring all runtime library support issues on the assumption that
 // baremetal targets typically implement their own runtime support.
-SanitizerMask BareMetal::getSupportedSanitizers() const {
+SanitizerMask
+BareMetal::getSupportedSanitizers(StringRef BoundArch,
+                                  Action::OffloadKind DeviceOffloadKind) const {
   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
                          getTriple().getArch() == llvm::Triple::aarch64_be;
   const bool IsRISCV64 = getTriple().isRISCV64();
-  SanitizerMask Res = ToolChain::getSupportedSanitizers();
+  SanitizerMask Res =
+      ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::KernelAddress;
   Res |= SanitizerKind::PointerCompare;
diff --git a/clang/lib/Driver/ToolChains/BareMetal.h b/clang/lib/Driver/ToolChains/BareMetal.h
index 57bfb73e3399b..782dc99af129c 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.h
+++ b/clang/lib/Driver/ToolChains/BareMetal.h
@@ -77,7 +77,9 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {
                            llvm::opt::ArgStringList &CC1Args) const override;
   std::string computeSysRoot() const override;
   std::string getCompilerRTPath() const override;
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 
 private:
   std::string SysRoot;
diff --git a/clang/lib/Driver/ToolChains/CrossWindows.cpp b/clang/lib/Driver/ToolChains/CrossWindows.cpp
index 6df5315e8fff8..5bd1cd46cc080 100644
--- a/clang/lib/Driver/ToolChains/CrossWindows.cpp
+++ b/clang/lib/Driver/ToolChains/CrossWindows.cpp
@@ -282,8 +282,10 @@ AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
   }
 }
 
-clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
-  SanitizerMask Res = ToolChain::getSupportedSanitizers();
+clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers(
+    StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {
+  SanitizerMask Res =
+      ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::PointerCompare;
   Res |= SanitizerKind::PointerSubtract;
diff --git a/clang/lib/Driver/ToolChains/CrossWindows.h b/clang/lib/Driver/ToolChains/CrossWindows.h
index c5df55a24296f..d6263823759c7 100644
--- a/clang/lib/Driver/ToolChains/CrossWindows.h
+++ b/clang/lib/Driver/ToolChains/CrossWindows.h
@@ -74,7 +74,9 @@ class LLVM_LIBRARY_VISIBILITY CrossWindowsToolChain : public Generic_GCC {
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
                            llvm::opt::ArgStringList &CmdArgs) const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 
 protected:
   Tool *buildLinker() const override;
diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp
index 2064ba4fc1a9c..c7988911b4044 100644
--- a/clang/lib/Driver/ToolChains/Cuda.cpp
+++ b/clang/lib/Driver/ToolChains/Cuda.cpp
@@ -1047,7 +1047,8 @@ void CudaToolChain::AddIAMCUIncludeArgs(const ArgList &Args,
   HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
 }
 
-SanitizerMask CudaToolChain::getSupportedSanitizers() const {
+SanitizerMask CudaToolChain::getSupportedSanitizers(
+    StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {
   // The CudaToolChain only supports sanitizers in the sense that it allows
   // sanitizer arguments on the command line if they are supported by the host
   // toolchain. The CudaToolChain will actually ignore any command line
@@ -1057,7 +1058,9 @@ SanitizerMask CudaToolChain::getSupportedSanitizers() const {
   // This behavior is necessary because the host and device toolchains
   // invocations often share the command line, so the device toolchain must
   // tolerate flags meant only for the host toolchain.
-  return HostTC.getSupportedSanitizers();
+
+  // FIXME: Be accurate and use DeviceOffloadKind.
+  return HostTC.getSupportedSanitizers(BoundArch, DeviceOffloadKind);
 }
 
 VersionTuple CudaToolChain::computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/Cuda.h b/clang/lib/Driver/ToolChains/Cuda.h
index 6193328908828..386aaf6e6830a 100644
--- a/clang/lib/Driver/ToolChains/Cuda.h
+++ b/clang/lib/Driver/ToolChains/Cuda.h
@@ -169,7 +169,9 @@ class LLVM_LIBRARY_VISIBILITY CudaToolChain : public NVPTXToolChain {
   void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                            llvm::opt::ArgStringList &CC1Args) const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 
   VersionTuple
   computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 232e6a4e574aa..baec524eeab53 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -4040,10 +4040,13 @@ void Darwin::CheckObjCARC() const {
   getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
 }
 
-SanitizerMask Darwin::getSupportedSanitizers() const {
+SanitizerMask
+Darwin::getSupportedSanitizers(StringRef BoundArch,
+                               Action::OffloadKind DeviceOffloadKind) const {
   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64;
-  SanitizerMask Res = ToolChain::getSupportedSanitizers();
+  SanitizerMask Res =
+      ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::PointerCompare;
   Res |= SanitizerKind::PointerSubtract;
diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h
index 6d1da017d3df1..d8a6d2e1980b4 100644
--- a/clang/lib/Driver/ToolChains/Darwin.h
+++ b/clang/lib/Driver/ToolChains/Darwin.h
@@ -652,7 +652,9 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public AppleMachO {
 
   bool SupportsEmbeddedBitcode() const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 };
 
 /// DarwinClang - The Darwin toolchain used by Clang.
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index cf6ad385d949a..5ba2db4b19108 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -485,12 +485,15 @@ bool FreeBSD::isPIEDefault(const llvm::opt::ArgList &Args) const {
   return getSanitizerArgs(Args).requiresPIE();
 }
 
-SanitizerMask FreeBSD::getSupportedSanitizers() const {
+SanitizerMask
+FreeBSD::getSupportedSanitizers(StringRef BoundArch,
+                                Action::OffloadKind DeviceOffloadKind) const {
   const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64;
   const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
   const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
   const bool IsMIPS64 = getTriple().isMIPS64();
-  SanitizerMask Res = ToolChain::getSupportedSanitizers();
+  SanitizerMask Res =
+      ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::PointerCompare;
   Res |= SanitizerKind::PointerSubtract;
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.h b/clang/lib/Driver/ToolChains/FreeBSD.h
index 60ce0bdbfc31a..79a7dbaafe39e 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.h
+++ b/clang/lib/Driver/ToolChains/FreeBSD.h
@@ -86,7 +86,9 @@ class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
   UnwindTableLevel
   getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;
   bool isPIEDefault(const llvm::opt::ArgList &Args) const override;
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
   unsigned GetDefaultDwarfVersion() const override { return 4; }
   // Until dtrace (via CTF) and LLDB can deal with distributed debug info,
   // FreeBSD defaults to standalone/full debug info.
diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp
index d4bc589ad4137..fc056fdb0bfcc 100644
--- a/clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -473,8 +473,11 @@ void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
   }
 }
 
-SanitizerMask Fuchsia::getSupportedSanitizers() const {
-  SanitizerMask Res = ToolChain::getSupportedSanitizers();
+SanitizerMask
+Fuchsia::getSupportedSanitizers(StringRef BoundArch,
+                                Action::OffloadKind DeviceOffloadKind) const {
+  SanitizerMask Res =
+      ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
   Res |= SanitizerKind::Address;
   Res |= SanitizerKind::HWAddress;
   Res |= SanitizerKind::PointerCompare;
diff --git a/clang/lib/Driver/ToolChains/Fuchsia.h b/clang/lib/Driver/ToolChains/Fuchsia.h
index eb4c8f560d3c0..b81d90001d0a9 100644
--- a/clang/lib/Driver/ToolChains/Fuchsia.h
+++ b/clang/lib/Driver/ToolChains/Fuchsia.h
@@ -84,7 +84,9 @@ class LLVM_LIBRARY_VISIBILITY Fuchsia : public ToolChain {
                                           llvm::StringRef BoundArch,
                                           types::ID InputType) const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
   SanitizerMask getDefaultSanitizers() const override;
 
   RuntimeLibType
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index b7732c9274725..81fe156721281 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -357,7 +357,8 @@ void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs,
   RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
-SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
+SanitizerMask HIPAMDToolChain::getSupportedSanitizers(
+    StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {
   // The HIPAMDToolChain only supports sanitizers in the sense that it allows
   // sanitizer arguments on the command line if they are supported by the host
   // toolchain. The HIPAMDToolChain will later filter unsupported sanitizers
@@ -366,7 +367,9 @@ SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
   // This behavior is necessary because the host and device toolchains
   // invocations often share the command line, so the device toolchain must
   // tolerate flags meant only for the host toolchain.
-  return HostTC.getSupportedSanitizers();
+  //
+  // FIXME: Be accurate and use DeviceOffloadKind.
+  return HostTC.getSupportedSanitizers(BoundArch, DeviceOffloadKind);
 }
 
 VersionTuple HIPAMDToolChain::computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h
index 7c6540fff235a..d7e10493195ce 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.h
+++ b/clang/lib/Driver/ToolChains/HIPAMD.h
@@ -84,7 +84,9 @@ class LLVM_LIBRARY_VISIBILITY HIPAMDToolChain final : public ROCMToolChain {
   getDeviceLibs(const llvm::opt::ArgList &Args,
                 Action::OffloadKind DeviceOffloadKind) const override;
 
-  SanitizerMask getSupportedSanitizers() const override;
+  SanitizerMask
+  getSupportedSanitizers(StringRef BoundArch,
+                         Action::OffloadKind DeviceOffloadKind) const override;
 
   VersionTuple
   computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index da601abe4c291..edfb03bd03c84 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -305,7 +305,8 @@ HIPSPVToolChain::getDeviceLibs(
   return BCLibs;
 }
 
-SanitizerMask HIPSPVToolChain::getSupportedSanitizers() const {
+SanitizerMask HIPSPVToolChain::getSupportedSanitizers(
+    StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {
   // The HIPSPVToolChain only supports sanitizers in the sense that it allows
   // sanitizer arguments on the command line if they are supported by the host
   // toolchain. The HIPSPVToolChain will actually ignore any command line
@@ -315,9 +316,11 @@ SanitizerMask HIPSPVToolChain::getSupportedSanitizers() const {
   // This behavior is necessary because the host and device toolchains
   // invocations often share the command line, so the device toolchain must
   // tolerate flags meant only for the host toolchain.
+
+  // FIXME: Be accurate and use DeviceOffloadKind.
   if (HostTC)
-    return HostTC->getSupportedSanitizers();
-  return ToolChain::getSupportedSanitizers();
+    return HostTC->getSupportedSanitizers(BoundArch, DeviceOffloadKind);
+  return ToolChain::getSupportedSanitizers(BoundArch, DeviceOffloadKind);
 }
 
 VersionTuple HIPSPVToolChain::computeMSVCVersion(const Driver *D,
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.h b/clang/lib/Driver/ToolChains/HIPSPV.h
index 068040ee4f491..f9e11a7fb6977 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.h
+++ b/clang/lib/Driver/ToolChains/HIPSPV.h
@@ -75,7 +75,9 @@ class LLVM_LIBRARY_VISIBILITY HIPSPVToolChain final : public ToolChain {
   getDeviceLibs(const llvm::opt::ArgList &Args,
                 const Action::OffloadKind DeviceOffloadKind) const...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/196503


More information about the cfe-commits mailing list