diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -412,6 +412,10 @@ /// current compilation. Also, update the host tool chain kind accordingly. void CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs); + /// GetTargetInfoFromMArch - extract sub-architecture from -march flag used + /// with -fopenmp-targets and -Xopenmp-target options. + bool GetTargetInfoFromMArch(Compilation &C, llvm::StringMap> &DerivedArchs); + /// BuildCompilation - Construct a compilation object for a command /// line argument vector. /// diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -722,6 +722,37 @@ return RT; } +bool Driver::GetTargetInfoFromMArch(Compilation &C, llvm::StringMap> &DerivedArchs) { + StringRef OpenMPTargetArch; + for (Arg *A : C.getInputArgs()) { + if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) { + StringRef OpenMPTargetTriple = StringRef(A->getValue(0)); + llvm::Triple TargetTriple(OpenMPTargetTriple); + + for (auto *V : A->getValues()) { + StringRef VStr = StringRef(V); + if (VStr.startswith("-march=") || VStr.startswith("--march=")) { + OpenMPTargetArch = VStr.split('=').second; + CudaArch Arch = StringToCudaArch(StringRef(OpenMPTargetArch)); + if (Arch == CudaArch::UNKNOWN) { + C.getDriver().Diag(clang::diag::err_drv_cuda_bad_gpu_arch) + << OpenMPTargetArch; + C.setContainsError(); + return false; + } + + if (!OpenMPTargetTriple.empty() && !OpenMPTargetArch.empty()) { + DerivedArchs[OpenMPTargetTriple].insert(OpenMPTargetArch); + } + } + A->claim(); + } + } + } + + return true; +} + void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) { @@ -812,6 +843,10 @@ << OpenMPTargets->getAsString(C.getInputArgs()); return; } + // Process legacy option -fopenmp-targets -Xopenmp-target and -march + auto status = GetTargetInfoFromMArch(C, DerivedArchs); + if (!status) + return; llvm::copy(OpenMPTargets->getValues(), std::back_inserter(OpenMPTriples)); } else if (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) && !IsHIP && !IsCuda) {