[libcxx-commits] [libcxx] [libc++][modules] Improves std.compat module. (PR #76330)
Mark de Wever via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jan 17 04:04:28 PST 2024
https://github.com/mordante updated https://github.com/llvm/llvm-project/pull/76330
>From ede2a4ca0a64100393cf6ca29fbe105b62fe7331 Mon Sep 17 00:00:00 2001
From: Mark de Wever <koraq at xs4all.nl>
Date: Sun, 24 Dec 2023 12:13:00 +0100
Subject: [PATCH] [libc++][modules] Improves std.compat module.
Let the std.compat module use the std module instead of duplicating the
exports.
Based on @ChuanqiXu9's suggestion in #71438.
---
libcxx/modules/std.compat.cppm.in | 125 +-------------------
libcxx/modules/std.cppm.in | 1 +
libcxx/test/libcxx/module_std_compat.gen.py | 25 +---
libcxx/utils/generate_libcxx_cppm_in.py | 6 +-
libcxx/utils/libcxx/header_information.py | 25 ++++
5 files changed, 34 insertions(+), 148 deletions(-)
diff --git a/libcxx/modules/std.compat.cppm.in b/libcxx/modules/std.compat.cppm.in
index f199e194e60b16..651d6ec7b9fe26 100644
--- a/libcxx/modules/std.compat.cppm.in
+++ b/libcxx/modules/std.compat.cppm.in
@@ -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>
@@ -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>)
@@ -203,6 +81,7 @@ module;
#endif // __has_include(<text_encoding>)
export module std.compat;
+export import std;
+
- at LIBCXX_MODULE_STD_INCLUDE_SOURCES@
@LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES@
\ No newline at end of file
diff --git a/libcxx/modules/std.cppm.in b/libcxx/modules/std.cppm.in
index b46c52e781f82f..6ce8e287737b88 100644
--- a/libcxx/modules/std.cppm.in
+++ b/libcxx/modules/std.cppm.in
@@ -204,4 +204,5 @@ module;
export module std;
+
@LIBCXX_MODULE_STD_INCLUDE_SOURCES@
diff --git a/libcxx/test/libcxx/module_std_compat.gen.py b/libcxx/test/libcxx/module_std_compat.gen.py
index 2866066ccedc89..270d131779e5bf 100644
--- a/libcxx/test/libcxx/module_std_compat.gen.py
+++ b/libcxx/test/libcxx/module_std_compat.gen.py
@@ -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(
@@ -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,
)
diff --git a/libcxx/utils/generate_libcxx_cppm_in.py b/libcxx/utils/generate_libcxx_cppm_in.py
index f957406778d392..2d3f829847fb9f 100644
--- a/libcxx/utils/generate_libcxx_cppm_in.py
+++ b/libcxx/utils/generate_libcxx_cppm_in.py
@@ -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
@@ -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"""\
@@ -69,8 +70,9 @@ def write_file(module):
module_cpp_in.write(
f"""
export module {module};
+{'export import std;' if module == 'std.compat' else ''}
- at 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 ''}"""
)
diff --git a/libcxx/utils/libcxx/header_information.py b/libcxx/utils/libcxx/header_information.py
index 13337f16dc7118..00c362cc2ceea5 100644
--- a/libcxx/utils/libcxx/header_information.py
+++ b/libcxx/utils/libcxx/header_information.py
@@ -212,3 +212,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",
+]
More information about the libcxx-commits
mailing list