[all-commits] [llvm/llvm-project] 4d4c70: [libc++][modules] Removes the module partitions.

Mark de Wever via All-commits all-commits at lists.llvm.org
Wed Aug 9 10:39:22 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 4d4c70c91c5511f8c051623bcc1a76064d5bf687
      https://github.com/llvm/llvm-project/commit/4d4c70c91c5511f8c051623bcc1a76064d5bf687
  Author: Mark de Wever <koraq at xs4all.nl>
  Date:   2023-08-09 (Wed, 09 Aug 2023)

  Changed paths:
    M libcxx/modules/CMakeLists.txt
    M libcxx/modules/CMakeLists.txt.in
    A libcxx/modules/README.md
    R libcxx/modules/std.cppm
    A libcxx/modules/std.cppm.in
    R libcxx/modules/std/algorithm.cppm
    A libcxx/modules/std/algorithm.inc
    R libcxx/modules/std/any.cppm
    A libcxx/modules/std/any.inc
    R libcxx/modules/std/array.cppm
    A libcxx/modules/std/array.inc
    R libcxx/modules/std/atomic.cppm
    A libcxx/modules/std/atomic.inc
    R libcxx/modules/std/barrier.cppm
    A libcxx/modules/std/barrier.inc
    R libcxx/modules/std/bit.cppm
    A libcxx/modules/std/bit.inc
    R libcxx/modules/std/bitset.cppm
    A libcxx/modules/std/bitset.inc
    R libcxx/modules/std/cassert.cppm
    A libcxx/modules/std/cassert.inc
    R libcxx/modules/std/cctype.cppm
    A libcxx/modules/std/cctype.inc
    R libcxx/modules/std/cerrno.cppm
    A libcxx/modules/std/cerrno.inc
    R libcxx/modules/std/cfenv.cppm
    A libcxx/modules/std/cfenv.inc
    R libcxx/modules/std/cfloat.cppm
    A libcxx/modules/std/cfloat.inc
    R libcxx/modules/std/charconv.cppm
    A libcxx/modules/std/charconv.inc
    R libcxx/modules/std/chrono.cppm
    A libcxx/modules/std/chrono.inc
    R libcxx/modules/std/cinttypes.cppm
    A libcxx/modules/std/cinttypes.inc
    R libcxx/modules/std/climits.cppm
    A libcxx/modules/std/climits.inc
    R libcxx/modules/std/clocale.cppm
    A libcxx/modules/std/clocale.inc
    R libcxx/modules/std/cmath.cppm
    A libcxx/modules/std/cmath.inc
    R libcxx/modules/std/codecvt.cppm
    A libcxx/modules/std/codecvt.inc
    R libcxx/modules/std/compare.cppm
    A libcxx/modules/std/compare.inc
    R libcxx/modules/std/complex.cppm
    A libcxx/modules/std/complex.inc
    R libcxx/modules/std/concepts.cppm
    A libcxx/modules/std/concepts.inc
    R libcxx/modules/std/condition_variable.cppm
    A libcxx/modules/std/condition_variable.inc
    R libcxx/modules/std/coroutine.cppm
    A libcxx/modules/std/coroutine.inc
    R libcxx/modules/std/csetjmp.cppm
    A libcxx/modules/std/csetjmp.inc
    R libcxx/modules/std/csignal.cppm
    A libcxx/modules/std/csignal.inc
    R libcxx/modules/std/cstdarg.cppm
    A libcxx/modules/std/cstdarg.inc
    R libcxx/modules/std/cstddef.cppm
    A libcxx/modules/std/cstddef.inc
    R libcxx/modules/std/cstdint.cppm
    A libcxx/modules/std/cstdint.inc
    R libcxx/modules/std/cstdio.cppm
    A libcxx/modules/std/cstdio.inc
    R libcxx/modules/std/cstdlib.cppm
    A libcxx/modules/std/cstdlib.inc
    R libcxx/modules/std/cstring.cppm
    A libcxx/modules/std/cstring.inc
    R libcxx/modules/std/ctime.cppm
    A libcxx/modules/std/ctime.inc
    R libcxx/modules/std/cuchar.cppm
    A libcxx/modules/std/cuchar.inc
    R libcxx/modules/std/cwchar.cppm
    A libcxx/modules/std/cwchar.inc
    R libcxx/modules/std/cwctype.cppm
    A libcxx/modules/std/cwctype.inc
    R libcxx/modules/std/deque.cppm
    A libcxx/modules/std/deque.inc
    R libcxx/modules/std/exception.cppm
    A libcxx/modules/std/exception.inc
    R libcxx/modules/std/execution.cppm
    A libcxx/modules/std/execution.inc
    R libcxx/modules/std/expected.cppm
    A libcxx/modules/std/expected.inc
    R libcxx/modules/std/filesystem.cppm
    A libcxx/modules/std/filesystem.inc
    R libcxx/modules/std/flat_map.cppm
    A libcxx/modules/std/flat_map.inc
    R libcxx/modules/std/flat_set.cppm
    A libcxx/modules/std/flat_set.inc
    R libcxx/modules/std/format.cppm
    A libcxx/modules/std/format.inc
    R libcxx/modules/std/forward_list.cppm
    A libcxx/modules/std/forward_list.inc
    R libcxx/modules/std/fstream.cppm
    A libcxx/modules/std/fstream.inc
    R libcxx/modules/std/functional.cppm
    A libcxx/modules/std/functional.inc
    R libcxx/modules/std/future.cppm
    A libcxx/modules/std/future.inc
    R libcxx/modules/std/generator.cppm
    A libcxx/modules/std/generator.inc
    R libcxx/modules/std/hazard_pointer.cppm
    A libcxx/modules/std/hazard_pointer.inc
    R libcxx/modules/std/initializer_list.cppm
    A libcxx/modules/std/initializer_list.inc
    R libcxx/modules/std/iomanip.cppm
    A libcxx/modules/std/iomanip.inc
    R libcxx/modules/std/ios.cppm
    A libcxx/modules/std/ios.inc
    R libcxx/modules/std/iosfwd.cppm
    A libcxx/modules/std/iosfwd.inc
    R libcxx/modules/std/iostream.cppm
    A libcxx/modules/std/iostream.inc
    R libcxx/modules/std/istream.cppm
    A libcxx/modules/std/istream.inc
    R libcxx/modules/std/iterator.cppm
    A libcxx/modules/std/iterator.inc
    R libcxx/modules/std/latch.cppm
    A libcxx/modules/std/latch.inc
    R libcxx/modules/std/limits.cppm
    A libcxx/modules/std/limits.inc
    R libcxx/modules/std/list.cppm
    A libcxx/modules/std/list.inc
    R libcxx/modules/std/locale.cppm
    A libcxx/modules/std/locale.inc
    R libcxx/modules/std/map.cppm
    A libcxx/modules/std/map.inc
    R libcxx/modules/std/mdspan.cppm
    A libcxx/modules/std/mdspan.inc
    R libcxx/modules/std/memory.cppm
    A libcxx/modules/std/memory.inc
    R libcxx/modules/std/memory_resource.cppm
    A libcxx/modules/std/memory_resource.inc
    R libcxx/modules/std/mutex.cppm
    A libcxx/modules/std/mutex.inc
    R libcxx/modules/std/new.cppm
    A libcxx/modules/std/new.inc
    R libcxx/modules/std/numbers.cppm
    A libcxx/modules/std/numbers.inc
    R libcxx/modules/std/numeric.cppm
    A libcxx/modules/std/numeric.inc
    R libcxx/modules/std/optional.cppm
    A libcxx/modules/std/optional.inc
    R libcxx/modules/std/ostream.cppm
    A libcxx/modules/std/ostream.inc
    R libcxx/modules/std/print.cppm
    A libcxx/modules/std/print.inc
    R libcxx/modules/std/queue.cppm
    A libcxx/modules/std/queue.inc
    R libcxx/modules/std/random.cppm
    A libcxx/modules/std/random.inc
    R libcxx/modules/std/ranges.cppm
    A libcxx/modules/std/ranges.inc
    R libcxx/modules/std/ratio.cppm
    A libcxx/modules/std/ratio.inc
    R libcxx/modules/std/rcu.cppm
    A libcxx/modules/std/rcu.inc
    R libcxx/modules/std/regex.cppm
    A libcxx/modules/std/regex.inc
    R libcxx/modules/std/scoped_allocator.cppm
    A libcxx/modules/std/scoped_allocator.inc
    R libcxx/modules/std/semaphore.cppm
    A libcxx/modules/std/semaphore.inc
    R libcxx/modules/std/set.cppm
    A libcxx/modules/std/set.inc
    R libcxx/modules/std/shared_mutex.cppm
    A libcxx/modules/std/shared_mutex.inc
    R libcxx/modules/std/source_location.cppm
    A libcxx/modules/std/source_location.inc
    R libcxx/modules/std/span.cppm
    A libcxx/modules/std/span.inc
    R libcxx/modules/std/spanstream.cppm
    A libcxx/modules/std/spanstream.inc
    R libcxx/modules/std/sstream.cppm
    A libcxx/modules/std/sstream.inc
    R libcxx/modules/std/stack.cppm
    A libcxx/modules/std/stack.inc
    R libcxx/modules/std/stacktrace.cppm
    A libcxx/modules/std/stacktrace.inc
    R libcxx/modules/std/stdexcept.cppm
    A libcxx/modules/std/stdexcept.inc
    R libcxx/modules/std/stdfloat.cppm
    A libcxx/modules/std/stdfloat.inc
    R libcxx/modules/std/stop_token.cppm
    A libcxx/modules/std/stop_token.inc
    R libcxx/modules/std/streambuf.cppm
    A libcxx/modules/std/streambuf.inc
    R libcxx/modules/std/string.cppm
    A libcxx/modules/std/string.inc
    R libcxx/modules/std/string_view.cppm
    A libcxx/modules/std/string_view.inc
    R libcxx/modules/std/strstream.cppm
    A libcxx/modules/std/strstream.inc
    R libcxx/modules/std/syncstream.cppm
    A libcxx/modules/std/syncstream.inc
    R libcxx/modules/std/system_error.cppm
    A libcxx/modules/std/system_error.inc
    R libcxx/modules/std/text_encoding.cppm
    A libcxx/modules/std/text_encoding.inc
    R libcxx/modules/std/thread.cppm
    A libcxx/modules/std/thread.inc
    R libcxx/modules/std/tuple.cppm
    A libcxx/modules/std/tuple.inc
    R libcxx/modules/std/type_traits.cppm
    A libcxx/modules/std/type_traits.inc
    R libcxx/modules/std/typeindex.cppm
    A libcxx/modules/std/typeindex.inc
    R libcxx/modules/std/typeinfo.cppm
    A libcxx/modules/std/typeinfo.inc
    R libcxx/modules/std/unordered_map.cppm
    A libcxx/modules/std/unordered_map.inc
    R libcxx/modules/std/unordered_set.cppm
    A libcxx/modules/std/unordered_set.inc
    R libcxx/modules/std/utility.cppm
    A libcxx/modules/std/utility.inc
    R libcxx/modules/std/valarray.cppm
    A libcxx/modules/std/valarray.inc
    R libcxx/modules/std/variant.cppm
    A libcxx/modules/std/variant.inc
    R libcxx/modules/std/vector.cppm
    A libcxx/modules/std/vector.inc
    R libcxx/modules/std/version.cppm
    A libcxx/modules/std/version.inc
    M libcxx/test/libcxx/module_std.gen.py
    M libcxx/test/tools/clang_tidy_checks/header_exportable_declarations.cpp

  Log Message:
  -----------
  [libc++][modules] Removes the module partitions.

This patch is based on the suggestion by @ChuanqiXu on discourse
(https://discourse.llvm.org/t/alternatives-to-the-implementation-of-std-modules/71958)

Instead of making a module partition per header every header gets an inc
file which contains the exports per header. The std module then includes
all public headers and these inc files. The one file per header is
useful for testing purposes. The CI tests whether the exports of a
header's module partition matches the "public" named declarations in the
header. With one file per header this can still be done.

The patch improves compilation time of files using "import std;" and the
size of the std module.

A comparision of the compilation speed using a libc++ test
  build/bin/llvm-lit -a -Dstd=c++23 -Denable_modules=std libcxx/test/std/modules/std.pass.cpp

Which boils down to
  import std;

  int main(int, char**) {
    std::println("Hello modular world");
    return 0;
  }
and has -ftime-report enabled

Before
===-------------------------------------------------------------------------===
                          Clang front-end time report
===-------------------------------------------------------------------------===
  Total Execution Time: 8.6585 seconds (8.6619 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
   4.5041 ( 57.2%)   0.4264 ( 54.4%)   4.9305 ( 56.9%)   4.9331 ( 57.0%)  Clang front-end timer
   3.2037 ( 40.7%)   0.2408 ( 30.7%)   3.4445 ( 39.8%)   3.4452 ( 39.8%)  Reading modules
   0.1665 (  2.1%)   0.1170 ( 14.9%)   0.2835 (  3.3%)   0.2837 (  3.3%)  Loading .../build/test/__config_module__/CMakeFiles/std.dir/std.pcm
   7.8744 (100.0%)   0.7842 (100.0%)   8.6585 (100.0%)   8.6619 (100.0%)  Total

After
===-------------------------------------------------------------------------===
                          Clang front-end time report
===-------------------------------------------------------------------------===
  Total Execution Time: 1.2420 seconds (1.2423 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
   0.8892 ( 84.6%)   0.1698 ( 88.8%)   1.0590 ( 85.3%)   1.0590 ( 85.2%)  Clang front-end timer
   0.1533 ( 14.6%)   0.0168 (  8.8%)   0.1701 ( 13.7%)   0.1704 ( 13.7%)  Reading modules
   0.0082 (  0.8%)   0.0047 (  2.5%)   0.0129 (  1.0%)   0.0129 (  1.0%)  Loading .../build/test/__config_module__/CMakeFiles/std.dir/std.pcm
   1.0507 (100.0%)   0.1913 (100.0%)   1.2420 (100.0%)   1.2423 (100.0%)  Total

Using "include <print>" instead of "import module;"
===-------------------------------------------------------------------------===
                          Clang front-end time report
===-------------------------------------------------------------------------===
  Total Execution Time: 2.1507 seconds (2.1517 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
   1.9714 (100.0%)   0.1793 (100.0%)   2.1507 (100.0%)   2.1517 (100.0%)  Clang front-end timer
   1.9714 (100.0%)   0.1793 (100.0%)   2.1507 (100.0%)   2.1517 (100.0%)  Total

It's possible to use the std module in external projects
(https://libcxx.llvm.org/Modules.html#using-in-external-projects)

Tested this with a private project to validate the size of the generated files:

Before
$ du -sch std-*
448M	std-build
508K	std-src
120K	std-subbuild
449M	total

After
$ du -sch std-*
29M	std-build
1004K	std-src
132K	std-subbuild
30M	total

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D156907




More information about the All-commits mailing list