Author: Sergio Afonso Date: 2024-08-01T14:27:29+01:00 New Revision: e1451236a0a07f1ee4ba5fe3ae2464a82a37c25c
URL: https://github.com/llvm/llvm-project/commit/e1451236a0a07f1ee4ba5fe3ae2464a82a37c25c DIFF: https://github.com/llvm/llvm-project/commit/e1451236a0a07f1ee4ba5fe3ae2464a82a37c25c.diff LOG: [Flang][Driver] Introduce -fopenmp-targets offloading option (#100152) 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. Added: Modified: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.h clang/lib/Driver/ToolChains/Flang.cpp flang/test/Driver/omp-driver-offload.f90 Removed: ################################################################################ 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 3d0714286139d..6e9744607d9eb 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..492d5a3021d9b 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -495,6 +495,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..b0b94ab1386a7 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 -nogpulib \ +! 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 -nogpulib \ +! 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