aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
authorJoseph Huber <huberjn@outlook.com>2025-01-31 10:32:24 -0600
committerGitHub <noreply@github.com>2025-01-31 10:32:24 -0600
commit272ce90ed4814a2a5c87c78b5bcf24fc60b5703c (patch)
tree4658b37cabc15579c4517cc061438700b89a2421 /clang/lib/Driver/Driver.cpp
parent0324c70f4e6a2115c9255d331274cc9413b66995 (diff)
downloadllvm-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.cpp45
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);