[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
ChuanqiXu9 wrote: > Do I miss something? The performance and file size is similar with and > without `-fgen-reduced-bmi`. To reproduce clone > https://github.com/koplas/clang-modules-test and run `build.sh` and > `build_thin_bmi.sh`. Currently, the Reduced BMI will only remove function bodies for non-inline functions and definitions for some variables... And declarations in headers or GMF are primarily inline, so probably the current Reduced BMI won't produce a strong impact on modules whose contents are primarily in GMF as expectedly. For example, I can observe some impact on https://github.com/alibaba/async_simple/tree/CXX20Modules, where the repo has more use codes in the module purview instead of the GMF. Further, in my mind, we can reduce more things in Reduced BMI. An example may be https://github.com/llvm/llvm-project/pull/76930. Thanks for testing : ) https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
ChuanqiXu9 wrote: > Using `-fgen-reduced-bmi` currently fails for me with a case that looks like > this: > > ```c++ > // a.hpp > template > void ignore(T const &) noexcept {} > > inline void resultCheck(char const *message) { > ignore(message); > } > > // b.cppm > module; > #include "a.hpp" > export module b; > > export { > using ignore; > using resultCheck; > } > > // c.cppm > export module c; > import b; > > export void test() { > resultCheck(nullptr); > } > ``` > > This will result in this linker error: `undefined reference to void > ignore(char const* const&)`. Removing `-fgen-reduced-bmi` will > result in linking without errors. Do I need to pass certain flags to CMake? This may be fixed in trunk. This should be a bug in Reduced BMI. Note that the current patch is only the driver part of Reduced BMI. And this is the reason why we need a new flag. Otherwise I'll propose to enable it by default : ) https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
ChuanqiXu9 wrote: @iains @dwblaikie Understood. And I thought the major problem is that there are a lot flags from clang modules. And it is indeed confusing. But given we have to introduce new flags in this case, probably we can only try to make it more clear by better documents. https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 93f9fb2c825dba48db64d5f726b54bcbd4766009 527b69efe66961aa7d7febcdda66f042f50adf2b -- clang/test/Driver/module-fgen-reduced-bmi.cppm clang/test/Modules/modules-reduced-bmi.cppm clang/include/clang/CodeGen/CodeGenAction.h clang/include/clang/Frontend/FrontendOptions.h clang/include/clang/Serialization/ASTWriter.h clang/lib/CodeGen/CodeGenAction.cpp clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/Clang.h clang/lib/Frontend/FrontendActions.cpp clang/lib/Frontend/PrecompiledPreamble.cpp clang/lib/Serialization/GeneratePCH.cpp `` View the diff from clang-format here. ``diff diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 626d594f17..16cc7e2ec6 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4042,9 +4042,9 @@ static bool RenderModulesOptions(Compilation , const Driver , // module fragment. CmdArgs.push_back("-fskip-odr-check-in-gmf"); - // Noop if we see '-fmodules-reduced-bmi' with other translation units than module - // units. This is more user friendly to allow end uers to enable this feature - // without asking for help from build systems. + // Noop if we see '-fmodules-reduced-bmi' with other translation units than + // module units. This is more user friendly to allow end uers to enable this + // feature without asking for help from build systems. if (Args.hasArg(options::OPT_modules_reduced_bmi) && (Input.getType() == driver::types::TY_CXXModule || Input.getType() == driver::types::TY_PP_CXXModule)) { `` https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, ChuanqiXu9 wrote: Done by using `-fmodules-reduce-bmi` https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -0,0 +1,53 @@ +// It is annoying to handle different slash direction +// in Windows and Linux. So we disable the test on Windows +// here. +// REQUIRES: !system-windows ChuanqiXu9 wrote: Done https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/85050 >From 5fcccd75d0823ff11a4e385565cad65034d0def7 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 12 Mar 2024 17:26:49 +0800 Subject: [PATCH 1/2] [C++20] [Modules] Introduce -fgen-reduced-bmi --- clang/include/clang/CodeGen/CodeGenAction.h | 2 + clang/include/clang/Driver/Options.td | 6 +++ .../include/clang/Frontend/FrontendOptions.h | 9 +++- clang/include/clang/Serialization/ASTWriter.h | 7 +-- clang/lib/CodeGen/CodeGenAction.cpp | 19 +++ clang/lib/Driver/Driver.cpp | 27 +- clang/lib/Driver/ToolChains/Clang.cpp | 41 -- clang/lib/Driver/ToolChains/Clang.h | 14 + clang/lib/Frontend/FrontendActions.cpp| 7 +++ clang/lib/Frontend/PrecompiledPreamble.cpp| 3 +- clang/lib/Serialization/GeneratePCH.cpp | 23 ++-- .../test/Driver/module-fgen-reduced-bmi.cppm | 53 +++ clang/test/Modules/gen-reduced-bmi.cppm | 36 + 13 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 clang/test/Driver/module-fgen-reduced-bmi.cppm create mode 100644 clang/test/Modules/gen-reduced-bmi.cppm diff --git a/clang/include/clang/CodeGen/CodeGenAction.h b/clang/include/clang/CodeGen/CodeGenAction.h index 7ad2988e589eb2..186dbb43f01ef7 100644 --- a/clang/include/clang/CodeGen/CodeGenAction.h +++ b/clang/include/clang/CodeGen/CodeGenAction.h @@ -57,6 +57,8 @@ class CodeGenAction : public ASTFrontendAction { bool loadLinkModules(CompilerInstance ); protected: + bool BeginSourceFileAction(CompilerInstance ) override; + /// Create a new code generation action. If the optional \p _VMContext /// parameter is supplied, the action uses it without taking ownership, /// otherwise it creates a fresh LLVM context and takes ownership. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b0d90c776b58a9..0eca2a95e3271e 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3017,6 +3017,7 @@ defm prebuilt_implicit_modules : BoolFOption<"prebuilt-implicit-modules", def fmodule_output_EQ : Joined<["-"], "fmodule-output=">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, + MarshallingInfoString>, HelpText<"Save intermediate module file results when compiling a standard C++ module unit.">; def fmodule_output : Flag<["-"], "fmodule-output">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, @@ -3030,6 +3031,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, + HelpText<"Generate the reduced BMI">, + MarshallingInfoFlag>; + def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group, Visibility<[ClangOption, CC1Option]>, MetaVarName<"">, HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 8085dbcbf671a6..ddfd4f30d1b773 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -387,6 +387,10 @@ class FrontendOptions { LLVM_PREFERRED_TYPE(bool) unsigned ModulesShareFileManager : 1; + /// Whether to generate reduced BMI for C++20 named modules. + LLVM_PREFERRED_TYPE(bool) + unsigned GenReducedBMI : 1; + CodeCompleteOptions CodeCompleteOpts; /// Specifies the output format of the AST. @@ -553,6 +557,9 @@ class FrontendOptions { /// Path which stores the output files for -ftime-trace std::string TimeTracePath; + /// Output Path for module output file. + std::string ModuleOutputPath; + public: FrontendOptions() : DisableFree(false), RelocatablePCH(false), ShowHelp(false), @@ -565,7 +572,7 @@ class FrontendOptions { BuildingImplicitModuleUsesLock(true), ModulesEmbedAllFiles(false), IncludeTimestamps(true), UseTemporary(true), AllowPCMWithCompilerErrors(false), ModulesShareFileManager(true), -TimeTraceGranularity(500) {} +GenReducedBMI(false), TimeTraceGranularity(500) {} /// getInputKindForExtension - Return the appropriate input kind for a file /// extension. For example, "c" would return Language::C. diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 3ed9803fa3745b..bd310b6c7a5cdd 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -846,7 +846,7 @@ class ASTWriter : public ASTDeserializationListener, /// AST and semantic-analysis consumer that generates a /// precompiled header from the
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
dwblaikie wrote: +1 to @iains's comments about being careful about the introduction and naming of driver flags & probably avoid it in this case, if possible, or try to make it clearly experimental. https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/iains edited https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, iains wrote: If this is going to be a user-facing flag (even for a few releases) then I think it should be spelled in a way that make it modules-relatated (e.g. -fmodules-reduce-bmi, or -fmodules-minimise-bmi), as you know I'm not a fan of increasing the already huge number of modules-related user-facing options... (but I'll comment on that separately) https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/iains commented: I have no issue with the general intention or phasing here; my main concern is that we are introducing [yet] another user-facing modules option that actually we intend will become irrelevant after a few releases. In practice, removing user-facing options is not very easy. So: 1. Perhaps we could have only the cc1 option and you could introduce some temporary handling in the driver to recognise it and amend the --precompile behaviour? 2. Maybe the project could introduce something like -fexperimental-- with a clear statement that fexperimental flags cannot be relied on to be stable (or even present) in any future release)? https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -0,0 +1,53 @@ +// It is annoying to handle different slash direction +// in Windows and Linux. So we disable the test on Windows +// here. +// REQUIRES: !system-windows MaskRay wrote: UNSUPPORTED is much more common https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -0,0 +1,53 @@ +// It is annoying to handle different slash direction +// in Windows and Linux. So we disable the test on Windows +// here. +// REQUIRES: !system-windows +// On AIX, the default output for `-c` may be `.s` instead of `.o`, +// which makes the test fail. So disable the test on AIX. +// REQUIRES: !system-aix +// +// RUN: rm -rf %t MaskRay wrote: redundant `mkdir` `// RUN: rm -rf %t && split-file %s %t && cd %t` If Windows backslashes feel annoying, you can add a `cd %t` https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
@@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, MaskRay wrote: should be f_Group https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
koplas wrote: Do I miss something? The performance and file size is similar with and without `-fgen-reduced-bmi`. To reproduce clone https://github.com/koplas/clang-modules-test and run `build.sh` and `build_thin_bmi.sh`. https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
koplas wrote: Using `-fgen-reduced-bmi` currently fails for me with a case that looks like this: ```C++ // a.hpp template void ignore(T const &) noexcept {} inline void resultCheck(char const *message) { ignore(message); } // b.cppm module; #include "a.hpp" export module b; export { using ignore; using resultCheck; } // c.cppm export module c; import b; export void test() { resultCheck(nullptr); } ``` This will result in this linker error: `undefined reference to void ignore(char const* const&)`. Removing `-fgen-reduced-bmi` will result in linking without errors. Do I need to pass certain flags to CMake? https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/ChuanqiXu9 ready_for_review https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/85050 >From e5114cdc6a77711dda6a13cbee9cd5cc42be48c6 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 12 Mar 2024 17:26:49 +0800 Subject: [PATCH] [C++20] [Modules] Introduce -fgen-reduced-bmi --- clang/include/clang/CodeGen/CodeGenAction.h | 2 + clang/include/clang/Driver/Options.td | 6 +++ .../include/clang/Frontend/FrontendOptions.h | 9 +++- clang/include/clang/Serialization/ASTWriter.h | 7 +-- clang/lib/CodeGen/CodeGenAction.cpp | 19 +++ clang/lib/Driver/Driver.cpp | 27 +- clang/lib/Driver/ToolChains/Clang.cpp | 41 -- clang/lib/Driver/ToolChains/Clang.h | 14 + clang/lib/Frontend/FrontendActions.cpp| 7 +++ clang/lib/Frontend/PrecompiledPreamble.cpp| 3 +- clang/lib/Serialization/GeneratePCH.cpp | 23 ++-- .../test/Driver/module-fgen-reduced-bmi.cppm | 53 +++ clang/test/Modules/gen-reduced-bmi.cppm | 36 + 13 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 clang/test/Driver/module-fgen-reduced-bmi.cppm create mode 100644 clang/test/Modules/gen-reduced-bmi.cppm diff --git a/clang/include/clang/CodeGen/CodeGenAction.h b/clang/include/clang/CodeGen/CodeGenAction.h index 7ad2988e589eb2..186dbb43f01ef7 100644 --- a/clang/include/clang/CodeGen/CodeGenAction.h +++ b/clang/include/clang/CodeGen/CodeGenAction.h @@ -57,6 +57,8 @@ class CodeGenAction : public ASTFrontendAction { bool loadLinkModules(CompilerInstance ); protected: + bool BeginSourceFileAction(CompilerInstance ) override; + /// Create a new code generation action. If the optional \p _VMContext /// parameter is supplied, the action uses it without taking ownership, /// otherwise it creates a fresh LLVM context and takes ownership. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index aca8c9b0d5487a..b8ceeff9362df9 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3018,6 +3018,7 @@ defm prebuilt_implicit_modules : BoolFOption<"prebuilt-implicit-modules", def fmodule_output_EQ : Joined<["-"], "fmodule-output=">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, + MarshallingInfoString>, HelpText<"Save intermediate module file results when compiling a standard C++ module unit.">; def fmodule_output : Flag<["-"], "fmodule-output">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, @@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, + HelpText<"Generate the reduced BMI">, + MarshallingInfoFlag>; + def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group, Visibility<[ClangOption, CC1Option]>, MetaVarName<"">, HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 8085dbcbf671a6..ddfd4f30d1b773 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -387,6 +387,10 @@ class FrontendOptions { LLVM_PREFERRED_TYPE(bool) unsigned ModulesShareFileManager : 1; + /// Whether to generate reduced BMI for C++20 named modules. + LLVM_PREFERRED_TYPE(bool) + unsigned GenReducedBMI : 1; + CodeCompleteOptions CodeCompleteOpts; /// Specifies the output format of the AST. @@ -553,6 +557,9 @@ class FrontendOptions { /// Path which stores the output files for -ftime-trace std::string TimeTracePath; + /// Output Path for module output file. + std::string ModuleOutputPath; + public: FrontendOptions() : DisableFree(false), RelocatablePCH(false), ShowHelp(false), @@ -565,7 +572,7 @@ class FrontendOptions { BuildingImplicitModuleUsesLock(true), ModulesEmbedAllFiles(false), IncludeTimestamps(true), UseTemporary(true), AllowPCMWithCompilerErrors(false), ModulesShareFileManager(true), -TimeTraceGranularity(500) {} +GenReducedBMI(false), TimeTraceGranularity(500) {} /// getInputKindForExtension - Return the appropriate input kind for a file /// extension. For example, "c" would return Language::C. diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 3ed9803fa3745b..bd310b6c7a5cdd 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -846,7 +846,7 @@ class ASTWriter : public ASTDeserializationListener, /// AST and semantic-analysis consumer that generates a /// precompiled header from the
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/ChuanqiXu9 converted_to_draft https://github.com/llvm/llvm-project/pull/85050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
llvmbot wrote: @llvm/pr-subscribers-clang-codegen @llvm/pr-subscribers-clang-driver Author: Chuanqi Xu (ChuanqiXu9) Changes This is the driver part of https://github.com/llvm/llvm-project/pull/75894. This patch introduces '-fgen-reduced-bmi' to enable generating the reduced BMI. This patch did: - When `-fgen-reduced-bmi` is specified but `--precompile` is not specified for a module unit, we'll skip the precompile phase to avoid unnecessary two-phase compilation phases. Then if `-c` is specified, we will generate the reduced BMI in CodeGenAction as a by-product. - When `-fgen-reduced-bmi` is specified and `--precompile` is specified, we will generate the reduced BMI in GenerateModuleInterfaceAction as a by-product. - When `-fgen-reduced-bmi` is specified for a non-module unit. We don't do anything nor try to give a warn. This is more user friendly so that the end users can try to test and experiment with the feature without asking help from the build systems. The core design idea is that users should be able to enable this easily with the existing cmake mechanisms. The future plan for the flag is: - Add this to clang19 and make it opt-in for 1~2 releases. It depends on the testing feedback to decide how long we like to make it opt-in. - Then we can announce the existing BMI generating may be deprecated and suggesting people (end users or build systems) to enable this for 1~2 releases. - Finally we will enable this by default. When that time comes, the term `BMI` will refer to the reduced BMI today and the existing BMI will only be meaningful to build systems which loves to support two phase compilations. I'll send release notes and document in seperate commits after this get landed. --- Patch is 20.38 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/85050.diff 13 Files Affected: - (modified) clang/include/clang/CodeGen/CodeGenAction.h (+2) - (modified) clang/include/clang/Driver/Options.td (+6) - (modified) clang/include/clang/Frontend/FrontendOptions.h (+8-1) - (modified) clang/include/clang/Serialization/ASTWriter.h (+4-3) - (modified) clang/lib/CodeGen/CodeGenAction.cpp (+19) - (modified) clang/lib/Driver/Driver.cpp (+13-14) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+38-3) - (modified) clang/lib/Driver/ToolChains/Clang.h (+14) - (modified) clang/lib/Frontend/FrontendActions.cpp (+7) - (modified) clang/lib/Frontend/PrecompiledPreamble.cpp (+1-2) - (modified) clang/lib/Serialization/GeneratePCH.cpp (+19-4) - (added) clang/test/Driver/module-fgen-reduced-bmi.cppm (+53) - (added) clang/test/Modules/gen-reduced-bmi.cppm (+36) ``diff diff --git a/clang/include/clang/CodeGen/CodeGenAction.h b/clang/include/clang/CodeGen/CodeGenAction.h index 7ad2988e589eb2..186dbb43f01ef7 100644 --- a/clang/include/clang/CodeGen/CodeGenAction.h +++ b/clang/include/clang/CodeGen/CodeGenAction.h @@ -57,6 +57,8 @@ class CodeGenAction : public ASTFrontendAction { bool loadLinkModules(CompilerInstance ); protected: + bool BeginSourceFileAction(CompilerInstance ) override; + /// Create a new code generation action. If the optional \p _VMContext /// parameter is supplied, the action uses it without taking ownership, /// otherwise it creates a fresh LLVM context and takes ownership. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index aca8c9b0d5487a..b8ceeff9362df9 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3018,6 +3018,7 @@ defm prebuilt_implicit_modules : BoolFOption<"prebuilt-implicit-modules", def fmodule_output_EQ : Joined<["-"], "fmodule-output=">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, + MarshallingInfoString>, HelpText<"Save intermediate module file results when compiling a standard C++ module unit.">; def fmodule_output : Flag<["-"], "fmodule-output">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, @@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, + HelpText<"Generate the reduced BMI">, + MarshallingInfoFlag>; + def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group, Visibility<[ClangOption, CC1Option]>, MetaVarName<"">, HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 8085dbcbf671a6..ddfd4f30d1b773 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -387,6 +387,10 @@ class FrontendOptions { LLVM_PREFERRED_TYPE(bool) unsigned ModulesShareFileManager : 1; +
[clang] [C++20] [Modules] Introduce -fgen-reduced-bmi (PR #85050)
https://github.com/ChuanqiXu9 created https://github.com/llvm/llvm-project/pull/85050 This is the driver part of https://github.com/llvm/llvm-project/pull/75894. This patch introduces '-fgen-reduced-bmi' to enable generating the reduced BMI. This patch did: - When `-fgen-reduced-bmi` is specified but `--precompile` is not specified for a module unit, we'll skip the precompile phase to avoid unnecessary two-phase compilation phases. Then if `-c` is specified, we will generate the reduced BMI in CodeGenAction as a by-product. - When `-fgen-reduced-bmi` is specified and `--precompile` is specified, we will generate the reduced BMI in GenerateModuleInterfaceAction as a by-product. - When `-fgen-reduced-bmi` is specified for a non-module unit. We don't do anything nor try to give a warn. This is more user friendly so that the end users can try to test and experiment with the feature without asking help from the build systems. The core design idea is that users should be able to enable this easily with the existing cmake mechanisms. The future plan for the flag is: - Add this to clang19 and make it opt-in for 1~2 releases. It depends on the testing feedback to decide how long we like to make it opt-in. - Then we can announce the existing BMI generating may be deprecated and suggesting people (end users or build systems) to enable this for 1~2 releases. - Finally we will enable this by default. When that time comes, the term `BMI` will refer to the reduced BMI today and the existing BMI will only be meaningful to build systems which loves to support two phase compilations. I'll send release notes and document in seperate commits after this get landed. >From 77c66427c279689256f007cc5706b5f74e47f9e6 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 12 Mar 2024 17:26:49 +0800 Subject: [PATCH] [C++20] [Modules] Introduce -fgen-reduced-bmi --- clang/include/clang/CodeGen/CodeGenAction.h | 2 + clang/include/clang/Driver/Options.td | 6 +++ .../include/clang/Frontend/FrontendOptions.h | 9 +++- clang/include/clang/Serialization/ASTWriter.h | 7 +-- clang/lib/CodeGen/CodeGenAction.cpp | 19 +++ clang/lib/Driver/Driver.cpp | 27 +- clang/lib/Driver/ToolChains/Clang.cpp | 41 -- clang/lib/Driver/ToolChains/Clang.h | 14 + clang/lib/Frontend/FrontendActions.cpp| 7 +++ clang/lib/Frontend/PrecompiledPreamble.cpp| 3 +- clang/lib/Serialization/GeneratePCH.cpp | 23 ++-- .../test/Driver/module-fgen-reduced-bmi.cppm | 53 +++ clang/test/Modules/gen-reduced-bmi.cppm | 36 + 13 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 clang/test/Driver/module-fgen-reduced-bmi.cppm create mode 100644 clang/test/Modules/gen-reduced-bmi.cppm diff --git a/clang/include/clang/CodeGen/CodeGenAction.h b/clang/include/clang/CodeGen/CodeGenAction.h index 7ad2988e589eb2..186dbb43f01ef7 100644 --- a/clang/include/clang/CodeGen/CodeGenAction.h +++ b/clang/include/clang/CodeGen/CodeGenAction.h @@ -57,6 +57,8 @@ class CodeGenAction : public ASTFrontendAction { bool loadLinkModules(CompilerInstance ); protected: + bool BeginSourceFileAction(CompilerInstance ) override; + /// Create a new code generation action. If the optional \p _VMContext /// parameter is supplied, the action uses it without taking ownership, /// otherwise it creates a fresh LLVM context and takes ownership. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index aca8c9b0d5487a..b8ceeff9362df9 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3018,6 +3018,7 @@ defm prebuilt_implicit_modules : BoolFOption<"prebuilt-implicit-modules", def fmodule_output_EQ : Joined<["-"], "fmodule-output=">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, + MarshallingInfoString>, HelpText<"Save intermediate module file results when compiling a standard C++ module unit.">; def fmodule_output : Flag<["-"], "fmodule-output">, Flags<[NoXarchOption]>, Visibility<[ClangOption, CC1Option]>, @@ -3031,6 +3032,11 @@ defm skip_odr_check_in_gmf : BoolOption<"f", "skip-odr-check-in-gmf", "Perform ODR checks for decls in the global module fragment.">>, Group; +def gen_reduced_bmi : Flag<["-"], "fgen-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, + HelpText<"Generate the reduced BMI">, + MarshallingInfoFlag>; + def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group, Visibility<[ClangOption, CC1Option]>, MetaVarName<"">, HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">, diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 8085dbcbf671a6..ddfd4f30d1b773 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++