[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-28 Thread Joseph Huber via cfe-commits


@@ -950,221 +930,264 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {

jhuber6 wrote:

The reason I didn't use that is because it requires a ToolChain and we don't 
have a ToolChain here. I could probably recreate it by passing the default 
search path as the same dir as the clang driver executable.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-28 Thread Michael Kruse via cfe-commits

https://github.com/Meinersbur edited 
https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-28 Thread Michael Kruse via cfe-commits

https://github.com/Meinersbur edited 
https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-28 Thread Michael Kruse via cfe-commits

https://github.com/Meinersbur edited 
https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-28 Thread Michael Kruse via cfe-commits


@@ -950,221 +930,264 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {

Meinersbur wrote:

This really should/must use `GetProgramPath` like the amdgpu/cuda uses of 
`:OPT_offload_arch_tool_EQ`. `findProgramByName` will not find `offload-arch` 
in LLVM `bin` directory. So unless you have `offload-arch` installed somewhere 
in `$PATH`, this will fail.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-23 Thread Joseph Huber via cfe-commits

jhuber6 wrote:

> > This broke compilation with Xcode Clang 12 (roughly corresponding to 
> > upstream Clang 10):
> 
> It's not limited to that, I was seeing it too, it's breaking on 32-bit 
> targets with older compilers that do not implicitly move between 
> non-identical types. I've pushed the obvious fix.

Thanks for fixing that.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-23 Thread Harald van Dijk via cfe-commits

hvdijk wrote:

> This broke compilation with Xcode Clang 12 (roughly corresponding to upstream 
> Clang 10):

It's not limited to that, I was seeing it too, it's breaking on 32-bit targets 
with older compilers that do not implicitly move between non-identical types. 
I've pushed the obvious fix.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-23 Thread Martin Storsjö via cfe-commits

mstorsjo wrote:

This broke compilation with Xcode Clang 12 (roughly corresponding to upstream 
Clang 10):

```
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.
cpp:953:14: error: no viable conversion from returned value of type 'SmallVe
ctor<[...], 1>' to function return type 'SmallVector<[...], (default) Calcul
ateSmallVectorDefaultInlinedElements::value aka 2>'
  return GPUArchs;
 ^~~~
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/Sm
allVector.h:1227:3: note: candidate constructor not viable: no known convers
ion from 'SmallVector' (aka 'SmallVector,
 1>') to 'std::initializer_list>' for 1st argument
  SmallVector(std::initializer_list IL) : SmallVectorImpl(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/Sm
allVector.h:1237:3: note: candidate constructor not viable: no known convers
ion from 'SmallVector' (aka 'SmallVector,
 1>') to 'const llvm::SmallVector, 2> &' for 1s
t argument
  SmallVector(const SmallVector &RHS) : SmallVectorImpl(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1247:3:
 note: candidate constructor not viable: no known conversion from 
'SmallVector' (aka 'SmallVector, 1>') to 
'llvm::SmallVector, 2> &&' for 1st argument
  SmallVector(SmallVector &&RHS) : SmallVectorImpl(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1252:3:
 note: candidate constructor not viable: no known conversion from 
'SmallVector' (aka 'SmallVector, 1>') to 
'SmallVectorImpl> &&' for 1st argument
  SmallVector(SmallVectorImpl &&RHS) : SmallVectorImpl(N) {
  ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1206:12:
 note: explicit constructor is not a candidate
  explicit SmallVector(size_t Size)
   ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1222:12:
 note: explicit constructor is not a candidate
  explicit SmallVector(const iterator_range &R)
   ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1233:12:
 note: explicit constructor is not a candidate
  explicit SmallVector(ArrayRef A) : SmallVectorImpl(N) {
   ^
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.cpp:958:14:
 warning: local variable 'GPUArchs' will be copied despite being returned by 
name [-Wreturn-std-move]
  return GPUArchs;
 ^~~~
/Users/mstorsjo/nightly/llvm-mingw/src/llvm-project/clang/lib/Driver/Driver.cpp:958:14:
 note: call 'std::move' explicitly to avoid copying
  return GPUArchs;
 ^~~~
 std::move(GPUArchs)
```

Plus another few similar cases (on lines 953, 958 and 967).

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Jinsong Ji via cfe-commits

https://github.com/jsji edited https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Jinsong Ji via cfe-commits


@@ -950,221 +930,264 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {
+llvm::SmallVector Args{*Executable};
+if (Kind == Action::OFK_HIP)
+  Args.push_back("--only=amdgpu");
+else if (Kind == Action::OFK_Cuda)
+  Args.push_back("--only=nvptx");
+auto StdoutOrErr = C.getDriver().executeProgram(Args);
+
+if (!StdoutOrErr) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind) << StdoutOrErr.takeError()
+  << "--offload-arch";
+  return GPUArchs;
+} else if ((*StdoutOrErr)->getBuffer().empty()) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind) << "No GPU detected in the 
system"
+  << "--offload-arch";
+  return GPUArchs;
+}
+
+for (StringRef Arch : llvm::split((*StdoutOrErr)->getBuffer(), "\n"))
+  if (!Arch.empty())
+GPUArchs.push_back(Arch.str());
+  } else {
+C.getDriver().Diag(diag::err_drv_command_failure) << "offload-arch";
   }
-  if (IsCuda && !UseLLVMOffload) {
-auto CudaTriple = getNVIDIAOffloadTargetTriple(
-*this, C.getInputArgs(), C.getDefaultToolChain().getTriple());
-if (!CudaTriple)
-  return;
+  return GPUArchs;
+}
 
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_Cuda, *CudaTriple,
-C.getDefaultToolChain().getTriple());
-
-// Emit a warning if the detected CUDA version is too new.
-const CudaInstallationDetector &CudaInstallation =
-static_cast(TC).CudaInstallation;
-if (CudaInstallation.isValid())
-  CudaInstallation.WarnIfUnsupportedVersion();
-C.addOffloadDeviceToolChain(&TC, Action::OFK_Cuda);
-OffloadArchs[&TC] = getOffloadArchs(C, C.getArgs(), Action::OFK_Cuda, &TC,
-/*SpecificToolchain=*/true);
-  } else if (IsHIP && !UseLLVMOffload) {
-if (auto *OMPTargetArg =
-C.getInputArgs().getLastArg(options::OPT_offload_targets_EQ)) {
-  Diag(clang::diag::err_drv_unsupported_opt_for_language_mode)
-  << OMPTargetArg->getSpelling() << "HIP";
-  return;
+// Attempts to infer the correct offloading toolchain triple by looking at the
+// requested offloading kind and architectures.
+static llvm::DenseSet
+inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) {
+  std::set Archs;
+  for (Arg *A : C.getInputArgs()) {
+for (StringRef Arch : A->getValues()) {
+  if (A->getOption().matches(options::OPT_offload_arch_EQ)) {
+if (Arch == "native") {
+  for (StringRef Str : getSystemOffloadArchs(C, Kind))
+Archs.insert(Str.str());
+} else {
+  Archs.insert(Arch.str());
+}
+  } else if (A->getOption().matches(options::OPT_no_offload_arch_EQ)) {
+if (Arch == "all")
+  Archs.clear();
+else
+  Archs.erase(Arch.str());
+  }
 }
+  }
 
-auto HIPTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs());
-if (!HIPTriple)
-  return;
-
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_HIP, *HIPTriple,
-C.getDefaultToolChain().getTriple());
-C.addOffloadDeviceToolChain(&TC, Action::OFK_HIP);
+  llvm::DenseSet Triples;
+  for (llvm::StringRef Arch : Archs) {
+OffloadArch ID = StringToOffloadArch(Arch);
+if (ID == OffloadArch::UNKNOWN)
+  ID = StringToOffloadArch(
+  getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
 
-// TODO: Fix 'amdgcnspirv' handling with the new driver.
-if (C.getInpu

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Joseph Huber via cfe-commits

jhuber6 wrote:

Should be fixed by 
https://github.com/llvm/llvm-project/commit/dc87a14efb381d960c8fbf988221f31216d7f5fd.
 The sentinel value used in this constant map was triggering UBSan.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Shilei Tian via cfe-commits

shiltian wrote:

I don't know which one. My PRs yesterday afternoon have a lot of crash in ADT 
but after rebase a couple of hours later they were gone. I suppose that would 
be the one.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Joseph Huber via cfe-commits

jhuber6 wrote:

> Someone else messed up it. The commit has been reverted.

Can you link which one? That's some awfully convenient timing that it caused 
failures on the offloading path at the same time I landed this.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Shilei Tian via cfe-commits

shiltian wrote:

Someone else messed up it. The commit has been reverted.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Joseph Huber via cfe-commits

jhuber6 wrote:

Yeah, seems like it's getting corrupt data in a dense map of offloading kinds? 
Guess I'll need to do a sanitizer build.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-22 Thread Michael Kruse via cfe-commits

Meinersbur wrote:

Failures of the sinitizer builds look related to this 
(https://lab.llvm.org/buildbot/#/builders/169/builds/13161):
```
0.  Program arguments: 
/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang 
-emit-llvm --cuda-device-only --offload=spirv32 -nocudalib -nocudainc 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/test/CodeGenCUDASPIRV/copy-aggregate-byval.cu
 -o 
/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/tools/clang/test/CodeGenCUDASPIRV/Output/copy-aggregate-byval.cu.tmp.bc
 -c
1.  Compilation construction
 #0 0x5fb87a758eb6 ___interceptor_backtrace 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:4497:13
 #1 0x5fb881dad278 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Unix/Signals.inc:834:13
 #2 0x5fb881da6ed9 llvm::sys::RunSignalHandlers() 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Signals.cpp:0:5
 #3 0x5fb881daf17e SignalHandler(int, siginfo_t*, void*) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Support/Unix/Signals.inc:426:38
 #4 0x7c6b77045250 (/lib/x86_64-linux-gnu/libc.so.6+0x45250)
 #5 0x7c6b770a3f1c pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0xa3f1c)
 #6 0x7c6b7704519e raise (/lib/x86_64-linux-gnu/libc.so.6+0x4519e)
 #7 0x7c6b77028902 abort (/lib/x86_64-linux-gnu/libc.so.6+0x28902)
 #8 0x5fb87a7db86c 
(/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x122b186c)
 #9 0x5fb87a7d969e __sanitizer::Die() 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_termination.cpp:52:5
#10 0x5fb87a7f4319 
(/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x122ca319)
#11 0x5fb883ae1136 getBuckets 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:901:40
#12 0x5fb883ae1136 getBuckets 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:575:65
#13 0x5fb883ae1136 
llvm::DenseMapBase, 
llvm::detail::DenseSetPair>, 
clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, 
llvm::DenseMapInfo, 
llvm::detail::DenseSetPair>::initEmpty() 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:442:23
#14 0x5fb883aede68 grow 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:0:64
#15 0x5fb883aede68 
llvm::detail::DenseSetPair* 
llvm::DenseMapBase, 
llvm::detail::DenseSetPair>, 
clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, 
llvm::DenseMapInfo, 
llvm::detail::DenseSetPair>::InsertIntoBucketImpl(clang::driver::Action::OffloadKind
 const&, llvm::detail::DenseSetPair*) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:0:0
#16 0x5fb883aed959 InsertIntoBucket 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:596:29
#17 0x5fb883aed959 
std::__1::pair, 
llvm::detail::DenseSetPair, false>, bool> 
llvm::DenseMapBase, 
llvm::detail::DenseSetPair>, 
clang::driver::Action::OffloadKind, llvm::detail::DenseSetEmpty, 
llvm::DenseMapInfo, 
llvm::detail::DenseSetPair>::try_emplace(clang::driver::Action::OffloadKind
 const&, llvm::detail::DenseSetEmpty&) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:292:17
#18 0x5fb883a800aa 
pair, 
llvm::detail::DenseSetPair, false>, bool, 
0> 
/home/b/sanitizer-x86_64-linux-fast/build/libcxx_install_asan_ubsan/include/c++/v1/__utility/pair.h:196:53
#19 0x5fb883a800aa insert 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/ADT/DenseSet.h:221:12
#20 0x5fb883a800aa 
clang::driver::Driver::CreateOffloadingDeviceToolChains(clang::driver::Compilation&,
 llvm::SmallVector, 16u>&) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:1073:13
#21 0x5fb883a960b2 
clang::driver::Driver::BuildCompilation(llvm::ArrayRef) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/lib/Driver/Driver.cpp:0:3
#22 0x5fb87a7fa4f9 clang_main(int, char**, llvm::ToolContext const&) 
/home/b/sanitizer-x86_64-linux-fast/build/llvm-project/clang/tools/driver/driver.cpp:376:44
#23 0x5fb87a826ac6 main 
/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/tools/clang/tools/driver/clang-driver.cpp:17:10
#24 0x7c6b7702a3b8 (/lib/x86_64-linux-gnu/libc.so.6+0x2a3b8)
#25 0x7c6b7702a47b __libc_start_main 
(/lib/x86_64-linux-gnu/libc.so.6+0x2a47b)
#26 0x5fb87a710325 _start 
(/home/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan_ubsan/bin/clang+0x121e6325)
```

https://lab.llvm.org/buildbot/#/builders/169/builds/13161:
```
==> 
/home/b/sanitizer-x86_64-linux-fast/build/sanitizer_logs/rep

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-21 Thread LLVM Continuous Integration via cfe-commits

llvm-ci wrote:

LLVM Buildbot has detected a new failure on builder `clang-ppc64-aix` running 
on `aix-ppc64` while building `clang` at step 5 "build-unified-tree".

Full details are available at: 
https://lab.llvm.org/buildbot/#/builders/64/builds/4943


Here is the relevant piece of the build log for the reference

```
Step 5 (build-unified-tree) failure: build (failure)
...
11.272 [144/10/71] Building OpenCLBuiltins.inc...
14.766 [141/10/72] Building CXX object 
tools/llvm-config/CMakeFiles/llvm-config.dir/llvm-config.cpp.o
15.109 [140/10/73] Building CXX object 
tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Warnings.cpp.o
16.669 [139/10/74] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Compilation.cpp.o
16.998 [138/10/75] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/MultilibBuilder.cpp.o
17.418 [137/10/76] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Job.cpp.o
17.608 [136/10/77] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/OptionUtils.cpp.o
17.709 [135/10/78] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/DriverOptions.cpp.o
19.411 [134/10/79] Building CXX object 
tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/DiagnosticIDs.cpp.o
20.141 [133/10/80] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
/home/llvm/llvm-external-buildbots/clang.19.1.2/bin/clang++ -DCLANG_EXPORTS 
-DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG 
-D_GLIBCXX_ASSERTIONS -D_LARGE_FILE_API -D_XOPEN_SOURCE=700 
-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/tools/clang/lib/Driver
 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver
 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/include
 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/tools/clang/include
 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/build/include
 
-I/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/llvm/include
 -mcmodel=large -fPIC -Werror -Werror=date-time 
-Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter 
-Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic 
-Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color 
-ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual 
-Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables 
-fno-rtti -UNDEBUG -pthread -MD -MT 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c 
/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp
/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |(C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
  |  ~~
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^~
 1091 | !(IsCuda || IsHIP)));
  | ~~
/home/llvm/llvm-external-buildbots/workers/aix-ppc64/clang-ppc64-aix/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 note: place parentheses around the '&&' expression to silence this warning
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^
  | (
 1091 | !(IsCuda || IsHIP)));
  |   
  |   )
1 error generated.
20.599 [133/9/81] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
21.151 [133/8/82] Building CXX object 
tools/clang/lib/Basic/CMakeFiles/obj.clangBasic.dir/Diagnostic.cpp.o
22.753 [133/7/83] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/CSKY.cpp.o
23.342 [133/6/84] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
23.730 [133/5/85] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
23.755 [133/4/86] Building CXX object 
too

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-21 Thread LLVM Continuous Integration via cfe-commits

llvm-ci wrote:

LLVM Buildbot has detected a new failure on builder `sanitizer-ppc64le-linux` 
running on `ppc64le-sanitizer` while building `clang` at step 2 "annotate".

Full details are available at: 
https://lab.llvm.org/buildbot/#/builders/72/builds/13357


Here is the relevant piece of the build log for the reference

```
Step 2 (annotate) failure: 'python 
../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py'
 (failure)
...
[3872/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/CSKYToolChain.cpp.o
[3873/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/AVR.cpp.o
[3874/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/HIPAMD.cpp.o
[3875/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[3876/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[3877/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Fuchsia.cpp.o
[3878/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/NetBSD.cpp.o
[3879/4277] Building CXX object 
tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/CreateInvocationFromCommandLine.cpp.o
[3880/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/ARM.cpp.o
[3881/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros 
/usr/bin/ccache 
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build0/bin/clang++
 -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG 
-D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS 
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/lib/Driver
 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver
 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/include
 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/tools/clang/include
 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/build_default/include
 
-I/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/llvm/include
 -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror 
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra 
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color 
-ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual 
-Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables 
-fno-rtti -UNDEBUG -MD -MT 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c 
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |(C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
  |  ~~
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^~
 1091 | !(IsCuda || IsHIP)));
  | ~~
/home/buildbots/llvm-external-buildbots/workers/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 note: place parentheses around the '&&' expression to silence this warning
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^
  | (
 1091 | !(IsCuda || IsHIP)));
  |   
  |   )
1 error generated.
[3882/4277] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-21 Thread LLVM Continuous Integration via cfe-commits

llvm-ci wrote:

LLVM Buildbot has detected a new failure on builder 
`sanitizer-x86_64-linux-android` running on `sanitizer-buildbot-android` while 
building `clang` at step 2 "annotate".

Full details are available at: 
https://lab.llvm.org/buildbot/#/builders/186/builds/10917


Here is the relevant piece of the build log for the reference

```
Step 2 (annotate) failure: 'python 
../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py'
 (failure)
...
[4515/5579] Linking CXX static library lib/libclangParse.a
[4516/5579] Linking CXX static library lib/libclangRewrite.a
[4517/5579] Linking CXX executable bin/llvm-ar
[4518/5579] Generating ../../bin/llvm-ranlib
[4519/5579] Generating ../../bin/llvm-lib
[4520/5579] Generating ../../bin/llvm-dlltool
[4521/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Multilib.cpp.o
[4522/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/CSKY.cpp.o
[4523/5579] Linking CXX executable bin/llvm-lto
[4524/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o
FAILED: tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o 
CCACHE_CPP2=yes CCACHE_HASHDIR=yes CCACHE_SLOPPINESS=pch_defines,time_macros 
/usr/bin/ccache 
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build0/bin/clang++
 -DCLANG_EXPORTS -DEXPERIMENTAL_KEY_INSTRUCTIONS -DGTEST_HAS_RTTI=0 -D_DEBUG 
-D_GLIBCXX_ASSERTIONS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS 
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/lib/Driver
 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver
 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/include
 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/tools/clang/include
 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/include
 
-I/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/llvm/include
 -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror 
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra 
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color 
-ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual 
-Wno-nested-anon-types -O3 -DNDEBUG -std=c++17  -fno-exceptions -funwind-tables 
-fno-rtti -UNDEBUG -MD -MT 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -MF 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o.d -o 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/Driver.cpp.o -c 
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 error: '&&' within '||' [-Werror,-Wlogical-op-parentheses]
 1089 |(C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) ||
  |  ~~
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^~
 1091 | !(IsCuda || IsHIP)));
  | ~~
/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm-project/clang/lib/Driver/Driver.cpp:1090:65:
 note: place parentheses around the '&&' expression to silence this warning
 1090 | (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ)) &&
  | ^
  | (
 1091 | !(IsCuda || IsHIP)));
  |   
  |   )
1 error generated.
[4525/5579] Linking CXX shared library lib/libLTO.so.22.0git
[4526/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/AArch64.cpp.o
[4527/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/M68k.cpp.o
[4528/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/SanitizerArgs.cpp.o
[4529/5579] Linking CXX executable bin/lld
[4530/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arch/LoongArch.cpp.o
[4531/5579] Building CXX object 
tools/clang/lib/Driver/CMakeFiles/obj.clangDriver.dir/ToolChains/Arc

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Joseph Huber via cfe-commits


@@ -109,65 +110,6 @@ using namespace clang::driver;
 using namespace clang;
 using namespace llvm::opt;
 
-static std::optional getOffloadTargetTriple(const Driver &D,
-  const ArgList &Args) 
{
-  auto OffloadTargets = Args.getAllArgValues(options::OPT_offload_EQ);
-  // Offload compilation flow does not support multiple targets for now. We

jhuber6 wrote:

Yes, this unifies the OpenMP way of doing it. If you had some incredibly 
complex scenario it would look like this for OpenMP.
```
clang -fopenmp input.c 
--offload-targets=amdgcn-amd-amdhsa,nvptx64-nvidia-cuda,x86_64-unknown-linux-gnu
 -Xarch_amdgcn --offload-arch=gfx1030,gfx90a -Xarch_nvptx64 
--offload-arch=sm_89 -Xarch_x86_64 --offload-arch=skylake
```
SYCL would work the same way, it would just create different toolchains due to 
the SYCL offloading kind.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Arvind Sudarsanam via cfe-commits


@@ -109,65 +110,6 @@ using namespace clang::driver;
 using namespace clang;
 using namespace llvm::opt;
 
-static std::optional getOffloadTargetTriple(const Driver &D,
-  const ArgList &Args) 
{
-  auto OffloadTargets = Args.getAllArgValues(options::OPT_offload_EQ);
-  // Offload compilation flow does not support multiple targets for now. We

asudarsa wrote:

Can multiple targets be supported for SYCL offload as well in this scenario? 
(Not too familiar with ActionBuilders).

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Joseph Huber via cfe-commits

https://github.com/jhuber6 updated 
https://github.com/llvm/llvm-project/pull/125556

>From ffa2217d80f35c720b0b1860b2b9b71dd4099301 Mon Sep 17 00:00:00 2001
From: Joseph Huber 
Date: Mon, 3 Feb 2025 12:46:27 -0600
Subject: [PATCH 1/3] [Clang] Introduce '--offload-targets=' to genericall
 target toolchains

Summary:
This is a new option that tries to make selecting offloading toolchains
more generic. Currently we infer the toolchain from a combination of the
kind and the `--offload-arch=` option. Doing this becomes complicated
when we want to start supporting multiple targets for a single
toolchain, i.e. HIP on SPIR-V or AMDGCN. Currently we hack in a special
'architecture' instead, which isn't extensible. Additionally in the
future we may accept compiling CUDA or HIP to some other architecture.
---
 .../clang/Basic/DiagnosticDriverKinds.td  |   2 +
 clang/include/clang/Driver/Driver.h   |   7 +-
 clang/include/clang/Driver/Options.td |   4 +-
 clang/include/clang/Driver/ToolChain.h|   4 -
 clang/lib/Driver/Driver.cpp   | 710 --
 clang/lib/Driver/ToolChain.cpp|  38 -
 clang/lib/Driver/ToolChains/AMDGPU.cpp|   2 +-
 clang/lib/Driver/ToolChains/Clang.cpp |  39 +-
 clang/lib/Driver/ToolChains/Cuda.cpp  |   2 +-
 clang/test/Driver/amdgpu-hip-system-arch.c|   6 +-
 clang/test/Driver/cuda-phases.cu  |  10 +-
 clang/test/Driver/hip-inputs.hip  |   4 +-
 clang/test/Driver/hip-invalid-target-id.hip   |   8 +-
 clang/test/Driver/hip-options.hip |   5 -
 clang/test/Driver/invalid-offload-options.cpp |  22 -
 clang/test/Driver/nvptx-cuda-system-arch.c|   6 +-
 clang/test/Driver/offload-target.c|  22 +
 clang/test/Driver/openmp-offload.c|  11 +-
 clang/test/Driver/openmp-system-arch.c|   8 +-
 19 files changed, 374 insertions(+), 536 deletions(-)
 create mode 100644 clang/test/Driver/offload-target.c

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 34b6c0d7a8acd..759ba0419bd45 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -116,6 +116,8 @@ def err_drv_cuda_host_arch : Error<
   "unsupported architecture '%0' for host compilation">;
 def err_drv_mix_cuda_hip : Error<
   "mixed CUDA and HIP compilation is not supported">;
+def err_drv_mix_offload : Error<
+  "mixed %0 and %1 offloading compilation is not supported">;
 def err_drv_bad_target_id : Error<
   "invalid target ID '%0'; format is a processor name followed by an optional "
   "colon-delimited list of features followed by an enable/disable sign (e.g., "
diff --git a/clang/include/clang/Driver/Driver.h 
b/clang/include/clang/Driver/Driver.h
index d9e328fe918bc..87b6d3d47cc69 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -355,6 +355,9 @@ class Driver {
   phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL,
llvm::opt::Arg **FinalPhaseArg = nullptr) const;
 
+  llvm::Expected>
+  executeProgram(llvm::ArrayRef Args) const;
+
 private:
   /// Certain options suppress the 'no input files' warning.
   LLVM_PREFERRED_TYPE(bool)
@@ -367,6 +370,7 @@ class Driver {
   /// stored in it, and will clean them up when torn down.
   mutable llvm::StringMap> ToolChains;
 
+public:
   /// The associated offloading architectures with each toolchain.
   llvm::DenseMap>
   OffloadArchs;
@@ -537,8 +541,7 @@ class Driver {
   /// empty string.
   llvm::SmallVector
   getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
-  Action::OffloadKind Kind, const ToolChain *TC,
-  bool SpecificToolchain = true) const;
+  Action::OffloadKind Kind, const ToolChain &TC) const;
 
   /// Check that the file referenced by Value exists. If it doesn't,
   /// issue a diagnostic and return false.
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 6c22f06b269fb..cd92994967f0a 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1156,7 +1156,7 @@ def offload_arch_EQ : CommaJoined<["--"], 
"offload-arch=">,
"If 'native' is used the compiler will detect locally installed 
architectures. "
"For HIP offloading, the device architecture can be followed by 
target ID features "
"delimited by a colon (e.g. gfx908:xnack+:sramecc-). May be 
specified more than once.">;
-def no_offload_arch_EQ : Joined<["--"], "no-offload-arch=">,
+def no_offload_arch_EQ : CommaJoined<["--"], "no-offload-arch=">,
   Visibility<[ClangOption, FlangOption]>,
   HelpText<"Remove CUDA/HIP offloading device architecture (e.g. sm_35, 
gfx906) from the list of devices to compile for. "
"'all' resets the list to its default valu

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Joseph Huber via cfe-commits


@@ -458,6 +400,44 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
   return FinalPhase;
 }
 
+llvm::Expected>
+Driver::executeProgram(llvm::ArrayRef Args) const {
+  llvm::SmallString<64> OutputFile;
+  llvm::sys::fs::createTemporaryFile("driver-program", "txt", OutputFile,
+ llvm::sys::fs::OF_Text);
+  llvm::FileRemover OutputRemover(OutputFile.c_str());
+  std::optional Redirects[] = {
+  {""},
+  OutputFile.str(),
+  {""},
+  };
+
+  std::string ErrorMessage;
+  int SecondsToWait = 60;
+  if (std::optional Str =
+  llvm::sys::Process::GetEnv("CLANG_TOOLCHAIN_PROGRAM_TIMEOUT")) {
+if (!llvm::to_integer(*Str, SecondsToWait))
+  return llvm::createStringError(std::error_code(),
+ "CLANG_TOOLCHAIN_PROGRAM_TIMEOUT expected 
"
+ "an integer, got '" +
+ *Str + "'");
+SecondsToWait = std::max(SecondsToWait, 0); // infinite
+  }
+  StringRef Executable = Args[0];
+  if (llvm::sys::ExecuteAndWait(Executable, Args, {}, Redirects, SecondsToWait,
+/*MemoryLimit=*/0, &ErrorMessage))
+return llvm::createStringError(std::error_code(),
+   Executable + ": " + ErrorMessage);
+
+  llvm::ErrorOr> OutputBuf =
+  llvm::MemoryBuffer::getFile(OutputFile.c_str());
+  if (!OutputBuf)
+return llvm::createStringError(OutputBuf.getError(),
+   "Failed to read stdout of " + Executable +

jhuber6 wrote:

These were already here, could we move changing them into a follow-up?

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Joseph Huber via cfe-commits


@@ -950,221 +930,261 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {
+llvm::SmallVector Args{*Executable};
+if (Kind == Action::OFK_HIP)
+  Args.push_back("--only=amdgpu");
+else if (Kind == Action::OFK_Cuda)
+  Args.push_back("--only=nvptx");
+auto StdoutOrErr = C.getDriver().executeProgram(Args);
+
+if (!StdoutOrErr) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind)
+  << llvm::toString(StdoutOrErr.takeError()) << "--offload-arch";

jhuber6 wrote:

It's possible, I'll check.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-18 Thread Joseph Huber via cfe-commits


@@ -950,221 +930,261 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {
+llvm::SmallVector Args{*Executable};
+if (Kind == Action::OFK_HIP)
+  Args.push_back("--only=amdgpu");
+else if (Kind == Action::OFK_Cuda)
+  Args.push_back("--only=nvptx");
+auto StdoutOrErr = C.getDriver().executeProgram(Args);
+
+if (!StdoutOrErr) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind)
+  << llvm::toString(StdoutOrErr.takeError()) << "--offload-arch";
+  return GPUArchs;
+} else if ((*StdoutOrErr)->getBuffer().empty()) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind) << "No GPU detected in the 
system"
+  << "--offload-arch";
+  return GPUArchs;
+}
+
+for (StringRef Arch : llvm::split((*StdoutOrErr)->getBuffer(), "\n"))
+  if (!Arch.empty())
+GPUArchs.push_back(Arch.str());
+  } else {
+C.getDriver().Diag(diag::err_drv_command_failure) << "offload-arch";
   }
-  if (IsCuda && !UseLLVMOffload) {
-auto CudaTriple = getNVIDIAOffloadTargetTriple(
-*this, C.getInputArgs(), C.getDefaultToolChain().getTriple());
-if (!CudaTriple)
-  return;
+  return GPUArchs;
+}
 
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_Cuda, *CudaTriple,
-C.getDefaultToolChain().getTriple());
-
-// Emit a warning if the detected CUDA version is too new.
-const CudaInstallationDetector &CudaInstallation =
-static_cast(TC).CudaInstallation;
-if (CudaInstallation.isValid())
-  CudaInstallation.WarnIfUnsupportedVersion();
-C.addOffloadDeviceToolChain(&TC, Action::OFK_Cuda);
-OffloadArchs[&TC] = getOffloadArchs(C, C.getArgs(), Action::OFK_Cuda, &TC,
-/*SpecificToolchain=*/true);
-  } else if (IsHIP && !UseLLVMOffload) {
-if (auto *OMPTargetArg =
-C.getInputArgs().getLastArg(options::OPT_offload_targets_EQ)) {
-  Diag(clang::diag::err_drv_unsupported_opt_for_language_mode)
-  << OMPTargetArg->getSpelling() << "HIP";
-  return;
+// Attempts to infer the correct offloading toolchain triple by looking at the
+// requested offloading kind and architectures.
+static llvm::DenseSet
+inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) {
+  std::set Archs;
+  for (Arg *A : C.getInputArgs()) {
+for (StringRef Arch : A->getValues()) {
+  if (A->getOption().matches(options::OPT_offload_arch_EQ)) {
+if (Arch == "native") {
+  for (StringRef Str : getSystemOffloadArchs(C, Kind))
+Archs.insert(Str.str());
+} else {
+  Archs.insert(Arch.str());
+}
+  } else if (A->getOption().matches(options::OPT_no_offload_arch_EQ)) {
+if (Arch == "all")
+  Archs.clear();
+else
+  Archs.erase(Arch.str());
+  }
 }
+  }
 
-auto HIPTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs());
-if (!HIPTriple)
-  return;
-
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_HIP, *HIPTriple,
-C.getDefaultToolChain().getTriple());
-C.addOffloadDeviceToolChain(&TC, Action::OFK_HIP);
+  llvm::DenseSet Triples;
+  for (llvm::StringRef Arch : Archs) {
+OffloadArch ID = StringToOffloadArch(Arch);
+if (ID == OffloadArch::UNKNOWN)
+  ID = StringToOffloadArch(
+  getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
 
-// TODO: Fix 'amdgcnspirv' handling with the new driver.
- 

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Joseph Huber via cfe-commits

https://github.com/jhuber6 updated 
https://github.com/llvm/llvm-project/pull/125556

>From ffa2217d80f35c720b0b1860b2b9b71dd4099301 Mon Sep 17 00:00:00 2001
From: Joseph Huber 
Date: Mon, 3 Feb 2025 12:46:27 -0600
Subject: [PATCH 1/2] [Clang] Introduce '--offload-targets=' to genericall
 target toolchains

Summary:
This is a new option that tries to make selecting offloading toolchains
more generic. Currently we infer the toolchain from a combination of the
kind and the `--offload-arch=` option. Doing this becomes complicated
when we want to start supporting multiple targets for a single
toolchain, i.e. HIP on SPIR-V or AMDGCN. Currently we hack in a special
'architecture' instead, which isn't extensible. Additionally in the
future we may accept compiling CUDA or HIP to some other architecture.
---
 .../clang/Basic/DiagnosticDriverKinds.td  |   2 +
 clang/include/clang/Driver/Driver.h   |   7 +-
 clang/include/clang/Driver/Options.td |   4 +-
 clang/include/clang/Driver/ToolChain.h|   4 -
 clang/lib/Driver/Driver.cpp   | 710 --
 clang/lib/Driver/ToolChain.cpp|  38 -
 clang/lib/Driver/ToolChains/AMDGPU.cpp|   2 +-
 clang/lib/Driver/ToolChains/Clang.cpp |  39 +-
 clang/lib/Driver/ToolChains/Cuda.cpp  |   2 +-
 clang/test/Driver/amdgpu-hip-system-arch.c|   6 +-
 clang/test/Driver/cuda-phases.cu  |  10 +-
 clang/test/Driver/hip-inputs.hip  |   4 +-
 clang/test/Driver/hip-invalid-target-id.hip   |   8 +-
 clang/test/Driver/hip-options.hip |   5 -
 clang/test/Driver/invalid-offload-options.cpp |  22 -
 clang/test/Driver/nvptx-cuda-system-arch.c|   6 +-
 clang/test/Driver/offload-target.c|  22 +
 clang/test/Driver/openmp-offload.c|  11 +-
 clang/test/Driver/openmp-system-arch.c|   8 +-
 19 files changed, 374 insertions(+), 536 deletions(-)
 create mode 100644 clang/test/Driver/offload-target.c

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 34b6c0d7a8acd..759ba0419bd45 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -116,6 +116,8 @@ def err_drv_cuda_host_arch : Error<
   "unsupported architecture '%0' for host compilation">;
 def err_drv_mix_cuda_hip : Error<
   "mixed CUDA and HIP compilation is not supported">;
+def err_drv_mix_offload : Error<
+  "mixed %0 and %1 offloading compilation is not supported">;
 def err_drv_bad_target_id : Error<
   "invalid target ID '%0'; format is a processor name followed by an optional "
   "colon-delimited list of features followed by an enable/disable sign (e.g., "
diff --git a/clang/include/clang/Driver/Driver.h 
b/clang/include/clang/Driver/Driver.h
index d9e328fe918bc..87b6d3d47cc69 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -355,6 +355,9 @@ class Driver {
   phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL,
llvm::opt::Arg **FinalPhaseArg = nullptr) const;
 
+  llvm::Expected>
+  executeProgram(llvm::ArrayRef Args) const;
+
 private:
   /// Certain options suppress the 'no input files' warning.
   LLVM_PREFERRED_TYPE(bool)
@@ -367,6 +370,7 @@ class Driver {
   /// stored in it, and will clean them up when torn down.
   mutable llvm::StringMap> ToolChains;
 
+public:
   /// The associated offloading architectures with each toolchain.
   llvm::DenseMap>
   OffloadArchs;
@@ -537,8 +541,7 @@ class Driver {
   /// empty string.
   llvm::SmallVector
   getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
-  Action::OffloadKind Kind, const ToolChain *TC,
-  bool SpecificToolchain = true) const;
+  Action::OffloadKind Kind, const ToolChain &TC) const;
 
   /// Check that the file referenced by Value exists. If it doesn't,
   /// issue a diagnostic and return false.
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 6c22f06b269fb..cd92994967f0a 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1156,7 +1156,7 @@ def offload_arch_EQ : CommaJoined<["--"], 
"offload-arch=">,
"If 'native' is used the compiler will detect locally installed 
architectures. "
"For HIP offloading, the device architecture can be followed by 
target ID features "
"delimited by a colon (e.g. gfx908:xnack+:sramecc-). May be 
specified more than once.">;
-def no_offload_arch_EQ : Joined<["--"], "no-offload-arch=">,
+def no_offload_arch_EQ : CommaJoined<["--"], "no-offload-arch=">,
   Visibility<[ClangOption, FlangOption]>,
   HelpText<"Remove CUDA/HIP offloading device architecture (e.g. sm_35, 
gfx906) from the list of devices to compile for. "
"'all' resets the list to its default valu

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Joseph Huber via cfe-commits


@@ -14,14 +14,14 @@
 // RUN:   | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
 // RUN:   not %clang -### --target=x86_64-unknown-linux-gnu -nogpulib 
--offload-new-driver --offload-arch=native 
--amdgpu-arch-tool=%t/amdgpu_arch_fail -x hip %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
-// NO-OUTPUT-ERROR: error: cannot determine amdgcn architecture{{.*}}; 
consider passing it via '--offload-arch'
+// NO-OUTPUT-ERROR: error: cannot determine hip architecture{{.*}}; consider 
passing it via '--offload-arch'

jhuber6 wrote:

Yeah, I can reword them a bit. Mostly it just comes from the fact that now it's 
a generic 'offload-arch' utility instead of two separate ones we can't as 
easily make a distinction on which architecture it failed on.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Joseph Huber via cfe-commits


@@ -3441,91 +3455,25 @@ class OffloadingActionBuilder final {
 return true;
   }
 
-  ToolChains.push_back(
-  AssociatedOffloadKind == Action::OFK_Cuda
-  ? C.getSingleOffloadToolChain()
-  : C.getSingleOffloadToolChain());
-
-  CompileHostOnly = C.getDriver().offloadHostOnly();
-  EmitLLVM = Args.getLastArg(options::OPT_emit_llvm);
-  EmitAsm = Args.getLastArg(options::OPT_S);
-
-  // --offload and --offload-arch options are mutually exclusive.
-  if (Args.hasArgNoClaim(options::OPT_offload_EQ) &&
-  Args.hasArgNoClaim(options::OPT_offload_arch_EQ,
- options::OPT_no_offload_arch_EQ)) {
-C.getDriver().Diag(diag::err_opt_not_valid_with_opt) << 
"--offload-arch"
- << "--offload";
-  }
-
-  // Collect all offload arch parameters, removing duplicates.
   std::set GpuArchs;
-  bool Error = false;
-  const ToolChain &TC = *ToolChains.front();
-  for (Arg *A : C.getArgsForToolChain(&TC, /*BoundArch=*/"",
-  AssociatedOffloadKind)) {
-if (!(A->getOption().matches(options::OPT_offload_arch_EQ) ||
-  A->getOption().matches(options::OPT_no_offload_arch_EQ)))
-  continue;
-A->claim();
-
-for (StringRef ArchStr : llvm::split(A->getValue(), ",")) {
-  if (A->getOption().matches(options::OPT_no_offload_arch_EQ) &&
-  ArchStr == "all") {
-GpuArchs.clear();
-  } else if (ArchStr == "native") {
-auto GPUsOrErr = ToolChains.front()->getSystemGPUArchs(Args);
-if (!GPUsOrErr) {
-  TC.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
-  << llvm::Triple::getArchTypeName(TC.getArch())
-  << llvm::toString(GPUsOrErr.takeError()) << "--offload-arch";
-  continue;
-}
+  for (Action::OffloadKind Kind : {Action::OFK_Cuda, Action::OFK_HIP}) {
+auto TCRange = C.getOffloadToolChains(Kind);
+for (auto &I : llvm::make_range(TCRange)) {
+  ToolChains.push_back(I.second);
 
-for (auto GPU : *GPUsOrErr) {
-  GpuArchs.insert(Args.MakeArgString(GPU));
-}
-  } else {
-ArchStr = getCanonicalOffloadArch(ArchStr);
-if (ArchStr.empty()) {
-  Error = true;
-} else if (A->getOption().matches(options::OPT_offload_arch_EQ))
-  GpuArchs.insert(ArchStr);
-else if (A->getOption().matches(options::OPT_no_offload_arch_EQ))
-  GpuArchs.erase(ArchStr);
-else
-  llvm_unreachable("Unexpected option.");
-  }
+  for (auto Arch : C.getDriver().OffloadArchs.lookup(I.second))
+GpuArchs.insert(Arch);

jhuber6 wrote:

I will probably move this back to when we create the job actions after this 
patch, the `OffloadArchs` global was only necessary when I had to 'precompute' 
a few conflicting architectures (like if someone did 
--offload-arch=sm_89,gfx1030 -fopenmp) because it creates two toolchains that 
would then share that option. I work around that here by modifying the derived 
argument list.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits


@@ -14,14 +14,14 @@
 // RUN:   | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
 // RUN:   not %clang -### --target=x86_64-unknown-linux-gnu -nogpulib 
--offload-new-driver --offload-arch=native 
--amdgpu-arch-tool=%t/amdgpu_arch_fail -x hip %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
-// NO-OUTPUT-ERROR: error: cannot determine amdgcn architecture{{.*}}; 
consider passing it via '--offload-arch'
+// NO-OUTPUT-ERROR: error: cannot determine hip architecture{{.*}}; consider 
passing it via '--offload-arch'

Artem-B wrote:

The new message sounds odd, as there's no such thing as HIP or CUDA 
architecture. I guess it should be something along the lines of "determine 
target architecture for the HIP compilation". 

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits


@@ -951,221 +931,262 @@ static bool addSYCLDefaultTriple(Compilation &C,
   return true;
 }
 
-void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
-  InputList &Inputs) {
-
-  //
-  // CUDA/HIP
-  //
-  // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA
-  // or HIP type. However, mixed CUDA/HIP compilation is not supported.
-  bool IsCuda =
-  llvm::any_of(Inputs, [](std::pair &I) 
{
-return types::isCuda(I.first);
-  });
-  bool IsHIP =
-  llvm::any_of(Inputs,
-   [](std::pair &I) {
- return types::isHIP(I.first);
-   }) ||
-  C.getInputArgs().hasArg(options::OPT_hip_link) ||
-  C.getInputArgs().hasArg(options::OPT_hipstdpar);
-  bool UseLLVMOffload = C.getInputArgs().hasArg(
-  options::OPT_foffload_via_llvm, options::OPT_fno_offload_via_llvm, 
false);
-  if (IsCuda && IsHIP) {
-Diag(clang::diag::err_drv_mix_cuda_hip);
-return;
+// Handles `native` offload architectures by using the 'offload-arch' utility.
+static llvm::SmallVector
+getSystemOffloadArchs(Compilation &C, Action::OffloadKind Kind) {
+  StringRef Program = C.getArgs().getLastArgValue(
+  options::OPT_offload_arch_tool_EQ, "offload-arch");
+
+  SmallVector GPUArchs;
+  if (llvm::ErrorOr Executable =
+  llvm::sys::findProgramByName(Program)) {
+llvm::SmallVector Args{*Executable};
+if (Kind == Action::OFK_HIP)
+  Args.push_back("--only=amdgpu");
+else if (Kind == Action::OFK_Cuda)
+  Args.push_back("--only=nvptx");
+auto StdoutOrErr = C.getDriver().executeProgram(Args);
+
+if (!StdoutOrErr) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind)
+  << llvm::toString(StdoutOrErr.takeError()) << "--offload-arch";
+  return GPUArchs;
+} else if ((*StdoutOrErr)->getBuffer().empty()) {
+  C.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
+  << Action::GetOffloadKindName(Kind) << "No GPU detected in the 
system"
+  << "--offload-arch";
+  return GPUArchs;
+}
+
+for (StringRef Arch : llvm::split((*StdoutOrErr)->getBuffer(), "\n"))
+  if (!Arch.empty())
+GPUArchs.push_back(Arch.str());
+  } else {
+C.getDriver().Diag(diag::err_drv_command_failure) << "offload-arch";
   }
-  if (IsCuda && !UseLLVMOffload) {
-auto CudaTriple = getNVIDIAOffloadTargetTriple(
-*this, C.getInputArgs(), C.getDefaultToolChain().getTriple());
-if (!CudaTriple)
-  return;
+  return GPUArchs;
+}
 
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_Cuda, *CudaTriple,
-C.getDefaultToolChain().getTriple());
-
-// Emit a warning if the detected CUDA version is too new.
-const CudaInstallationDetector &CudaInstallation =
-static_cast(TC).CudaInstallation;
-if (CudaInstallation.isValid())
-  CudaInstallation.WarnIfUnsupportedVersion();
-C.addOffloadDeviceToolChain(&TC, Action::OFK_Cuda);
-OffloadArchs[&TC] = getOffloadArchs(C, C.getArgs(), Action::OFK_Cuda, &TC,
-/*SpecificToolchain=*/true);
-  } else if (IsHIP && !UseLLVMOffload) {
-if (auto *OMPTargetArg =
-C.getInputArgs().getLastArg(options::OPT_offload_targets_EQ)) {
-  Diag(clang::diag::err_drv_unsupported_opt_for_language_mode)
-  << OMPTargetArg->getSpelling() << "HIP";
-  return;
+// Attempts to infer the correct offloading toolchain triple by looking at the
+// requested offloading kind and architectures.
+static llvm::DenseSet
+inferOffloadToolchains(Compilation &C, Action::OffloadKind Kind) {
+  std::set Archs;
+  for (Arg *A : C.getInputArgs()) {
+for (StringRef Arch : A->getValues()) {
+  if (A->getOption().matches(options::OPT_offload_arch_EQ)) {
+if (Arch == "native") {
+  for (StringRef Str : getSystemOffloadArchs(C, Kind))
+Archs.insert(Str.str());
+} else {
+  Archs.insert(Arch.str());
+}
+  } else if (A->getOption().matches(options::OPT_no_offload_arch_EQ)) {
+if (Arch == "all")
+  Archs.clear();
+else
+  Archs.erase(Arch.str());
+  }
 }
+  }
 
-auto HIPTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs());
-if (!HIPTriple)
-  return;
-
-auto &TC =
-getOffloadToolChain(C.getInputArgs(), Action::OFK_HIP, *HIPTriple,
-C.getDefaultToolChain().getTriple());
-C.addOffloadDeviceToolChain(&TC, Action::OFK_HIP);
+  llvm::DenseSet Triples;
+  for (llvm::StringRef Arch : Archs) {
+OffloadArch ID = StringToOffloadArch(Arch);
+if (ID == OffloadArch::UNKNOWN)
+  ID = StringToOffloadArch(
+  getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
 
-// TODO: Fix 'amdgcnspirv' handling with the new driver.
- 

[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits


@@ -3441,91 +3455,25 @@ class OffloadingActionBuilder final {
 return true;
   }
 
-  ToolChains.push_back(
-  AssociatedOffloadKind == Action::OFK_Cuda
-  ? C.getSingleOffloadToolChain()
-  : C.getSingleOffloadToolChain());
-
-  CompileHostOnly = C.getDriver().offloadHostOnly();
-  EmitLLVM = Args.getLastArg(options::OPT_emit_llvm);
-  EmitAsm = Args.getLastArg(options::OPT_S);
-
-  // --offload and --offload-arch options are mutually exclusive.
-  if (Args.hasArgNoClaim(options::OPT_offload_EQ) &&
-  Args.hasArgNoClaim(options::OPT_offload_arch_EQ,
- options::OPT_no_offload_arch_EQ)) {
-C.getDriver().Diag(diag::err_opt_not_valid_with_opt) << 
"--offload-arch"
- << "--offload";
-  }
-
-  // Collect all offload arch parameters, removing duplicates.
   std::set GpuArchs;
-  bool Error = false;
-  const ToolChain &TC = *ToolChains.front();
-  for (Arg *A : C.getArgsForToolChain(&TC, /*BoundArch=*/"",
-  AssociatedOffloadKind)) {
-if (!(A->getOption().matches(options::OPT_offload_arch_EQ) ||
-  A->getOption().matches(options::OPT_no_offload_arch_EQ)))
-  continue;
-A->claim();
-
-for (StringRef ArchStr : llvm::split(A->getValue(), ",")) {
-  if (A->getOption().matches(options::OPT_no_offload_arch_EQ) &&
-  ArchStr == "all") {
-GpuArchs.clear();
-  } else if (ArchStr == "native") {
-auto GPUsOrErr = ToolChains.front()->getSystemGPUArchs(Args);
-if (!GPUsOrErr) {
-  TC.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
-  << llvm::Triple::getArchTypeName(TC.getArch())
-  << llvm::toString(GPUsOrErr.takeError()) << "--offload-arch";
-  continue;
-}
+  for (Action::OffloadKind Kind : {Action::OFK_Cuda, Action::OFK_HIP}) {
+auto TCRange = C.getOffloadToolChains(Kind);
+for (auto &I : llvm::make_range(TCRange)) {
+  ToolChains.push_back(I.second);
 
-for (auto GPU : *GPUsOrErr) {
-  GpuArchs.insert(Args.MakeArgString(GPU));
-}
-  } else {
-ArchStr = getCanonicalOffloadArch(ArchStr);
-if (ArchStr.empty()) {
-  Error = true;
-} else if (A->getOption().matches(options::OPT_offload_arch_EQ))
-  GpuArchs.insert(ArchStr);
-else if (A->getOption().matches(options::OPT_no_offload_arch_EQ))
-  GpuArchs.erase(ArchStr);
-else
-  llvm_unreachable("Unexpected option.");
-  }
+  for (auto Arch : C.getDriver().OffloadArchs.lookup(I.second))
+GpuArchs.insert(Arch);

Artem-B wrote:

Can we just `.append()` the lookup result instead of doing it per-element?

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits


@@ -3441,91 +3455,25 @@ class OffloadingActionBuilder final {
 return true;
   }
 
-  ToolChains.push_back(
-  AssociatedOffloadKind == Action::OFK_Cuda
-  ? C.getSingleOffloadToolChain()
-  : C.getSingleOffloadToolChain());
-
-  CompileHostOnly = C.getDriver().offloadHostOnly();
-  EmitLLVM = Args.getLastArg(options::OPT_emit_llvm);
-  EmitAsm = Args.getLastArg(options::OPT_S);
-
-  // --offload and --offload-arch options are mutually exclusive.
-  if (Args.hasArgNoClaim(options::OPT_offload_EQ) &&
-  Args.hasArgNoClaim(options::OPT_offload_arch_EQ,
- options::OPT_no_offload_arch_EQ)) {
-C.getDriver().Diag(diag::err_opt_not_valid_with_opt) << 
"--offload-arch"
- << "--offload";
-  }
-
-  // Collect all offload arch parameters, removing duplicates.
   std::set GpuArchs;
-  bool Error = false;
-  const ToolChain &TC = *ToolChains.front();
-  for (Arg *A : C.getArgsForToolChain(&TC, /*BoundArch=*/"",
-  AssociatedOffloadKind)) {
-if (!(A->getOption().matches(options::OPT_offload_arch_EQ) ||
-  A->getOption().matches(options::OPT_no_offload_arch_EQ)))
-  continue;
-A->claim();
-
-for (StringRef ArchStr : llvm::split(A->getValue(), ",")) {
-  if (A->getOption().matches(options::OPT_no_offload_arch_EQ) &&
-  ArchStr == "all") {
-GpuArchs.clear();
-  } else if (ArchStr == "native") {
-auto GPUsOrErr = ToolChains.front()->getSystemGPUArchs(Args);
-if (!GPUsOrErr) {
-  TC.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
-  << llvm::Triple::getArchTypeName(TC.getArch())
-  << llvm::toString(GPUsOrErr.takeError()) << "--offload-arch";
-  continue;
-}
+  for (Action::OffloadKind Kind : {Action::OFK_Cuda, Action::OFK_HIP}) {
+auto TCRange = C.getOffloadToolChains(Kind);

Artem-B wrote:

Nit: We don't seem to use `TCRange` outside of the `make_range`, so I'd just 
fold it into the call.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits

https://github.com/Artem-B commented:

Drive-by style/syntax mostly review. LGTM overall, with a few nits.

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits


@@ -4,7 +4,7 @@
 // RUN:   --rocm-path=%S/Inputs/rocm \
 // RUN:   %s 2>&1 | FileCheck -check-prefix=NOPLUS %s
 
-// NOPLUS: error: invalid target ID 'gfx908xnack'
+// NOPLUS: error: unsupported HIP gpu architecture: gfx908xnack 

Artem-B wrote:

"HIP compilation can not target GPU architecture..."

https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-17 Thread Artem Belevich via cfe-commits

https://github.com/Artem-B edited 
https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Rework creating offloading toolchains (PR #125556)

2025-07-16 Thread Joseph Huber via cfe-commits

https://github.com/jhuber6 edited 
https://github.com/llvm/llvm-project/pull/125556
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits