diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 512bebd3f0c1..d03e0cbd8ae2 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -4973,6 +4973,15 @@ void CudaToolChain::AddIAMCUIncludeArgs(const ArgList &Args, HostTC.AddIAMCUIncludeArgs(Args, CC1Args); } +SanitizerMask CudaToolChain::getSupportedSanitizers() const { + // The CudaToolChain only supports address sanitization in the sense that it + // allows ASAN arguments on the command line. It must not error out on these + // command line arguments because the host code compilation supports them. + // However, it doesn't actually do any address sanitization for device code; + // instead, it just ignores any ASAN command line arguments it sees. + return SanitizerKind::Address; +} + /// XCore tool chain XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 35543cdb94b8..1c1ee21c6d65 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -912,6 +912,8 @@ public: void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + SanitizerMask getSupportedSanitizers() const override; + const ToolChain &HostTC; CudaInstallationDetector CudaInstallation; diff --git a/clang/test/Driver/cuda-no-sanitizers.cu b/clang/test/Driver/cuda-no-sanitizers.cu index e344f9043ab5..4c01bbdab0f6 100644 --- a/clang/test/Driver/cuda-no-sanitizers.cu +++ b/clang/test/Driver/cuda-no-sanitizers.cu @@ -6,6 +6,7 @@ // RUN: %clang -### -target x86_64-linux-gnu -c --cuda-gpu-arch=sm_20 -fsanitize=address %s 2>&1 | \ // RUN: FileCheck %s +// CHECK-NOT: error: // CHECK-DAG: "-fcuda-is-device" // CHECK-NOT: "-fsanitize=address" // CHECK-DAG: "-triple" "x86_64--linux-gnu"