[clang] [C++20] [Modules] Convert '-fexperimental-modules-reduced-bmi' to '-fmodules-reduced-bmi' (PR #114382)
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 3 18:44:26 PST 2024
https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/114382
>From f33e3bcd7d31742a37059a9d75fa58aa4d9ff36d Mon Sep 17 00:00:00 2001
From: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
Date: Thu, 31 Oct 2024 17:27:00 +0800
Subject: [PATCH 1/2] [C++20] [Modules] Convert
'-fexperimental-modules-reduced-bmi' to '-fmodules-reduced-bmi'
---
clang/docs/StandardCPlusPlusModules.rst | 18 ++++++-------
.../clang/Basic/DiagnosticDriverKinds.td | 8 ++++++
clang/include/clang/Driver/Options.td | 5 +++-
clang/lib/Driver/ToolChains/Clang.cpp | 12 +++++++--
.../test/Driver/module-fgen-reduced-bmi.cppm | 26 +++++++++++++++++--
5 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/clang/docs/StandardCPlusPlusModules.rst b/clang/docs/StandardCPlusPlusModules.rst
index 8e22adad15106e..26b29337ce42cb 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,7 +691,7 @@ 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. ``-fmodules-reduced-bmi`` is opt-in for 1~2 releases. 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
@@ -814,8 +814,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 +831,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 65551bd7761a9d..7589c6f52419dd 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -556,6 +556,14 @@ def err_test_module_file_extension_format : Error<
def err_drv_module_output_with_multiple_arch : Error<
"option '-fmodule-output' can't 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 is encouraged to "
+ "enable it ahead of time to avoid potential breaking change. You can enable it "
+ "by offering '-fmodules-reduced-bmi' option in one phase compilation model (e.g., CMake). "
+ "Or if your build system support two phase compilation model, please contact the "
+ "build system authors to support reduced BMI and turn off the warning temporarily">,
+ InGroup<DiagGroup<"missing-reduced-bmi">>;
+
def warn_drv_delayed_template_parsing_after_cxx20 : Warning<
"-fdelayed-template-parsing is deprecated after C++20">,
InGroup<DiagGroup<"delayed-template-parsing-in-cxx20">>;
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 2b9ee1a0e669ed..bd4a716db29b0a 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<f_Group>;
-def modules_reduced_bmi : Flag<["-"], "fexperimental-modules-reduced-bmi">,
+def modules_reduced_bmi : Flag<["-"], "fmodules-reduced-bmi">,
Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
HelpText<"Generate the reduced BMI">,
MarshallingInfoFlag<FrontendOpts<"GenReducedBMI">>;
+def experimental_modules_reduced_bmi : Flag<["-"], "fexperimental-modules-reduced-bmi">,
+ Group<f_Group>, Visibility<[ClangOption, CC1Option]>, Alias<modules_reduced_bmi>;
+
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 4c6f508f1f24a6..b67993d7b84d42 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4255,7 +4255,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);
@@ -4265,7 +4265,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 1223189fb49b72..af98684b5f95f9 100644
--- a/clang/test/Driver/module-fgen-reduced-bmi.cppm
+++ b/clang/test/Driver/module-fgen-reduced-bmi.cppm
@@ -29,13 +29,35 @@
//
// 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
//--- 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
@@ -48,4 +70,4 @@ export module Hello;
//--- Hello.cc
-// CHECK-NOT: "-fexperimental-modules-reduced-bmi"
+// CHECK-NOT: "-fmodules-reduced-bmi"
>From a3f9aca79178b58d614c65b6b67b28fc30c6486e Mon Sep 17 00:00:00 2001
From: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
Date: Mon, 4 Nov 2024 10:44:03 +0800
Subject: [PATCH 2/2] Address comments
---
clang/docs/ReleaseNotes.rst | 4 ++++
clang/include/clang/Basic/DiagnosticDriverKinds.td | 9 ++++-----
clang/test/Driver/module-fgen-reduced-bmi.cppm | 8 ++++++++
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 145786bcc59b45..e73fe5cb837bee 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -327,6 +327,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/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 7589c6f52419dd..99f93e3b73b7bb 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -557,11 +557,10 @@ def err_drv_module_output_with_multiple_arch : Error<
"option '-fmodule-output' can't 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 is encouraged to "
- "enable it ahead of time to avoid potential breaking change. You can enable it "
- "by offering '-fmodules-reduced-bmi' option in one phase compilation model (e.g., CMake). "
- "Or if your build system support two phase compilation model, please contact the "
- "build system authors to support reduced BMI and turn off the warning temporarily">,
+ "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<DiagGroup<"missing-reduced-bmi">>;
def warn_drv_delayed_template_parsing_after_cxx20 : Warning<
diff --git a/clang/test/Driver/module-fgen-reduced-bmi.cppm b/clang/test/Driver/module-fgen-reduced-bmi.cppm
index af98684b5f95f9..a2606381483f88 100644
--- a/clang/test/Driver/module-fgen-reduced-bmi.cppm
+++ b/clang/test/Driver/module-fgen-reduced-bmi.cppm
@@ -51,6 +51,12 @@
//
// 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
//--- Hello.cppm
export module Hello;
@@ -68,6 +74,8 @@ export module Hello;
// flag.
// CHECK-EMIT-MODULE-INTERFACE: -emit-module-interface
+// WARN: reduced BMI is expected to be enabled by default in Clang 21;
+
//--- Hello.cc
// CHECK-NOT: "-fmodules-reduced-bmi"
More information about the cfe-commits
mailing list