Author: Joseph Huber
Date: 2026-09-14T13:52:08-05:00
New Revision: 83cb8bd4c9b17d031d6a4519d74c76650e850427

URL: 
https://github.com/llvm/llvm-project/commit/83cb8bd4c9b17d031d6a4519d74c76650e850427
DIFF: 
https://github.com/llvm/llvm-project/commit/83cb8bd4c9b17d031d6a4519d74c76650e850427.diff

LOG: [Clang] Enable UBSan for AMDGPU device offload (#219973)

Summary:
This enables the device UBSan runtime for AMDGPU devices. Primarily this
required modifications to the `addSanitizerRuntime` interface so we can
query the compilation's offload status. Also need to forward it through
the linker wrapper interface. Works on all AMDGPU offload, slight hacks
around the other targets as they do not advertise sanitizer
runtimes properly.

This is linked in via a new `-u __ubsan_offload_init` hook to pull
in the side library. This is standard behavior and keeps the core logic
mostly unchanged and re-used.

---

<sub>Stack created with <a
href="https://github.com/github/gh-stack";>GitHub Stacks CLI</a> • <a
href="https://gh.io/stacks-feedback";>Give Feedback 💬</a></sub>

Added: 
    
clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/amdgpu-amd-amdhsa/libclang_rt.ubsan_standalone.a
    
clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_offload.a
    
clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_standalone.a
    clang/test/Driver/fsanitize-undefined-offload.c

Modified: 
    clang/include/clang/Driver/CommonArgs.h
    clang/lib/Driver/ToolChains/AMDGPU.cpp
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/lib/Driver/ToolChains/CommonArgs.cpp
    clang/lib/Driver/ToolChains/Cuda.cpp
    clang/lib/Driver/ToolChains/Cygwin.cpp
    clang/lib/Driver/ToolChains/FreeBSD.cpp
    clang/lib/Driver/ToolChains/Fuchsia.cpp
    clang/lib/Driver/ToolChains/Gnu.cpp
    clang/lib/Driver/ToolChains/Haiku.cpp
    clang/lib/Driver/ToolChains/Hexagon.cpp
    clang/lib/Driver/ToolChains/NetBSD.cpp
    clang/lib/Driver/ToolChains/OpenBSD.cpp
    clang/lib/Driver/ToolChains/Solaris.cpp
    clang/lib/Driver/ToolChains/UEFI.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Driver/CommonArgs.h 
b/clang/include/clang/Driver/CommonArgs.h
index f631cdbd23d03..6ba7657e283b8 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -57,7 +57,7 @@ void renderDebugInfoCompressionArgs(const llvm::opt::ArgList 
&Args,
 void claimNoWarnArgs(const llvm::opt::ArgList &Args);
 
 bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args,
-                          llvm::opt::ArgStringList &CmdArgs);
+                          llvm::opt::ArgStringList &CmdArgs, Compilation &C);
 
 void linkSanitizerRuntimeDeps(const ToolChain &TC,
                               const llvm::opt::ArgList &Args,

diff  --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp 
b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 6bc6a53732881..d6dacb4ccba83 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -667,7 +667,7 @@ void amdgpu::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   }
 
   getToolChain().addProfileRTLibs(Args, CmdArgs);
-  addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
+  addSanitizerRuntimes(getToolChain(), Args, CmdArgs, C);
 
   if (Args.hasArg(options::OPT_stdlib))
     CmdArgs.append({"-lc", "-lm"});

diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 9009ce7ec9556..df6022c204425 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -9804,7 +9804,8 @@ void LinkerWrapper::ConstructJob(Compilation &C, const 
JobAction &JA,
       return false;
     // Don't forward sanitizer arguments if the toolchain doesn't support it.
     // Without this check using it on the host would result in linker errors.
-    if (requiresUBSanRT(ID) && !ToolChainHasRT(TC, "ubsan_minimal"))
+    if (requiresUBSanRT(ID) && !ToolChainHasRT(TC, "ubsan_minimal") &&
+        !ToolChainHasRT(TC, "ubsan_standalone"))
       return false;
     // Don't forward -mllvm to toolchains that don't support LLVM.
     return TC.HasNativeLLVMSupport() || ID != OPT_mllvm;

diff  --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 64859a318485b..11a16a0342bad 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1669,8 +1669,36 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
     CmdArgs.push_back("-lresolv");
 }
 
+// Host interceptor library for offload UBSan.
+static bool hostNeedsUbsanOffloadRt(Compilation &C, const ToolChain &HostTC) {
+  if (HostTC.getTriple().isGPU())
+    return false;
+
+  static constexpr Action::OffloadKind Kinds[] = {
+      Action::OFK_Cuda, Action::OFK_OpenMP, Action::OFK_HIP, Action::OFK_SYCL};
+  for (Action::OffloadKind Kind : Kinds) {
+    for (const auto &Entry : llvm::make_range(C.getOffloadToolChains(Kind))) {
+      const ToolChain *DevTC = Entry.second;
+      // FIXME: CUDA/HIPSPV copy the host mask and ignore device sanitizers.
+      const llvm::Triple &TT = DevTC->getTriple();
+      if (!TT.isAMDGCN())
+        continue;
+
+      for (BoundArch BA :
+           C.getDriver().getOffloadArchs(C, C.getArgs(), Kind, *DevTC)) {
+        const ArgList &DevArgs = C.getArgsForToolChain(DevTC, BA, Kind);
+        SanitizerArgs DevSan = DevTC->getSanitizerArgs(DevArgs, BA, Kind);
+        if (DevSan.needsUbsanRt() && !DevSan.requiresMinimalRuntime())
+          return true;
+      }
+    }
+  }
+  return false;
+}
+
 static void
-collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
+collectSanitizerRuntimes(Compilation &C, const ToolChain &TC,
+                         const ArgList &Args,
                          SmallVectorImpl<StringRef> &SharedRuntimes,
                          SmallVectorImpl<StringRef> &StaticRuntimes,
                          SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
@@ -1678,6 +1706,8 @@ collectSanitizerRuntimes(const ToolChain &TC, const 
ArgList &Args,
                          SmallVectorImpl<StringRef> &RequiredSymbols) {
   assert(!TC.getTriple().isOSDarwin() && "it's not used by Darwin");
   const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
+  const bool NeedsOffloadRt = hostNeedsUbsanOffloadRt(C, TC);
+  const bool NeedsUbsanRt = SanArgs.needsUbsanRt() || NeedsOffloadRt;
   // Collect shared runtimes.
   if (SanArgs.needsSharedRt()) {
     if (SanArgs.needsAsanRt()) {
@@ -1692,7 +1722,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const 
ArgList &Args,
     }
     if (SanArgs.needsNsanRt())
       SharedRuntimes.push_back("nsan");
-    if (SanArgs.needsUbsanRt()) {
+    if (NeedsUbsanRt) {
       if (SanArgs.requiresMinimalRuntime())
         SharedRuntimes.push_back("ubsan_minimal");
       else
@@ -1725,9 +1755,17 @@ collectSanitizerRuntimes(const ToolChain &TC, const 
ArgList &Args,
   if (SanArgs.needsAsanRt())
     HelperStaticRuntimes.push_back("asan_static");
 
+  // Offloading images can live in DSOs, the host interceptors must follow.
+  if (NeedsOffloadRt) {
+    NonWholeStaticRuntimes.push_back("ubsan_offload");
+    RequiredSymbols.push_back("__ubsan_offload_init");
+  }
+
   // Collect static runtimes.
   if (Args.hasArg(options::OPT_shared)) {
     // Don't link static runtimes into DSOs.
+    if (NeedsOffloadRt && !SanArgs.needsSharedRt() && !SanArgs.needsUbsanRt())
+      StaticRuntimes.push_back("ubsan_standalone");
     return;
   }
 
@@ -1779,7 +1817,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const 
ArgList &Args,
   }
   if (!SanArgs.needsSharedRt() && SanArgs.needsTysanRt())
     StaticRuntimes.push_back("tysan");
-  if (!SanArgs.needsSharedRt() && SanArgs.needsUbsanRt()) {
+  if (!SanArgs.needsSharedRt() && NeedsUbsanRt) {
     if (SanArgs.requiresMinimalRuntime()) {
       StaticRuntimes.push_back("ubsan_minimal");
     } else {
@@ -1817,12 +1855,12 @@ collectSanitizerRuntimes(const ToolChain &TC, const 
ArgList &Args,
 // Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
 // C runtime, etc). Returns true if sanitizer system deps need to be linked in.
 bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
-                                 ArgStringList &CmdArgs) {
+                                 ArgStringList &CmdArgs, Compilation &C) {
   const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
   SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
       NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
   if (SanArgs.linkRuntimes()) {
-    collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
+    collectSanitizerRuntimes(C, TC, Args, SharedRuntimes, StaticRuntimes,
                              NonWholeStaticRuntimes, HelperStaticRuntimes,
                              RequiredSymbols);
   }

diff  --git a/clang/lib/Driver/ToolChains/Cuda.cpp 
b/clang/lib/Driver/ToolChains/Cuda.cpp
index 54bc9b3f65e27..acbbbb3b72c04 100644
--- a/clang/lib/Driver/ToolChains/Cuda.cpp
+++ b/clang/lib/Driver/ToolChains/Cuda.cpp
@@ -670,7 +670,7 @@ void NVPTX::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   CmdArgs.push_back(Args.MakeArgString(Twine("-L") + DefaultLibPath));
 
   getToolChain().addProfileRTLibs(Args, CmdArgs);
-  addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
+  addSanitizerRuntimes(getToolChain(), Args, CmdArgs, C);
 
   if (Args.hasArg(options::OPT_stdlib))
     CmdArgs.append({"-lc", "-lm"});

diff  --git a/clang/lib/Driver/ToolChains/Cygwin.cpp 
b/clang/lib/Driver/ToolChains/Cygwin.cpp
index c5ef00946c075..4b64557eff495 100644
--- a/clang/lib/Driver/ToolChains/Cygwin.cpp
+++ b/clang/lib/Driver/ToolChains/Cygwin.cpp
@@ -283,7 +283,7 @@ void cygwin::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   CmdArgs.push_back("--disable-nxcompat");
 
   bool NeedsSanitizerDeps =
-      tools::addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+      tools::addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   bool NeedsXRayDeps = tools::addXRayRuntime(ToolChain, Args, CmdArgs);
   tools::addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
   tools::AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);

diff  --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp 
b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index dcf2973c364d1..273cb3bb89607 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -275,7 +275,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   if (auto LTO = ToolChain.getLTOMode(Args); LTO != LTOK_None)
     addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs, LTO == LTOK_Thin);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
   addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);

diff  --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp 
b/clang/lib/Driver/ToolChains/Fuchsia.cpp
index 028d94b3fa103..3b5729b45e7e8 100644
--- a/clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -173,7 +173,7 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
     // Note that Fuchsia never needs to link in sanitizer runtime deps.  Any
     // sanitizer runtimes with system dependencies use the `.deplibs` feature
     // instead.
-    addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+    addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
 
     addXRayRuntime(ToolChain, Args, CmdArgs);
 

diff  --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index dad719cbb1eaf..7591d9f7fa418 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -445,7 +445,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
     CmdArgs.push_back("--no-demangle");
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
   addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);

diff  --git a/clang/lib/Driver/ToolChains/Haiku.cpp 
b/clang/lib/Driver/ToolChains/Haiku.cpp
index a155f22b75a79..36b07f888cc66 100644
--- a/clang/lib/Driver/ToolChains/Haiku.cpp
+++ b/clang/lib/Driver/ToolChains/Haiku.cpp
@@ -90,7 +90,7 @@ void haiku::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   if (auto LTO = ToolChain.getLTOMode(Args); LTO != LTOK_None)
     addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs, LTO == LTOK_Thin);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
 

diff  --git a/clang/lib/Driver/ToolChains/Hexagon.cpp 
b/clang/lib/Driver/ToolChains/Hexagon.cpp
index 76c5cafd77bc9..933b9f2ea5412 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -218,7 +218,7 @@ void hexagon::Assembler::ConstructJob(Compilation &C, const 
JobAction &JA,
       "-mcpu=hexagon" +
       toolchains::HexagonToolChain::GetTargetCPUVersion(Args)));
 
-  addSanitizerRuntimes(HTC, Args, CmdArgs);
+  addSanitizerRuntimes(HTC, Args, CmdArgs, C);
 
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
   if (Output.isFilename()) {
@@ -304,7 +304,7 @@ constructHexagonLinkArgs(Compilation &C, const JobAction 
&JA,
   bool UseShared = IsShared && !IsStatic;
   StringRef CpuVer = toolchains::HexagonToolChain::GetTargetCPUVersion(Args);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(HTC, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(HTC, Args, CmdArgs, C);
   bool NeedsXRayDeps = addXRayRuntime(HTC, Args, CmdArgs);
 
   
//----------------------------------------------------------------------------

diff  --git a/clang/lib/Driver/ToolChains/NetBSD.cpp 
b/clang/lib/Driver/ToolChains/NetBSD.cpp
index f03114b53bb61..dd53606351b24 100644
--- a/clang/lib/Driver/ToolChains/NetBSD.cpp
+++ b/clang/lib/Driver/ToolChains/NetBSD.cpp
@@ -274,7 +274,7 @@ void netbsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
                             options::OPT_s, options::OPT_t});
   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
 

diff  --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp 
b/clang/lib/Driver/ToolChains/OpenBSD.cpp
index de5284ddf6e60..03bd56e5f4e45 100644
--- a/clang/lib/Driver/ToolChains/OpenBSD.cpp
+++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp
@@ -206,7 +206,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   if (auto LTO = ToolChain.getLTOMode(Args); LTO != LTOK_None)
     addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs, LTO == LTOK_Thin);
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
 

diff  --git a/clang/lib/Driver/ToolChains/Solaris.cpp 
b/clang/lib/Driver/ToolChains/Solaris.cpp
index e5f1cbb033c3b..8eafe18a1eb30 100644
--- a/clang/lib/Driver/ToolChains/Solaris.cpp
+++ b/clang/lib/Driver/ToolChains/Solaris.cpp
@@ -202,7 +202,7 @@ void solaris::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
 
   Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group});
 
-  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+  bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs, C);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,

diff  --git a/clang/lib/Driver/ToolChains/UEFI.cpp 
b/clang/lib/Driver/ToolChains/UEFI.cpp
index e26403ebe9030..6e93f7c4be193 100644
--- a/clang/lib/Driver/ToolChains/UEFI.cpp
+++ b/clang/lib/Driver/ToolChains/UEFI.cpp
@@ -90,7 +90,7 @@ void tools::uefi::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   bool NoLibc = Args.hasArg(options::OPT_nolibc);
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
                    options::OPT_r)) {
-    addSanitizerRuntimes(TC, Args, CmdArgs);
+    addSanitizerRuntimes(TC, Args, CmdArgs, C);
 
     addXRayRuntime(TC, Args, CmdArgs);
 

diff  --git 
a/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/amdgpu-amd-amdhsa/libclang_rt.ubsan_standalone.a
 
b/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/amdgpu-amd-amdhsa/libclang_rt.ubsan_standalone.a
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git 
a/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_offload.a
 
b/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_offload.a
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git 
a/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_standalone.a
 
b/clang/test/Driver/Inputs/resource_dir_with_amdgpu_per_target_subdir/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan_standalone.a
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/fsanitize-undefined-offload.c 
b/clang/test/Driver/fsanitize-undefined-offload.c
new file mode 100644
index 0000000000000..424ae23f70967
--- /dev/null
+++ b/clang/test/Driver/fsanitize-undefined-offload.c
@@ -0,0 +1,77 @@
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -fopenmp=libomp --offload-arch=gfx908 -fsanitize=undefined 
-nogpuinc \
+// RUN:     --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-OPENMP
+// CHECK-OPENMP-DAG: "--device-compiler=amdgpu-amd-amdhsa=-fsanitize=undefined"
+// CHECK-OPENMP-DAG: "-u" "__ubsan_offload_init"
+// CHECK-OPENMP-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -fsanitize=undefined -nogpuinc 
-nogpulib \
+// RUN:     --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-HIP-HOST
+// CHECK-HIP-HOST-DAG: "-u" "__ubsan_offload_init"
+// CHECK-HIP-HOST-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -Xarch_device -fsanitize=undefined \
+// RUN:     -nogpuinc -nogpulib --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-XARCH-DEV
+// CHECK-XARCH-DEV-DAG: "-u" "__ubsan_offload_init"
+// CHECK-XARCH-DEV-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+// CHECK-XARCH-DEV-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_standalone.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -fsanitize=undefined \
+// RUN:     -fsanitize-minimal-runtime -nogpuinc -nogpulib \
+// RUN:     --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-MINIMAL
+// CHECK-MINIMAL-NOT: ubsan_offload
+// CHECK-MINIMAL-NOT: __ubsan_offload_init
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -Xarch_device -fsanitize=undefined \
+// RUN:     -fPIC -shared -nogpuinc -nogpulib --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-SHARED-DEV
+// CHECK-SHARED-DEV-DAG: "-u" "__ubsan_offload_init"
+// CHECK-SHARED-DEV-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+// CHECK-SHARED-DEV-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_standalone.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -fsanitize=undefined \
+// RUN:     -fPIC -shared -nogpuinc -nogpulib --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-SHARED
+// CHECK-SHARED-DAG: "-u" "__ubsan_offload_init"
+// CHECK-SHARED-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -Xarch_gfx908 -fsanitize=undefined \
+// RUN:     -nogpuinc -nogpulib --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-XARCH-GPU
+// CHECK-XARCH-GPU-DAG: "-u" "__ubsan_offload_init"
+// CHECK-XARCH-GPU-DAG: 
"{{[^"]*}}x86_64-unknown-linux-gnu{{/|\\\\}}libclang_rt.ubsan_offload.a"
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -x hip --offload-arch=gfx908 -Xarch_gfx90a -fsanitize=undefined \
+// RUN:     -nogpuinc -nogpulib --rocm-path=%S/Inputs/rocm \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-XARCH-OTHER
+// CHECK-XARCH-OTHER-NOT: ubsan_offload
+// CHECK-XARCH-OTHER-NOT: __ubsan_offload_init
+
+// RUN: %clang -no-canonical-prefixes -### --target=x86_64-unknown-linux-gnu \
+// RUN:     -fopenmp=libomp -fopenmp-targets=x86_64-unknown-linux-gnu \
+// RUN:     -fsanitize=undefined \
+// RUN:     -resource-dir=%S/Inputs/resource_dir_with_amdgpu_per_target_subdir 
%s 2>&1 \
+// RUN:   | FileCheck %s --check-prefix=CHECK-OMP-CPU
+// CHECK-OMP-CPU-NOT: ubsan_offload
+// CHECK-OMP-CPU-NOT: __ubsan_offload_init
+
+int main(void) { return 0; }


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to