From 8a90969b9b669fa2925cea2b60622c19406243d1 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Thu, 31 Oct 2024 17:27:00 +0800 Subject: [PATCH 1/5] [C++20] [Modules] Convert '-fexperimental-modules-reduced-bmi' to '-fmodules-reduced-bmi' --- clang/docs/ReleaseNotes.rst | 4 ++ clang/docs/StandardCPlusPlusModules.rst | 23 +++++------ .../clang/Basic/DiagnosticDriverKinds.td | 7 ++++ clang/include/clang/Driver/Options.td | 5 ++- clang/lib/Driver/ToolChains/Clang.cpp | 12 +++++- .../test/Driver/module-fgen-reduced-bmi.cppm | 41 ++++++++++++++++++- libcxx/utils/libcxx/test/format.py | 2 + 7 files changed, 77 insertions(+), 17 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 6c40e48e2f49b..9f899b2f7a953 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -412,6 +412,10 @@ Modified Compiler Flags ``memset`` and similar functions for which it is a documented undefined behavior. +- Added ``-fmodules-reduced-bmi`` flags corresponding to + ``-fexperimental-modules-reduced-bmi`` flag and emit warning for not emitting + reduced BMI. + Removed Compiler Flags ------------------------- diff --git a/clang/docs/StandardCPlusPlusModules.rst b/clang/docs/StandardCPlusPlusModules.rst index 8e22adad15106..93edce0cf90b7 100644 --- a/clang/docs/StandardCPlusPlusModules.rst +++ b/clang/docs/StandardCPlusPlusModules.rst @@ -602,16 +602,16 @@ unnecessary dependencies for the BMI. To mitigate the problem, Clang has a compiler option to reduce the information contained in the BMI. These two formats are known as Full BMI and Reduced BMI, respectively. -Users can use the ``-fexperimental-modules-reduced-bmi`` option to produce a +Users can use the ``-fmodules-reduced-bmi`` option to produce a Reduced BMI. For the one-phase compilation model (CMake implements this model), with -``-fexperimental-modules-reduced-bmi``, the generated BMI will be a Reduced +``-fmodules-reduced-bmi``, the generated BMI will be a Reduced BMI automatically. (The output path of the BMI is specified by ``-fmodule-output=`` as usual with the one-phase compilation model). It is also possible to produce a Reduced BMI with the two-phase compilation -model. When ``-fexperimental-modules-reduced-bmi``, ``--precompile``, and +model. When ``-fmodules-reduced-bmi``, ``--precompile``, and ``-fmodule-output=`` are specified, the generated BMI specified by ``-o`` will be a full BMI and the BMI specified by ``-fmodule-output=`` will be a Reduced BMI. The dependency graph in this case would look like: @@ -625,7 +625,7 @@ BMI. The dependency graph in this case would look like: -> ... -> consumer_n.cpp -Clang does not emit diagnostics when ``-fexperimental-modules-reduced-bmi`` is +Clang does not emit diagnostics when ``-fmodules-reduced-bmi`` is used with a non-module unit. This design permits users of the one-phase compilation model to try using reduced BMIs without needing to modify the build system. The two-phase compilation module requires build system support. @@ -691,11 +691,10 @@ ensure it is reachable, e.g. ``using N::g;``. Support for Reduced BMIs is still experimental, but it may become the default in the future. The expected roadmap for Reduced BMIs as of Clang 19.x is: -1. ``-fexperimental-modules-reduced-bmi`` is opt-in for 1~2 releases. The period depends +1. ``-fexperimental-modules-reduced-bmi`` was introduced in v19.x +2. For v20.x, ``-fmodules-reduced-bmi`` is introduced as an equivalent non-experimental + option. It is expected to stay opt-in for 1~2 releases, though the period depends on user feedback and may be extended. -2. Announce that Reduced BMIs are no longer experimental and introduce - ``-fmodules-reduced-bmi`` as a new option, and recommend use of the new - option. This transition is expected to take 1~2 additional releases as well. 3. Finally, ``-fmodules-reduced-bmi`` will be the default. When that time comes, the term BMI will refer to the Reduced BMI and the Full BMI will only be meaningful to build systems which elect to support two-phase compilation. @@ -814,8 +813,8 @@ With reduced BMI, non-cascading changes can be more powerful. For example, .. code-block:: console - $ clang++ -std=c++20 A.cppm -c -fmodule-output=A.pcm -fexperimental-modules-reduced-bmi -o A.o - $ clang++ -std=c++20 B.cppm -c -fmodule-output=B.pcm -fexperimental-modules-reduced-bmi -o B.o -fmodule-file=A=A.pcm + $ clang++ -std=c++20 A.cppm -c -fmodule-output=A.pcm -fmodules-reduced-bmi -o A.o + $ clang++ -std=c++20 B.cppm -c -fmodule-output=B.pcm -fmodules-reduced-bmi -o B.o -fmodule-file=A=A.pcm $ md5sum B.pcm 6c2bd452ca32ab418bf35cd141b060b9 B.pcm @@ -831,8 +830,8 @@ and recompile the example: .. code-block:: console - $ clang++ -std=c++20 A.cppm -c -fmodule-output=A.pcm -fexperimental-modules-reduced-bmi -o A.o - $ clang++ -std=c++20 B.cppm -c -fmodule-output=B.pcm -fexperimental-modules-reduced-bmi -o B.o -fmodule-file=A=A.pcm + $ clang++ -std=c++20 A.cppm -c -fmodule-output=A.pcm -fmodules-reduced-bmi -o A.o + $ clang++ -std=c++20 B.cppm -c -fmodule-output=B.pcm -fmodules-reduced-bmi -o B.o -fmodule-file=A=A.pcm $ md5sum B.pcm 6c2bd452ca32ab418bf35cd141b060b9 B.pcm diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 5155b23d151c0..020ea50b8fac1 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -555,6 +555,13 @@ def err_test_module_file_extension_format : Error< def err_drv_module_output_with_multiple_arch : Error< "option '-fmodule-output' cannot be used with multiple arch options">; +def warn_drv_module_reduced_bmi_not_enabled : Warning< + "reduced BMI is expected to be enabled by default in Clang 21; it can be enabled " + "explicitly by passing '-fmodules-reduced-bmi' (in one-phase compilation models, " + "like CMake) or by disabling the diagnostic and requesting the build system vendor " + "support reduced BMIs (in two-phase compilation models)">, + InGroup>; + def warn_drv_delayed_template_parsing_after_cxx20 : Warning< "-fdelayed-template-parsing is deprecated after C++20">, InGroup>; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 7e3f6aaaa10db..781741d99bd63 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3194,11 +3194,14 @@ 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 modules_reduced_bmi : Flag<["-"], "fexperimental-modules-reduced-bmi">, +def modules_reduced_bmi : Flag<["-"], "fmodules-reduced-bmi">, Group, Visibility<[ClangOption, CC1Option]>, HelpText<"Generate the reduced BMI">, MarshallingInfoFlag>; +def experimental_modules_reduced_bmi : Flag<["-"], "fexperimental-modules-reduced-bmi">, + Group, Visibility<[ClangOption, CC1Option]>, Alias; + def fmodules_embed_all_files : Joined<["-"], "fmodules-embed-all-files">, Visibility<[ClangOption, CC1Option, CLOption]>, HelpText<"Embed the contents of all files read by this compilation into " diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 217c1a845f0a4..1bc2b135a9c79 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4257,7 +4257,7 @@ static bool RenderModulesOptions(Compilation &C, const Driver &D, if (Args.hasArg(options::OPT_modules_reduced_bmi) && (Input.getType() == driver::types::TY_CXXModule || Input.getType() == driver::types::TY_PP_CXXModule)) { - CmdArgs.push_back("-fexperimental-modules-reduced-bmi"); + CmdArgs.push_back("-fmodules-reduced-bmi"); if (Args.hasArg(options::OPT_fmodule_output_EQ)) Args.AddLastArg(CmdArgs, options::OPT_fmodule_output_EQ); @@ -4267,7 +4267,15 @@ static bool RenderModulesOptions(Compilation &C, const Driver &D, getCXX20NamedModuleOutputPath(Args, Input.getBaseInput()))); } - // Noop if we see '-fexperimental-modules-reduced-bmi' with other translation + if ((Input.getType() == driver::types::TY_CXXModule || + Input.getType() == driver::types::TY_PP_CXXModule) && + (Args.hasArg(options::OPT_fmodule_output) || + Args.hasArg(options::OPT_fmodule_output_EQ) || + Args.hasArg(options::OPT__precompile)) && + !Args.hasArg(options::OPT_modules_reduced_bmi)) + D.Diag(diag::warn_drv_module_reduced_bmi_not_enabled); + + // 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. Args.ClaimAllArgs(options::OPT_modules_reduced_bmi); diff --git a/clang/test/Driver/module-fgen-reduced-bmi.cppm b/clang/test/Driver/module-fgen-reduced-bmi.cppm index 1223189fb49b7..b14a68d87b45b 100644 --- a/clang/test/Driver/module-fgen-reduced-bmi.cppm +++ b/clang/test/Driver/module-fgen-reduced-bmi.cppm @@ -29,13 +29,47 @@ // // RUN: %clang -std=c++20 Hello.cc -fexperimental-modules-reduced-bmi -Wall -Werror \ // RUN: -c -o Hello.o -### 2>&1 | FileCheck Hello.cc +// +// RUN: %clang -std=c++20 Hello.cppm -fmodule-output=Hello.pcm \ +// RUN: -fmodules-reduced-bmi -c -o Hello.o -### 2>&1 | FileCheck Hello.cppm +// +// RUN: %clang -std=c++20 Hello.cppm \ +// RUN: -fmodules-reduced-bmi -c -o Hello.o -### 2>&1 | \ +// RUN: FileCheck Hello.cppm --check-prefix=CHECK-UNSPECIFIED +// +// RUN: %clang -std=c++20 Hello.cppm \ +// RUN: -fmodules-reduced-bmi -c -### 2>&1 | \ +// RUN: FileCheck Hello.cppm --check-prefix=CHECK-NO-O +// +// RUN: %clang -std=c++20 Hello.cppm \ +// RUN: -fmodules-reduced-bmi -c -o AnotherName.o -### 2>&1 | \ +// RUN: FileCheck Hello.cppm --check-prefix=CHECK-ANOTHER-NAME +// +// RUN: %clang -std=c++20 Hello.cppm --precompile -fmodules-reduced-bmi \ +// RUN: -o Hello.full.pcm -### 2>&1 | FileCheck Hello.cppm \ +// RUN: --check-prefix=CHECK-EMIT-MODULE-INTERFACE +// +// RUN: %clang -std=c++20 Hello.cc -fmodules-reduced-bmi -Wall -Werror \ +// RUN: -c -o Hello.o -### 2>&1 | FileCheck Hello.cc +// +// RUN: %clang -std=c++20 Hello.cppm -fmodule-output=Hello.pcm -c -o Hello.o \ +// RUN: -### 2>&1 | FileCheck Hello.cppm -check-prefix=WARN +// +// RUN: %clang -std=c++20 Hello.cppm --precompile -o Hello.pcm \ +// RUN: -### 2>&1 | FileCheck Hello.cppm -check-prefix=WARN +// +// RUN: %clang -std=c++20 Hello.cppm -fmodule-output=Hello.pcm -c -o Hello.o \ +// RUN: -Wno-missing-reduced-bmi -### 2>&1 | FileCheck Hello.cppm -check-prefix=NO_WARN +// +// RUN: %clang -std=c++20 Hello.cppm --precompile -o Hello.pcm \ +// RUN: -Wno-missing-reduced-bmi -### 2>&1 | FileCheck Hello.cppm -check-prefix=NO_WARN //--- Hello.cppm export module Hello; // Test that we won't generate the emit-module-interface as 2 phase compilation model. // CHECK-NOT: -emit-module-interface -// CHECK: "-fexperimental-modules-reduced-bmi" +// CHECK: "-fmodules-reduced-bmi" // CHECK-UNSPECIFIED: -fmodule-output=Hello.pcm @@ -46,6 +80,9 @@ export module Hello; // flag. // CHECK-EMIT-MODULE-INTERFACE: -emit-module-interface +// WARN: reduced BMI is expected to be enabled by default in Clang 21; +// NO_WARN-NOT: warning + //--- Hello.cc -// CHECK-NOT: "-fexperimental-modules-reduced-bmi" +// CHECK-NOT: "-fmodules-reduced-bmi" diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py index f69a7dfedef2d..628a15f5bdcf9 100644 --- a/libcxx/utils/libcxx/test/format.py +++ b/libcxx/utils/libcxx/test/format.py @@ -172,6 +172,7 @@ def parseScript(test, preamble): f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " "-fmodule-file=std=%T/std.pcm " # The std.compat module imports std. + "-fmodules-reduced-bmi " "--precompile -o %T/std.compat.pcm -c %{module-dir}/std.compat.cppm", ) moduleCompileFlags.extend( @@ -188,6 +189,7 @@ def parseScript(test, preamble): "%dbg(MODULE std) %{cxx} %{flags} " f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " + "-fmodules-reduced-bmi " "--precompile -o %T/std.pcm -c %{module-dir}/std.cppm", ) moduleCompileFlags.extend(["-fmodule-file=std=%T/std.pcm", "%T/std.pcm"]) From 27ce98fec8b365fefcd0c61cac98168825c29aef Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Wed, 27 Nov 2024 10:56:28 +0800 Subject: [PATCH 2/5] use experimental reduced BMI flag --- libcxx/utils/libcxx/test/format.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py index 628a15f5bdcf9..0aee7ac3fbc19 100644 --- a/libcxx/utils/libcxx/test/format.py +++ b/libcxx/utils/libcxx/test/format.py @@ -172,7 +172,7 @@ def parseScript(test, preamble): f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " "-fmodule-file=std=%T/std.pcm " # The std.compat module imports std. - "-fmodules-reduced-bmi " + "-fexperimental-modules-reduced-bmi " "--precompile -o %T/std.compat.pcm -c %{module-dir}/std.compat.cppm", ) moduleCompileFlags.extend( @@ -189,7 +189,7 @@ def parseScript(test, preamble): "%dbg(MODULE std) %{cxx} %{flags} " f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " - "-fmodules-reduced-bmi " + "-fexperimental-modules-reduced-bmi " "--precompile -o %T/std.pcm -c %{module-dir}/std.cppm", ) moduleCompileFlags.extend(["-fmodule-file=std=%T/std.pcm", "%T/std.pcm"]) From 6385b2c4c75a33107d11dc9608357acc0c2383d5 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 10 Dec 2024 15:12:48 +0800 Subject: [PATCH 3/5] Don't warn --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 7 ------- clang/lib/Driver/ToolChains/Clang.cpp | 8 -------- clang/test/Driver/module-fgen-reduced-bmi.cppm | 7 ------- 3 files changed, 22 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 020ea50b8fac1..5155b23d151c0 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -555,13 +555,6 @@ def err_test_module_file_extension_format : Error< def err_drv_module_output_with_multiple_arch : Error< "option '-fmodule-output' cannot be used with multiple arch options">; -def warn_drv_module_reduced_bmi_not_enabled : Warning< - "reduced BMI is expected to be enabled by default in Clang 21; it can be enabled " - "explicitly by passing '-fmodules-reduced-bmi' (in one-phase compilation models, " - "like CMake) or by disabling the diagnostic and requesting the build system vendor " - "support reduced BMIs (in two-phase compilation models)">, - InGroup>; - def warn_drv_delayed_template_parsing_after_cxx20 : Warning< "-fdelayed-template-parsing is deprecated after C++20">, InGroup>; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 1bc2b135a9c79..6a66cde37cf29 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4267,14 +4267,6 @@ static bool RenderModulesOptions(Compilation &C, const Driver &D, getCXX20NamedModuleOutputPath(Args, Input.getBaseInput()))); } - if ((Input.getType() == driver::types::TY_CXXModule || - Input.getType() == driver::types::TY_PP_CXXModule) && - (Args.hasArg(options::OPT_fmodule_output) || - Args.hasArg(options::OPT_fmodule_output_EQ) || - Args.hasArg(options::OPT__precompile)) && - !Args.hasArg(options::OPT_modules_reduced_bmi)) - D.Diag(diag::warn_drv_module_reduced_bmi_not_enabled); - // 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. diff --git a/clang/test/Driver/module-fgen-reduced-bmi.cppm b/clang/test/Driver/module-fgen-reduced-bmi.cppm index b14a68d87b45b..7329c12941d73 100644 --- a/clang/test/Driver/module-fgen-reduced-bmi.cppm +++ b/clang/test/Driver/module-fgen-reduced-bmi.cppm @@ -53,12 +53,6 @@ // RUN: -c -o Hello.o -### 2>&1 | FileCheck Hello.cc // // RUN: %clang -std=c++20 Hello.cppm -fmodule-output=Hello.pcm -c -o Hello.o \ -// RUN: -### 2>&1 | FileCheck Hello.cppm -check-prefix=WARN -// -// RUN: %clang -std=c++20 Hello.cppm --precompile -o Hello.pcm \ -// RUN: -### 2>&1 | FileCheck Hello.cppm -check-prefix=WARN -// -// RUN: %clang -std=c++20 Hello.cppm -fmodule-output=Hello.pcm -c -o Hello.o \ // RUN: -Wno-missing-reduced-bmi -### 2>&1 | FileCheck Hello.cppm -check-prefix=NO_WARN // // RUN: %clang -std=c++20 Hello.cppm --precompile -o Hello.pcm \ @@ -80,7 +74,6 @@ export module Hello; // flag. // CHECK-EMIT-MODULE-INTERFACE: -emit-module-interface -// WARN: reduced BMI is expected to be enabled by default in Clang 21; // NO_WARN-NOT: warning //--- Hello.cc From aec8e5be63c81f50e6e5ef0d3c4ee349df6c1abe Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 10 Dec 2024 15:15:15 +0800 Subject: [PATCH 4/5] remove libcxx's change --- libcxx/utils/libcxx/test/format.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py index 0aee7ac3fbc19..f69a7dfedef2d 100644 --- a/libcxx/utils/libcxx/test/format.py +++ b/libcxx/utils/libcxx/test/format.py @@ -172,7 +172,6 @@ def parseScript(test, preamble): f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " "-fmodule-file=std=%T/std.pcm " # The std.compat module imports std. - "-fexperimental-modules-reduced-bmi " "--precompile -o %T/std.compat.pcm -c %{module-dir}/std.compat.cppm", ) moduleCompileFlags.extend( @@ -189,7 +188,6 @@ def parseScript(test, preamble): "%dbg(MODULE std) %{cxx} %{flags} " f"{compileFlags} " "-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal " - "-fexperimental-modules-reduced-bmi " "--precompile -o %T/std.pcm -c %{module-dir}/std.cppm", ) moduleCompileFlags.extend(["-fmodule-file=std=%T/std.pcm", "%T/std.pcm"]) From b6d87dc0d48e1831e91c89fe00c78cbd1f5c71c2 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 10 Dec 2024 15:17:06 +0800 Subject: [PATCH 5/5] Update release notes --- clang/docs/ReleaseNotes.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 9f899b2f7a953..ffca64bf14022 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -412,9 +412,9 @@ Modified Compiler Flags ``memset`` and similar functions for which it is a documented undefined behavior. -- Added ``-fmodules-reduced-bmi`` flags corresponding to - ``-fexperimental-modules-reduced-bmi`` flag and emit warning for not emitting - reduced BMI. +- Added ``-fmodules-reduced-bmi`` flag corresponding to + ``-fexperimental-modules-reduced-bmi`` flag. The ``-fmodules-reduced-bmi`` flag + is intended to be enabled by default in the future. Removed Compiler Flags -------------------------