https://github.com/skatrak updated https://github.com/llvm/llvm-project/pull/100152
>From 3861b28deeb1b558f182f2ab5680b123fd94c005 Mon Sep 17 00:00:00 2001 From: Sergio Afonso <safon...@amd.com> Date: Tue, 23 Jul 2024 16:19:55 +0100 Subject: [PATCH] [Flang][Driver] Introduce -fopenmp-targets offloading option This patch modifies the flang driver to introduce the `-fopenmp-targets` option to the frontend compiler invocations corresponding to the OpenMP host device on offloading-enabled compilations. This option holds the list of offloading triples associated to the compilation and is used by clang to determine whether offloading calls should be generated for the host. --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 12 +----------- clang/lib/Driver/ToolChains/CommonArgs.cpp | 19 +++++++++++++++++++ clang/lib/Driver/ToolChains/CommonArgs.h | 5 +++++ clang/lib/Driver/ToolChains/Flang.cpp | 3 +++ flang/test/Driver/omp-driver-offload.f90 | 18 ++++++++++++++++++ 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c8c56dbb51b28..59c6bb70d75a2 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3532,7 +3532,7 @@ def fopenmp_use_tls : Flag<["-"], "fopenmp-use-tls">, Group<f_Group>, def fnoopenmp_use_tls : Flag<["-"], "fnoopenmp-use-tls">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; def fopenmp_targets_EQ : CommaJoined<["-"], "fopenmp-targets=">, - Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option, FlangOption]>, + 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">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 843d68c85bc59..0f1141ed8bcd9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7789,17 +7789,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_mno_amdgpu_ieee); } - // For all the host OpenMP offloading compile jobs we need to pass the targets - // information using -fopenmp-targets= option. - if (JA.isHostOffloading(Action::OFK_OpenMP)) { - SmallString<128> Targets("-fopenmp-targets="); - - SmallVector<std::string, 4> Triples; - auto TCRange = C.getOffloadToolChains<Action::OFK_OpenMP>(); - std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples), - [](auto TC) { return TC.second->getTripleString(); }); - CmdArgs.push_back(Args.MakeArgString(Targets + llvm::join(Triples, ","))); - } + addOpenMPHostOffloadingArgs(C, JA, Args, CmdArgs); bool VirtualFunctionElimination = Args.hasFlag(options::OPT_fvirtual_function_elimination, diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 1e37d9d348818..487cc8345d7e3 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1244,6 +1244,25 @@ bool tools::addOpenMPRuntime(const Compilation &C, ArgStringList &CmdArgs, return true; } +void tools::addOpenMPHostOffloadingArgs(const Compilation &C, + const JobAction &JA, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) { + if (!JA.isHostOffloading(Action::OFK_OpenMP)) + return; + + // 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="); + + SmallVector<std::string> Triples; + auto TCRange = C.getOffloadToolChains<Action::OFK_OpenMP>(); + std::transform(TCRange.first, TCRange.second, std::back_inserter(Triples), + [](auto TC) { return TC.second->getTripleString(); }); + CmdArgs.push_back( + Args.MakeArgString(Twine(Targets) + llvm::join(Triples, ","))); +} + /// Add Fortran runtime libs void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args, llvm::opt::ArgStringList &CmdArgs) { diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 0d3b4d6b783ba..0c97398dfcfa3 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -119,6 +119,11 @@ bool addOpenMPRuntime(const Compilation &C, llvm::opt::ArgStringList &CmdArgs, bool ForceStaticHostRuntime = false, bool IsOffloadingHost = false, bool GompNeedsRT = false); +/// Adds offloading options for OpenMP host compilation to \p CmdArgs. +void addOpenMPHostOffloadingArgs(const Compilation &C, const JobAction &JA, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + /// Adds Fortran runtime libraries to \p CmdArgs. void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs); diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index f5de5eb23e4be..07e187131777e 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -12,6 +12,7 @@ #include "clang/Basic/CodeGenOptions.h" #include "clang/Driver/Options.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Frontend/Debug/Options.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -495,6 +496,8 @@ void Flang::addOffloadOptions(Compilation &C, const InputInfoList &Inputs, if (Args.hasArg(options::OPT_nogpulib)) CmdArgs.push_back("-nogpulib"); } + + addOpenMPHostOffloadingArgs(C, JA, Args, CmdArgs); } static void addFloatingPointOptions(const Driver &D, const ArgList &Args, diff --git a/flang/test/Driver/omp-driver-offload.f90 b/flang/test/Driver/omp-driver-offload.f90 index f8876c96d76c9..1a622c445de55 100644 --- a/flang/test/Driver/omp-driver-offload.f90 +++ b/flang/test/Driver/omp-driver-offload.f90 @@ -207,3 +207,21 @@ ! RUN: | FileCheck --check-prefix=MLINK-BUILTIN-BITCODE %s ! MLINK-BUILTIN-BITCODE: "{{[^"]*}}flang-new" "-fc1" "-triple" "amdgcn-amd-amdhsa" ! MLINK-BUILTIN-BITCODE-SAME: "-mlink-builtin-bitcode" {{.*Inputs.*rocm.*amdgcn.*bitcode.*}}oclc_isa_version_900.bc + +! Test that the -fopenmp-targets option is added to host compilation invocations +! when --offload-arch or -fopenmp-targets are set. +! RUN: %flang -S -### %s -o %t 2>&1 \ +! RUN: -fopenmp --offload-arch=gfx90a \ +! RUN: --target=x86_64-unknown-linux-gnu \ +! RUN: | FileCheck %s --check-prefix=OFFLOAD-TARGETS +! RUN: %flang -S -### %s -o %t 2>&1 \ +! RUN: -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa --offload-arch=gfx90a \ +! RUN: --target=x86_64-unknown-linux-gnu \ +! RUN: | FileCheck %s --check-prefix=OFFLOAD-TARGETS + +! OFFLOAD-TARGETS: "{{[^"]*}}flang-new" "-fc1" "-triple" "x86_64-unknown-linux-gnu" +! OFFLOAD-TARGETS-SAME: "-fopenmp-targets=amdgcn-amd-amdhsa" +! OFFLOAD-TARGETS-NEXT: "{{[^"]*}}flang-new" "-fc1" "-triple" "amdgcn-amd-amdhsa" +! OFFLOAD-TARGETS-NOT: -fopenmp-targets +! OFFLOAD-TARGETS: "{{[^"]*}}flang-new" "-fc1" "-triple" "x86_64-unknown-linux-gnu" +! OFFLOAD-TARGETS-SAME: "-fopenmp-targets=amdgcn-amd-amdhsa" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits