llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Naveen Seth Hanig (naveen-seth) <details> <summary>Changes</summary> This patch is part of a series to support driver-managed module builds for C++ named modules and Clang modules. Commit 9403c2d introduced the entry point for the driver-managed module build logic and assumed that it would live in the BuildActions phase of the driver. That proved unnecessary: the logic can be fully implemented in the BuildJobs phase. This reverts changes to BuildActions in preparation for the upcoming patches. --- Full diff: https://github.com/llvm/llvm-project/pull/155450.diff 2 Files Affected: - (modified) clang/include/clang/Driver/Driver.h (-25) - (modified) clang/lib/Driver/Driver.cpp (+47-60) ``````````diff diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index b9b187ada8add..ec574f5796117 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -512,9 +512,6 @@ class Driver { /// BuildActions - Construct the list of actions to perform for the /// given arguments, which are only done for a single architecture. - /// If the compilation is an explicit module build, delegates to - /// BuildDriverManagedModuleBuildActions. Otherwise, BuildDefaultActions is - /// used. /// /// \param C - The compilation that is being built. /// \param Args - The input arguments. @@ -799,27 +796,6 @@ class Driver { /// compilation based on which -f(no-)?lto(=.*)? option occurs last. void setLTOMode(const llvm::opt::ArgList &Args); - /// BuildDefaultActions - Constructs the list of actions to perform - /// for the provided arguments, which are only done for a single architecture. - /// - /// \param C - The compilation that is being built. - /// \param Args - The input arguments. - /// \param Actions - The list to store the resulting actions onto. - void BuildDefaultActions(Compilation &C, llvm::opt::DerivedArgList &Args, - const InputList &Inputs, ActionList &Actions) const; - - /// BuildDriverManagedModuleBuildActions - Performs a dependency - /// scan and constructs the list of actions to perform for dependency order - /// and the provided arguments. This is only done for a single a architecture. - /// - /// \param C - The compilation that is being built. - /// \param Args - The input arguments. - /// \param Actions - The list to store the resulting actions onto. - void BuildDriverManagedModuleBuildActions(Compilation &C, - llvm::opt::DerivedArgList &Args, - const InputList &Inputs, - ActionList &Actions) const; - /// Scans the leading lines of the C++ source inputs to detect C++20 module /// usage. /// @@ -827,7 +803,6 @@ class Driver { /// read failure. llvm::ErrorOr<bool> ScanInputsForCXX20ModulesUsage(const InputList &Inputs) const; - /// Retrieves a ToolChain for a particular \p Target triple. /// /// Will cache ToolChains for the life of the driver object, and create them diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 34eaad43d6f79..3c997423010a2 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1473,6 +1473,33 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) { return false; } +static bool hasCXXModuleInputType(const Driver::InputList &Inputs) { + const auto IsTypeCXXModule = [](const auto &Input) -> bool { + const auto TypeID = Input.first; + return (TypeID == types::TY_CXXModule); + }; + return llvm::any_of(Inputs, IsTypeCXXModule); +} + +llvm::ErrorOr<bool> +Driver::ScanInputsForCXX20ModulesUsage(const InputList &Inputs) const { + const auto CXXInputs = llvm::make_filter_range( + Inputs, [](const auto &Input) { return types::isCXX(Input.first); }); + for (const auto &Input : CXXInputs) { + StringRef Filename = Input.second->getSpelling(); + auto ErrOrBuffer = VFS->getBufferForFile(Filename); + if (!ErrOrBuffer) + return ErrOrBuffer.getError(); + const auto Buffer = std::move(*ErrOrBuffer); + + if (scanInputForCXX20ModulesUsage(Buffer->getBuffer())) { + Diags.Report(diag::remark_found_cxx20_module_usage) << Filename; + return true; + } + } + return false; +} + Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { llvm::PrettyStackTraceString CrashInfo("Compilation construction"); @@ -1836,6 +1863,26 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { else BuildActions(*C, C->getArgs(), Inputs, C->getActions()); + if (C->getArgs().hasFlag(options::OPT_fmodules_driver, + options::OPT_fno_modules_driver, false)) { + // TODO: When -fmodules-driver is no longer experimental, it should be + // enabled by default only if both conditions are met: (1) there are two or + // more C++ source inputs; and (2) at least one input uses C++20 named + // modules. + // The detection logic for this is kept here only for diagnostics until + // is enabled by default. + bool UsesCXXModules = hasCXXModuleInputType(Inputs); + if (!UsesCXXModules) { + const auto ErrOrScanResult = ScanInputsForCXX20ModulesUsage(Inputs); + if (!ErrOrScanResult) { + Diags.Report(diag::err_cannot_open_file) + << ErrOrScanResult.getError().message(); + } + UsesCXXModules = *ErrOrScanResult; + } + Diags.Report(diag::remark_performing_driver_managed_module_build); + } + if (CCCPrintPhases) { PrintActions(*C); return C; @@ -4320,33 +4367,6 @@ void Driver::handleArguments(Compilation &C, DerivedArgList &Args, } } -static bool hasCXXModuleInputType(const Driver::InputList &Inputs) { - const auto IsTypeCXXModule = [](const auto &Input) -> bool { - const auto TypeID = Input.first; - return (TypeID == types::TY_CXXModule); - }; - return llvm::any_of(Inputs, IsTypeCXXModule); -} - -llvm::ErrorOr<bool> -Driver::ScanInputsForCXX20ModulesUsage(const InputList &Inputs) const { - const auto CXXInputs = llvm::make_filter_range( - Inputs, [](const auto &Input) { return types::isCXX(Input.first); }); - for (const auto &Input : CXXInputs) { - StringRef Filename = Input.second->getSpelling(); - auto ErrOrBuffer = VFS->getBufferForFile(Filename); - if (!ErrOrBuffer) - return ErrOrBuffer.getError(); - const auto Buffer = std::move(*ErrOrBuffer); - - if (scanInputForCXX20ModulesUsage(Buffer->getBuffer())) { - Diags.Report(diag::remark_found_cxx20_module_usage) << Filename; - return true; - } - } - return false; -} - void Driver::BuildActions(Compilation &C, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const { llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); @@ -4358,33 +4378,6 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, handleArguments(C, Args, Inputs, Actions); - if (Args.hasFlag(options::OPT_fmodules_driver, - options::OPT_fno_modules_driver, false)) { - // TODO: Move the logic for implicitly enabling explicit-module-builds out - // of -fmodules-driver once it is no longer experimental. - // Currently, this serves diagnostic purposes only. - bool UsesCXXModules = hasCXXModuleInputType(Inputs); - if (!UsesCXXModules) { - const auto ErrOrScanResult = ScanInputsForCXX20ModulesUsage(Inputs); - if (!ErrOrScanResult) { - Diags.Report(diag::err_cannot_open_file) - << ErrOrScanResult.getError().message(); - return; - } - UsesCXXModules = *ErrOrScanResult; - } - if (UsesCXXModules || Args.hasArg(options::OPT_fmodules)) - BuildDriverManagedModuleBuildActions(C, Args, Inputs, Actions); - return; - } - - BuildDefaultActions(C, Args, Inputs, Actions); -} - -void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args, - const InputList &Inputs, - ActionList &Actions) const { - bool UseNewOffloadingDriver = C.isOffloadingHostKind(Action::OFK_OpenMP) || C.isOffloadingHostKind(Action::OFK_SYCL) || @@ -4668,12 +4661,6 @@ void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args, Args.ClaimAllArgs(options::OPT_cl_ignored_Group); } -void Driver::BuildDriverManagedModuleBuildActions( - Compilation &C, llvm::opt::DerivedArgList &Args, const InputList &Inputs, - ActionList &Actions) const { - Diags.Report(diag::remark_performing_driver_managed_module_build); -} - /// Returns the canonical name for the offloading architecture when using a HIP /// or CUDA architecture. static StringRef getCanonicalArchString(Compilation &C, `````````` </details> https://github.com/llvm/llvm-project/pull/155450 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits