[clang] [Clang] Rework creating offloading toolchains (PR #125556)
@@ -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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
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)
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
