diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2534,10 +2534,14 @@ PosFlag, NegFlag, BothFlags<[NoArgumentUnused, HelpHidden]>>; def static_openmp: Flag<["-"], "static-openmp">, HelpText<"Use the static host OpenMP runtime while linking.">; +def offload_new_driver : Flag<["--"], "offload-new-driver">, Flags<[CC1Option]>, Group, + HelpText<"Use the new driver for offloading compilation.">; +def no_offload_new_driver : Flag<["--"], "no-offload-new-driver">, Flags<[CC1Option]>, Group, + HelpText<"Don't Use the new driver for offloading compilation.">; def fopenmp_new_driver : Flag<["-"], "fopenmp-new-driver">, Flags<[CC1Option]>, Group, HelpText<"Use the new driver for OpenMP offloading.">; def fno_openmp_new_driver : Flag<["-"], "fno-openmp-new-driver">, Flags<[CC1Option]>, Group, - HelpText<"Don't use the new driver for OpenMP offloading.">; + Alias, HelpText<"Don't use the new driver for OpenMP offloading.">; def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group, Flags<[CC1Option]>, HelpText<"Disable tail call optimization, keeping the call stack accurate">, MarshallingInfoFlag>; 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 @@ -3976,17 +3976,19 @@ // Builder to be used to build offloading actions. OffloadingActionBuilder OffloadBuilder(C, Args, Inputs); + bool UseNewOffloadingDriver = + (C.isOffloadingHostKind(Action::OFK_OpenMP) && + Args.hasFlag(options::OPT_fopenmp_new_driver, + options::OPT_no_offload_new_driver, true)) || + Args.hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false); + // Construct the actions to perform. HeaderModulePrecompileJobAction *HeaderModuleAction = nullptr; ExtractAPIJobAction *ExtractAPIAction = nullptr; ActionList LinkerInputs; ActionList MergerInputs; - bool UseNewOffloadingDriver = - C.isOffloadingHostKind(Action::OFK_OpenMP) && - Args.hasFlag(options::OPT_fopenmp_new_driver, - options::OPT_fno_openmp_new_driver, true); - for (auto &I : Inputs) { types::ID InputType = I.first; const Arg *InputArg = I.second; @@ -4114,8 +4116,7 @@ // Check if this Linker Job should emit a static library. if (ShouldEmitStaticLibrary(Args)) { LA = C.MakeAction(LinkerInputs, types::TY_Image); - } else if (UseNewOffloadingDriver && - C.getActiveOffloadKinds() != Action::OFK_None) { + } else if (UseNewOffloadingDriver) { LA = C.MakeAction(LinkerInputs, types::TY_Image); LA->propagateHostOffloadInfo(C.getActiveOffloadKinds(), /*BoundArch=*/nullptr); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4389,8 +4389,11 @@ bool IsDeviceOffloadAction = !(JA.isDeviceOffloading(Action::OFK_None) || JA.isDeviceOffloading(Action::OFK_Host)); bool IsHostOffloadingAction = - JA.isHostOffloading(Action::OFK_OpenMP) && - !Args.hasArg(options::OPT_fno_openmp_new_driver); + (JA.isHostOffloading(Action::OFK_OpenMP) && + Args.hasFlag(options::OPT_fopenmp_new_driver, + options::OPT_no_offload_new_driver, true)) || + Args.hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false); bool IsUsingLTO = D.isUsingLTO(IsDeviceOffloadAction); auto LTOMode = D.getLTOMode(IsDeviceOffloadAction); @@ -4686,7 +4689,9 @@ // Only AMDGPU supports device-side LTO. if (IsDeviceOffloadAction && !Args.hasFlag(options::OPT_fopenmp_new_driver, - options::OPT_fno_openmp_new_driver, true) && + options::OPT_no_offload_new_driver, true) && + !Args.hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false) && !Triple.isAMDGPU()) { D.Diag(diag::err_drv_unsupported_opt_for_target) << Args.getLastArg(options::OPT_foffload_lto,