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...@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...@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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits