https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/146594
>From 8db1344221d36408663b684cd5217a112bbe26fe Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Mon, 3 Feb 2025 12:46:27 -0600 Subject: [PATCH 1/2] [Clang] Introduce '--offload-targets' for `-fopenmp-targets` Summary: This patch is mostly an NFC that renames the existing `-fopenmp-targets` into `--offload-targets`. Doing this early to simplify a follow-up patch that will hopefully allow this syntax to be used more generically over the existing `--offload` syntax (which I think is mostly unmaintained now.). Following in the well-trodden path of trying to pull language specific offload options into generic ones, but right now this is still just OpenMP specific. --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 ++ clang/include/clang/Driver/Options.td | 6 +++++- clang/lib/Driver/Driver.cpp | 8 ++++---- clang/lib/Driver/ToolChain.cpp | 2 +- clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +- clang/lib/Frontend/CompilerInvocation.cpp | 6 +++--- clang/test/CodeGen/ibm128-unsupported.c | 2 +- clang/test/Driver/amdgpu-openmp-sanitize-options.c | 4 ++-- clang/test/Driver/hip-options.hip | 2 +- flang/lib/Frontend/CompilerInvocation.cpp | 2 +- flang/test/Driver/omp-driver-offload.f90 | 6 +++--- 11 files changed, 24 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 34b6c0d7a8acd..759ba0419bd45 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -116,6 +116,8 @@ def err_drv_cuda_host_arch : Error< "unsupported architecture '%0' for host compilation">; def err_drv_mix_cuda_hip : Error< "mixed CUDA and HIP compilation is not supported">; +def err_drv_mix_offload : Error< + "mixed %0 and %1 offloading compilation is not supported">; def err_drv_bad_target_id : Error< "invalid target ID '%0'; format is a processor name followed by an optional " "colon-delimited list of features followed by an enable/disable sign (e.g., " diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 9911d752966e3..f359df55e0508 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1138,6 +1138,10 @@ def fno_convergent_functions : Flag<["-"], "fno-convergent-functions">, // Common offloading options let Group = offload_Group in { +def offload_targets_EQ : Joined<["--"], "offload-targets=">, + Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, + HelpText<"Specify a list of target architectures to use for offloading.">; + def offload_arch_EQ : Joined<["--"], "offload-arch=">, Visibility<[ClangOption, FlangOption]>, HelpText<"Specify an offloading device architecture for CUDA, HIP, or OpenMP. (e.g. sm_35). " @@ -3678,7 +3682,7 @@ def fopenmp_use_tls : Flag<["-"], "fopenmp-use-tls">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>; def fnoopenmp_use_tls : Flag<["-"], "fnoopenmp-use-tls">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; -def fopenmp_targets_EQ : CommaJoined<["-"], "fopenmp-targets=">, +def fopenmp_targets_EQ : CommaJoined<["-"], "fopenmp-targets=">, Alias<offload_targets_EQ>, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, HelpText<"Specify comma-separated list of triples OpenMP offloading targets to be supported">; def fopenmp_relocatable_target : Flag<["-"], "fopenmp-relocatable-target">, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 775f3f029861c..930a678aa8923 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -991,7 +991,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, /*SpecificToolchain=*/true); } else if (IsHIP && !UseLLVMOffload) { if (auto *OMPTargetArg = - C.getInputArgs().getLastArg(options::OPT_fopenmp_targets_EQ)) { + C.getInputArgs().getLastArg(options::OPT_offload_targets_EQ)) { Diag(clang::diag::err_drv_unsupported_opt_for_language_mode) << OMPTargetArg->getSpelling() << "HIP"; return; @@ -1025,7 +1025,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, ((IsCuda || IsHIP) && UseLLVMOffload) || (C.getInputArgs().hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, options::OPT_fno_openmp, false) && - (C.getInputArgs().hasArg(options::OPT_fopenmp_targets_EQ) || + (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ) || C.getInputArgs().hasArg(options::OPT_offload_arch_EQ))); if (IsOpenMPOffloading) { // We expect that -fopenmp-targets is always used in conjunction with the @@ -1041,7 +1041,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // valid triple. Otherwise, if only --offload-arch= was specified we instead // attempt to derive the appropriate toolchains from the arguments. if (Arg *OpenMPTargets = - C.getInputArgs().getLastArg(options::OPT_fopenmp_targets_EQ)) { + C.getInputArgs().getLastArg(options::OPT_offload_targets_EQ)) { if (OpenMPTargets && !OpenMPTargets->getNumValues()) { Diag(clang::diag::warn_drv_empty_joined_argument) << OpenMPTargets->getAsString(C.getInputArgs()); @@ -1122,7 +1122,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << "native"; } - } else if (C.getInputArgs().hasArg(options::OPT_fopenmp_targets_EQ)) { + } else if (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ)) { Diag(clang::diag::err_drv_expecting_fopenmp_with_fopenmp_targets); return; } diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 571ac53f4571a..3f9b808b2722e 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1731,7 +1731,7 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOpenMPTargetArgs( continue; } if (XOpenMPTargetNoTriple && XOpenMPTargetArg && - Args.getAllArgValues(options::OPT_fopenmp_targets_EQ).size() != 1) { + Args.getAllArgValues(options::OPT_offload_targets_EQ).size() != 1) { getDriver().Diag(diag::err_drv_Xopenmp_target_missing_triple); continue; } diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 070901f037823..bdd77ac84913c 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1404,7 +1404,7 @@ void tools::addOpenMPHostOffloadingArgs(const Compilation &C, // For all the host OpenMP offloading compile jobs we need to pass the targets // information using -fopenmp-targets= option. - constexpr llvm::StringLiteral Targets("-fopenmp-targets="); + constexpr llvm::StringLiteral Targets("--offload-targets="); SmallVector<std::string> Triples; auto TCRange = C.getOffloadToolChains<Action::OFK_OpenMP>(); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index f366e90945dac..c3fa27d9ff6d0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3870,7 +3870,7 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, llvm::interleave( Opts.OMPTargetTriples, OS, [&OS](const llvm::Triple &T) { OS << T.str(); }, ","); - GenerateArg(Consumer, OPT_fopenmp_targets_EQ, Targets); + GenerateArg(Consumer, OPT_offload_targets_EQ, Targets); } if (!Opts.OMPHostIRFile.empty()) @@ -4283,7 +4283,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.OpenMPIRBuilder = Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder); bool IsTargetSpecified = - Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ); + Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_offload_targets_EQ); if (Opts.OpenMP || Opts.OpenMPSimd) { if (int Version = getLastArgIntValue( @@ -4343,7 +4343,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, } // Get the OpenMP target triples if any. - if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) { + if (Arg *A = Args.getLastArg(options::OPT_offload_targets_EQ)) { enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit }; auto getArchPtrSize = [](const llvm::Triple &T) { if (T.isArch16Bit()) diff --git a/clang/test/CodeGen/ibm128-unsupported.c b/clang/test/CodeGen/ibm128-unsupported.c index f4f0a16003e9e..5b4aaed7c5d7e 100644 --- a/clang/test/CodeGen/ibm128-unsupported.c +++ b/clang/test/CodeGen/ibm128-unsupported.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -triple powerpc64le -emit-llvm-bc -fopenmp %s \ -// RUN: -fopenmp-targets=powerpc64le,x86_64 -o %t-ppc-host.bc +// RUN: -fopenmp-targets=powerpc64le -o %t-ppc-host.bc // RUN: %clang_cc1 -verify -triple x86_64 -aux-triple powerpc64le -fopenmp \ // RUN: -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc %s \ // RUN: -fsyntax-only diff --git a/clang/test/Driver/amdgpu-openmp-sanitize-options.c b/clang/test/Driver/amdgpu-openmp-sanitize-options.c index f6a8a7dc57ccc..985eca1692802 100644 --- a/clang/test/Driver/amdgpu-openmp-sanitize-options.c +++ b/clang/test/Driver/amdgpu-openmp-sanitize-options.c @@ -54,11 +54,11 @@ // NOXNACK: warning: ignoring '-fsanitize=address' option for offload arch 'gfx908' as it is not currently supported there. Use it with an offload arch containing 'xnack+' instead // XNACKNEG: warning: ignoring '-fsanitize=address' option for offload arch 'gfx908:xnack-' as it is not currently supported there. Use it with an offload arch containing 'xnack+' instead -// HOSTSAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "x86_64-unknown-linux-gnu".* "-fopenmp".* "-fsanitize=address".* "-fopenmp-targets=amdgcn-amd-amdhsa".* "-x" "c".*}} +// HOSTSAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "x86_64-unknown-linux-gnu".* "-fopenmp".* "-fsanitize=address".* "--offload-targets=amdgcn-amd-amdhsa".* "-x" "c".*}} // GPUSAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "amdgcn-amd-amdhsa" "-aux-triple" "x86_64-unknown-linux-gnu".* "-emit-llvm-bc".* "-mlink-bitcode-file" "[^"]*asanrtl.bc".* "-mlink-bitcode-file" "[^"]*ockl.bc".* "-target-cpu" "(gfx908|gfx900)".* "-fopenmp".* "-fsanitize=address".* "-x" "c".*}} // NOGPUSAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "amdgcn-amd-amdhsa" "-aux-triple" "x86_64-unknown-linux-gnu".* "-emit-llvm-bc".* "-target-cpu" "(gfx908|gfx900)".* "-fopenmp".* "-x" "c".*}} // SAN: {{"[^"]*clang-offload-packager[^"]*" "-o".* "--image=file=.*.bc,triple=amdgcn-amd-amdhsa,arch=gfx908(:xnack\-|:xnack\+)?,kind=openmp(,feature=(\-xnack|\+xnack))?"}} -// SAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "x86_64-unknown-linux-gnu".* "-fopenmp".* "-fsanitize=address".* "-fopenmp-targets=amdgcn-amd-amdhsa".* "-x" "ir".*}} +// SAN: {{"[^"]*clang[^"]*" "-cc1" "-triple" "x86_64-unknown-linux-gnu".* "-fopenmp".* "-fsanitize=address".* "--offload-targets=amdgcn-amd-amdhsa".* "-x" "ir".*}} // SAN: {{"[^"]*clang-linker-wrapper[^"]*".* "--host-triple=x86_64-unknown-linux-gnu".* "--linker-path=[^"]*".* "--whole-archive" "[^"]*(libclang_rt.asan_static.a|libclang_rt.asan_static-x86_64.a)".* "--whole-archive" "[^"]*(libclang_rt.asan.a|libclang_rt.asan-x86_64.a)".*}} diff --git a/clang/test/Driver/hip-options.hip b/clang/test/Driver/hip-options.hip index a07dca3638565..4fb5571b838fb 100644 --- a/clang/test/Driver/hip-options.hip +++ b/clang/test/Driver/hip-options.hip @@ -118,7 +118,7 @@ // RUN: not %clang --target=x86_64-unknown-linux-gnu -nogpuinc -nogpulib \ // RUN: --offload-arch=gfx906 -fopenmp=libomp -fopenmp-targets=amdgcn %s 2>&1 \ // RUN: | FileCheck -check-prefix=OMPTGT %s -// OMPTGT: unsupported option '-fopenmp-targets=' for language mode 'HIP' +// OMPTGT: unsupported option '--offload-targets=' for language mode 'HIP' // Check -Xoffload-linker option is passed to lld. diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 30d81f3daa969..8e4c210306cb2 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1248,7 +1248,7 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, // Get the OpenMP target triples if any. if (auto *arg = - args.getLastArg(clang::driver::options::OPT_fopenmp_targets_EQ)) { + args.getLastArg(clang::driver::options::OPT_offload_targets_EQ)) { enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit }; auto getArchPtrSize = [](const llvm::Triple &triple) { if (triple.isArch16Bit()) diff --git a/flang/test/Driver/omp-driver-offload.f90 b/flang/test/Driver/omp-driver-offload.f90 index 335bfad4b1884..f4f0c21dc1f5e 100644 --- a/flang/test/Driver/omp-driver-offload.f90 +++ b/flang/test/Driver/omp-driver-offload.f90 @@ -225,8 +225,8 @@ ! RUN: | FileCheck %s --check-prefix=OFFLOAD-TARGETS ! OFFLOAD-TARGETS: "{{[^"]*}}flang" "-fc1" "-triple" "x86_64-unknown-linux-gnu" -! OFFLOAD-TARGETS-SAME: "-fopenmp-targets=amdgcn-amd-amdhsa" +! OFFLOAD-TARGETS-SAME: "--offload-targets=amdgcn-amd-amdhsa" ! OFFLOAD-TARGETS-NEXT: "{{[^"]*}}flang" "-fc1" "-triple" "amdgcn-amd-amdhsa" -! OFFLOAD-TARGETS-NOT: -fopenmp-targets +! OFFLOAD-TARGETS-NOT: --offload-targets ! OFFLOAD-TARGETS: "{{[^"]*}}flang" "-fc1" "-triple" "x86_64-unknown-linux-gnu" -! OFFLOAD-TARGETS-SAME: "-fopenmp-targets=amdgcn-amd-amdhsa" +! OFFLOAD-TARGETS-SAME: "--offload-targets=amdgcn-amd-amdhsa" >From 325b18cde1f53d2e8aa04dc9cbae1ec46522e816 Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Tue, 1 Jul 2025 23:02:56 -0500 Subject: [PATCH 2/2] Comments --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 -- clang/include/clang/Driver/Options.td | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 759ba0419bd45..34b6c0d7a8acd 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -116,8 +116,6 @@ def err_drv_cuda_host_arch : Error< "unsupported architecture '%0' for host compilation">; def err_drv_mix_cuda_hip : Error< "mixed CUDA and HIP compilation is not supported">; -def err_drv_mix_offload : Error< - "mixed %0 and %1 offloading compilation is not supported">; def err_drv_bad_target_id : Error< "invalid target ID '%0'; format is a processor name followed by an optional " "colon-delimited list of features followed by an enable/disable sign (e.g., " diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index f359df55e0508..1ba973cf2620c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1142,7 +1142,7 @@ def offload_targets_EQ : Joined<["--"], "offload-targets=">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, HelpText<"Specify a list of target architectures to use for offloading.">; -def offload_arch_EQ : Joined<["--"], "offload-arch=">, +def offload_arch_EQ : CommaJoined<["--"], "offload-arch=">, Visibility<[ClangOption, FlangOption]>, HelpText<"Specify an offloading device architecture for CUDA, HIP, or OpenMP. (e.g. sm_35). " "If 'native' is used the compiler will detect locally installed architectures. " _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits