Author: Joseph Huber Date: 2022-07-11T15:37:50-04:00 New Revision: 359e4a8247316c2f0c21072919836fd9fd4cf0f1
URL: https://github.com/llvm/llvm-project/commit/359e4a8247316c2f0c21072919836fd9fd4cf0f1 DIFF: https://github.com/llvm/llvm-project/commit/359e4a8247316c2f0c21072919836fd9fd4cf0f1.diff LOG: [Clang] Parse toolchain-specific offloading arguments directly OpenMP supports multiple offloading toolchains and architectures. In order to support this we originally used `getArgsForToolchain` to get the arguments only intended for each toolchain. This allowed users to manually specify if an `--offload-arch=` argument was intended for which toolchain using `-Xopenmp-target=` or other methods. For example, ``` clang input.c -fopenmp -fopenmp-targets=nvptx64,amdgcn -Xopenmp-target=nvptx64 --offload-arch=sm_70 -Xopenmp-target=amdgcn --offload-arch=gfx908 ``` However, this was causing problems with the AMDGPU toolchain. This is because the AMDGPU toolchain for OpenMP uses an `amdgpu` arch to determine the architecture. If this tool is not availible the compiler will exit with an error even when manually specifying the architecture. This patch pulls out the logic in `getArgsForToolchain` and specializes it for extracting `--offload-arch` arguments to avoid this. Reviewed By: JonChesterfield, yaxunl Differential Revision: https://reviews.llvm.org/D129435 Added: Modified: clang/lib/Driver/Driver.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0da32dae2ef60..80fa3c158abc2 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4355,7 +4355,17 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, return KnownArchs.lookup(TC); llvm::DenseSet<StringRef> Archs; - for (auto &Arg : Args) { + 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)); + ExtractedArg = getOpts().ParseOneArg(Args, Index); + Arg = ExtractedArg.get(); + } + if (Arg->getOption().matches(options::OPT_offload_arch_EQ)) { for (StringRef Arch : llvm::split(Arg->getValue(), ",")) Archs.insert(getCanonicalArchString(C, Args, Arch, TC->getTriple())); @@ -4425,8 +4435,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C, // Get the product of all bound architectures and toolchains. SmallVector<std::pair<const ToolChain *, StringRef>> TCAndArchs; for (const ToolChain *TC : ToolChains) - for (StringRef Arch : getOffloadArchs( - C, C.getArgsForToolChain(TC, "generic", Kind), Kind, TC)) + for (StringRef Arch : getOffloadArchs(C, Args, Kind, TC)) TCAndArchs.push_back(std::make_pair(TC, Arch)); for (unsigned I = 0, E = TCAndArchs.size(); I != E; ++I) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits