saiislam created this revision. saiislam added reviewers: jdoerfert, JonChesterfield, jhuber6, yaxunl. Herald added a subscriber: guansong. Herald added a project: All. saiislam requested review of this revision. Herald added subscribers: cfe-commits, sstefan1, MaskRay. Herald added a project: clang.
Subarchitectures for multi-file compilation specified using -fopenmp-targets, -Xopenmp-target, and -march were not getting added to the <Triple, Set(Archs)> map `KnownArchs`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D128090 Files: clang/include/clang/Driver/Driver.h clang/lib/Driver/Driver.cpp Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -722,6 +722,37 @@ return RT; } +bool Driver::GetTargetInfoFromMArch(Compilation &C, llvm::StringMap<llvm::DenseSet<StringRef>> &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) { Index: clang/include/clang/Driver/Driver.h =================================================================== --- clang/include/clang/Driver/Driver.h +++ 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<llvm::DenseSet<StringRef>> &DerivedArchs); + /// BuildCompilation - Construct a compilation object for a command /// line argument vector. ///
Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -722,6 +722,37 @@ return RT; } +bool Driver::GetTargetInfoFromMArch(Compilation &C, llvm::StringMap<llvm::DenseSet<StringRef>> &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) { Index: clang/include/clang/Driver/Driver.h =================================================================== --- clang/include/clang/Driver/Driver.h +++ 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<llvm::DenseSet<StringRef>> &DerivedArchs); + /// BuildCompilation - Construct a compilation object for a command /// line argument vector. ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits