https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/107194
>From f18b50fb6ae778ac9b4ddaee4029d54f859c50f9 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Wed, 4 Sep 2024 16:02:53 +0800 Subject: [PATCH 1/2] [C++20] [Modules] Offer -fmodules-embed-all-files option See https://discourse.llvm.org/t/rfc-modules-should-we-embed-sources-to-the-bmi/81029 for details. Close https://github.com/llvm/llvm-project/issues/72383 --- clang/docs/StandardCPlusPlusModules.rst | 34 +++++++++++++++++++ clang/include/clang/Driver/Options.td | 10 +++--- clang/lib/Driver/ToolChains/Clang.cpp | 3 ++ .../test/Driver/fmodules-embed-all-files.cpp | 2 ++ 4 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 clang/test/Driver/fmodules-embed-all-files.cpp diff --git a/clang/docs/StandardCPlusPlusModules.rst b/clang/docs/StandardCPlusPlusModules.rst index 2b757a807a0e6e..02ca0db3f937b3 100644 --- a/clang/docs/StandardCPlusPlusModules.rst +++ b/clang/docs/StandardCPlusPlusModules.rst @@ -462,6 +462,33 @@ Currently, Clang accepts the above example, though it may produce surprising results if the debugging code depends on consistent use of ``NDEBUG`` in other translation units. +Source Files Consistency +^^^^^^^^^^^^^^^^^^^^^^^^ + +Clang may open the input files (*) of a BMI during the compilation. It implies that +when we consume a BMI, all the input files need to be present with the same path +and the same contents. + +To overcome the requirements and simplify cases like distributed builds and sandboxed +builds, users can use ``-fmodules-embed-all-files`` flag to embed all input files +into the BMI so that clang won't ask to open the corresponding file on disk. + +Input files (*): The source files that took part in the compilation of the BMI. +For example, + +.. code-block:: c++ + + // M.cppm + module; + #include "foo.h" + export module M; + + // foo.h + #pragma once + #include "bar.h" + +The ``M.cppm``, ``foo.h`` and ``bar.h`` are input files for the BMI of ``M.cppm``. + Object definition consistency ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -484,6 +511,13 @@ fragment is disabled by default. These checks can be enabled by specifying and you encounter incorrect or missing diagnostics, please report them via the `community issue tracker <https://github.com/llvm/llvm-project/issues/>`_. +Privacy Issue +------------- + +BMIs are not and should not be treated as an information hiding mechanism. +They should always be assumed to contain all the information that was used to +create them, in a recoverable form. + ABI Impacts ----------- diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 1142416e227fc8..954cffc0f66950 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3162,6 +3162,12 @@ def modules_reduced_bmi : Flag<["-"], "fexperimental-modules-reduced-bmi">, HelpText<"Generate the reduced BMI">, MarshallingInfoFlag<FrontendOpts<"GenReducedBMI">>; +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 " + "the produced module file.">, + MarshallingInfoFlag<FrontendOpts<"ModulesEmbedAllFiles">>; + def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group<i_Group>, Visibility<[ClangOption, CC1Option]>, MetaVarName<"<seconds>">, HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">, @@ -7665,10 +7671,6 @@ def fmodules_embed_file_EQ : Joined<["-"], "fmodules-embed-file=">, HelpText<"Embed the contents of the specified file into the module file " "being compiled.">, MarshallingInfoStringVector<FrontendOpts<"ModulesEmbedFiles">>; -def fmodules_embed_all_files : Joined<["-"], "fmodules-embed-all-files">, - HelpText<"Embed the contents of all files read by this compilation into " - "the produced module file.">, - MarshallingInfoFlag<FrontendOpts<"ModulesEmbedAllFiles">>; defm fimplicit_modules_use_lock : BoolOption<"f", "implicit-modules-use-lock", FrontendOpts<"BuildingImplicitModuleUsesLock">, DefaultTrue, NegFlag<SetFalse>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 3fe4ce5d893b8d..870575bb8a907c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4214,6 +4214,9 @@ static bool RenderModulesOptions(Compilation &C, const Driver &D, Args.ClaimAllArgs(options::OPT_fmodule_output_EQ); } + if (Args.hasArg(options::OPT_fmodules_embed_all_files)) + CmdArgs.push_back("-fmodules-embed-all-files"); + return HaveModules; } diff --git a/clang/test/Driver/fmodules-embed-all-files.cpp b/clang/test/Driver/fmodules-embed-all-files.cpp new file mode 100644 index 00000000000000..f8e232f792d540 --- /dev/null +++ b/clang/test/Driver/fmodules-embed-all-files.cpp @@ -0,0 +1,2 @@ +// RUN: %clang -std=c++20 %s -fmodules-embed-all-files -### 2>&1 | FileCheck %s +// CHECK: -fmodules-embed-all-files >From d539f51c09d76170fe93644f00451989fc90e86d Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Thu, 19 Sep 2024 10:31:34 +0800 Subject: [PATCH 2/2] update --- clang/docs/StandardCPlusPlusModules.rst | 20 +++++++++++-------- .../test/Driver/fmodules-embed-all-files.cpp | 3 +++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/clang/docs/StandardCPlusPlusModules.rst b/clang/docs/StandardCPlusPlusModules.rst index 02ca0db3f937b3..f2ac3ee11ceb42 100644 --- a/clang/docs/StandardCPlusPlusModules.rst +++ b/clang/docs/StandardCPlusPlusModules.rst @@ -465,16 +465,20 @@ translation units. Source Files Consistency ^^^^^^^^^^^^^^^^^^^^^^^^ -Clang may open the input files (*) of a BMI during the compilation. It implies that -when we consume a BMI, all the input files need to be present with the same path -and the same contents. +Clang may open the input files\ :sup:`*` of a BMI during the compilation. This implies that +when Clang consumes a BMI, all the input files need to be present in the original path +and with the original contents. -To overcome the requirements and simplify cases like distributed builds and sandboxed -builds, users can use ``-fmodules-embed-all-files`` flag to embed all input files -into the BMI so that clang won't ask to open the corresponding file on disk. +To overcome these requirements and simplify cases like distributed builds and sandboxed +builds, users can use the ``-fmodules-embed-all-files`` flag to embed all input files +into the BMI so that Clang does not need to open the corresponding file on disk. -Input files (*): The source files that took part in the compilation of the BMI. -For example, +When the ``-fmodules-embed-all-files`` flag are enabled, Clang explicitly emits the source +code into the BMI file, the contents of the BMI file contain a sufficiently verbose +representation to reproduce the original source file. + +:sup:`*`Input files: The source files which took part in the compilation of the BMI. +For example: .. code-block:: c++ diff --git a/clang/test/Driver/fmodules-embed-all-files.cpp b/clang/test/Driver/fmodules-embed-all-files.cpp index f8e232f792d540..8da836a40446c4 100644 --- a/clang/test/Driver/fmodules-embed-all-files.cpp +++ b/clang/test/Driver/fmodules-embed-all-files.cpp @@ -1,2 +1,5 @@ // RUN: %clang -std=c++20 %s -fmodules-embed-all-files -### 2>&1 | FileCheck %s // CHECK: -fmodules-embed-all-files + +// RUN: %clang -std=c++20 %s -### 2>&1 | FileCheck %s --check-prefix=NON-EMBED +// NON-EMBED-NOT: -fmodules-embed-all-files _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits