diff options
author | Joseph Huber <huberjn@outlook.com> | 2025-01-31 10:32:24 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-31 10:32:24 -0600 |
commit | 272ce90ed4814a2a5c87c78b5bcf24fc60b5703c (patch) | |
tree | 4658b37cabc15579c4517cc061438700b89a2421 /clang/lib/Driver/Driver.cpp | |
parent | 0324c70f4e6a2115c9255d331274cc9413b66995 (diff) | |
download | llvm-272ce90ed4814a2a5c87c78b5bcf24fc60b5703c.zip llvm-272ce90ed4814a2a5c87c78b5bcf24fc60b5703c.tar.gz llvm-272ce90ed4814a2a5c87c78b5bcf24fc60b5703c.tar.bz2 |
[Clang] Make OpenMP offloading consistently use the bound architecture (#125135)
Summary:
OpenMP was weirdly split between using the bound architecture from
`--offload-arch=` and the old `-march=` option which only worked for
single jobs. This patch removes that special handling. The main benefit
here is that we can now use `getToolchainArgs` without it throwing an
error.
I'm assuming SYCL doesn't care about this because they don't use an
architecture.
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 612e44b..912777a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4712,23 +4712,7 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, return KnownArchs.lookup(TC); llvm::DenseSet<StringRef> Archs; - for (auto *Arg : Args) { - // Extract any '--[no-]offload-arch' arguments intended for this toolchain. - std::unique_ptr<llvm::opt::Arg> ExtractedArg = nullptr; - if (Arg->getOption().matches(options::OPT_Xopenmp_target_EQ) && - ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) { - Arg->claim(); - unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1)); - unsigned Prev = Index; - ExtractedArg = getOpts().ParseOneArg(Args, Index); - if (!ExtractedArg || Index > Prev + 1) { - TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args) - << Arg->getAsString(Args); - continue; - } - Arg = ExtractedArg.get(); - } - + for (auto *Arg : C.getArgsForToolChain(TC, /*BoundArch=*/"", Kind)) { // Add or remove the seen architectures in order of appearance. If an // invalid architecture is given we simply exit. if (Arg->getOption().matches(options::OPT_offload_arch_EQ)) { @@ -4785,14 +4769,31 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, return Archs; if (Archs.empty()) { - if (Kind == Action::OFK_Cuda) + if (Kind == Action::OFK_Cuda) { Archs.insert(OffloadArchToString(OffloadArch::CudaDefault)); - else if (Kind == Action::OFK_HIP) + } else if (Kind == Action::OFK_HIP) { Archs.insert(OffloadArchToString(OffloadArch::HIPDefault)); - else if (Kind == Action::OFK_OpenMP) - Archs.insert(StringRef()); - else if (Kind == Action::OFK_SYCL) + } else if (Kind == Action::OFK_SYCL) { Archs.insert(StringRef()); + } else if (Kind == Action::OFK_OpenMP) { + // Accept legacy `-march` device arguments for OpenMP. + if (auto *Arg = C.getArgsForToolChain(TC, /*BoundArch=*/"", Kind) + .getLastArg(options::OPT_march_EQ)) { + Archs.insert(Arg->getValue()); + } else { + auto ArchsOrErr = TC->getSystemGPUArchs(Args); + if (!ArchsOrErr) { + TC->getDriver().Diag(diag::err_drv_undetermined_gpu_arch) + << llvm::Triple::getArchTypeName(TC->getArch()) + << llvm::toString(ArchsOrErr.takeError()) << "--offload-arch"; + } else if (!ArchsOrErr->empty()) { + for (auto Arch : *ArchsOrErr) + Archs.insert(Args.MakeArgStringRef(Arch)); + } else { + Archs.insert(StringRef()); + } + } + } } else { Args.ClaimAllArgs(options::OPT_offload_arch_EQ); Args.ClaimAllArgs(options::OPT_no_offload_arch_EQ); |