Skip to content

Commit

Permalink
[libc++][modules] Improves std.compat module.
Browse files Browse the repository at this point in the history
Let the std.compat module use the std module instead of duplicating the
exports.

Based on @ChuanqiXu9's suggestion in #71438.
  • Loading branch information
mordante committed Dec 24, 2023
1 parent dd147d3 commit 6134779
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 159 deletions.
125 changes: 2 additions & 123 deletions libcxx/modules/std.compat.cppm.in
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,17 @@ module;

// The headers of Table 24: C++ library headers [tab:headers.cpp]
// and the headers of Table 25: C++ headers for C library facilities [tab:headers.cpp.c]
#include <algorithm>
#include <any>
#include <array>
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
# include <atomic>
#endif
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <barrier>
#endif
#include <bit>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfenv>
#include <cfloat>
#include <charconv>
#include <chrono>
#include <cinttypes>
#include <climits>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <clocale>
#endif
#include <cmath>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <codecvt>
#endif
#include <compare>
#include <complex>
#include <concepts>
#include <condition_variable>
#include <coroutine>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
Expand All @@ -65,107 +44,6 @@ module;
#if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
# include <cwctype>
#endif
#include <deque>
#include <exception>
#include <execution>
#include <expected>
#include <filesystem>
#include <format>
#include <forward_list>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <fstream>
#endif
#include <functional>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <future>
#endif
#include <initializer_list>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <iomanip>
#endif
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <ios>
#endif
#include <iosfwd>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <iostream>
#endif
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <istream>
#endif
#include <iterator>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <latch>
#endif
#include <limits>
#include <list>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <locale>
#endif
#include <map>
#include <mdspan>
#include <memory>
#include <memory_resource>
#include <mutex>
#include <new>
#include <numbers>
#include <numeric>
#include <optional>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <ostream>
#endif
#include <print>
#include <queue>
#include <random>
#include <ranges>
#include <ratio>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <regex>
#endif
#include <scoped_allocator>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <semaphore>
#endif
#include <set>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <shared_mutex>
#endif
#include <source_location>
#include <span>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <sstream>
#endif
#include <stack>
#include <stdexcept>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <stop_token>
#endif
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <streambuf>
#endif
#include <string>
#include <string_view>
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <strstream>
#endif
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
# include <syncstream>
#endif
#include <system_error>
#if !defined(_LIBCPP_HAS_NO_THREADS)
# include <thread>
#endif
#include <tuple>
#include <type_traits>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <valarray>
#include <variant>
#include <vector>
#include <version>

// *** Headers not yet available ***
#if __has_include(<debugging>)
Expand Down Expand Up @@ -203,6 +81,7 @@ module;
#endif // __has_include(<text_encoding>)

export module std.compat;
export import std;


@LIBCXX_MODULE_STD_INCLUDE_SOURCES@
@LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES@
1 change: 1 addition & 0 deletions libcxx/modules/std.cppm.in
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,5 @@ module;

export module std;


@LIBCXX_MODULE_STD_INCLUDE_SOURCES@
25 changes: 2 additions & 23 deletions libcxx/test/libcxx/module_std_compat.gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import sys

sys.path.append(sys.argv[1])
from libcxx.header_information import module_c_headers
from libcxx.test.modules import module_test_generator

generator = module_test_generator(
Expand All @@ -37,27 +38,5 @@
print("//--- module_std_compat.sh.cpp")
generator.write_test(
"std.compat",
[
"cassert",
"cctype",
"cerrno",
"cfenv",
"cfloat",
"cinttypes",
"climits",
"clocale",
"cmath",
"csetjmp",
"csignal",
"cstdarg",
"cstddef",
"cstdint",
"cstdio",
"cstdlib",
"cstring",
"ctime",
"cuchar",
"cwchar",
"cwctype",
],
module_c_headers,
)
6 changes: 4 additions & 2 deletions libcxx/utils/generate_libcxx_cppm_in.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import os.path
import sys

from libcxx.header_information import module_c_headers
from libcxx.header_information import module_headers
from libcxx.header_information import header_restrictions
from libcxx.header_information import headers_not_available
Expand Down Expand Up @@ -44,7 +45,7 @@ def write_file(module):
// and the headers of Table 25: C++ headers for C library facilities [tab:headers.cpp.c]
"""
)
for header in module_headers:
for header in module_headers if module == "std" else module_c_headers:
if header in header_restrictions:
module_cpp_in.write(
f"""\
Expand All @@ -69,8 +70,9 @@ def write_file(module):
module_cpp_in.write(
f"""
export module {module};
{'export import std;' if module == 'std.compat' else ''}
@LIBCXX_MODULE_STD_INCLUDE_SOURCES@
{'@LIBCXX_MODULE_STD_INCLUDE_SOURCES@' if module == 'std' else ''}
{'@LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES@' if module == 'std.compat' else ''}"""
)

Expand Down
25 changes: 25 additions & 0 deletions libcxx/utils/libcxx/header_information.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,28 @@ def is_modulemap_header(header):
# These headers have been removed in C++20 so are never part of a module.
and not header in ["ccomplex", "ciso646", "cstdbool", "ctgmath"]
]

# The C headers used in the std and std.compat modules.
module_c_headers = [
"cassert",
"cctype",
"cerrno",
"cfenv",
"cfloat",
"cinttypes",
"climits",
"clocale",
"cmath",
"csetjmp",
"csignal",
"cstdarg",
"cstddef",
"cstdint",
"cstdio",
"cstdlib",
"cstring",
"ctime",
"cuchar",
"cwchar",
"cwctype",
]
21 changes: 10 additions & 11 deletions libcxx/utils/libcxx/test/format.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,10 @@ def parseScript(test, preamble):
script += preamble
script += scriptInTest

has_std_module = False
has_std_compat_module = False
for module in modules:
if module == "std":
has_std_module = True
pass
elif module == "std.compat":
has_std_compat_module = True
else:
Expand All @@ -165,23 +164,23 @@ def parseScript(test, preamble):
0,
"%dbg(MODULE std.compat) %{cxx} %{flags} %{compile_flags} "
"-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal "
"-fprebuilt-module-path=%T %T/std.pcm "
"--precompile -o %T/std.compat.pcm -c %{module}/std.compat.cppm",
)
moduleCompileFlags.append("%T/std.compat.pcm")

# Make sure the std module is added before std.compat.
# Libc++'s std.compat module will depend on its std module.
# Libc++'s std.compat module depends on its std module.
# It is not known whether the compiler expects the modules in the order
# of their dependencies. However it's trivial to provide them in that
# order.
if has_std_module:
script.insert(
0,
"%dbg(MODULE std) %{cxx} %{flags} %{compile_flags} "
"-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal "
"--precompile -o %T/std.pcm -c %{module}/std.cppm",
)
moduleCompileFlags.append("%T/std.pcm")
script.insert(
0,
"%dbg(MODULE std) %{cxx} %{flags} %{compile_flags} "
"-Wno-reserved-module-identifier -Wno-reserved-user-defined-literal "
"--precompile -o %T/std.pcm -c %{module}/std.cppm",
)
moduleCompileFlags.append("%T/std.pcm")

# Add compile flags specified with ADDITIONAL_COMPILE_FLAGS.
substitutions = [
Expand Down

0 comments on commit 6134779

Please sign in to comment.