[libcxx-commits] [libcxx] a800485 - [libc++][Modules] Recreate the top level `std` clang module
Ian Anderson via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jul 27 14:50:23 PDT 2023
Author: Ian Anderson
Date: 2023-07-27T14:50:18-07:00
New Revision: a800485a2deda0807cb9dc212b7d42ac916055fd
URL: https://github.com/llvm/llvm-project/commit/a800485a2deda0807cb9dc212b7d42ac916055fd
DIFF: https://github.com/llvm/llvm-project/commit/a800485a2deda0807cb9dc212b7d42ac916055fd.diff
LOG: [libc++][Modules] Recreate the top level `std` clang module
lldb needs the `std` clang module to make all of libc++ available in the debugger. Make a new header to include the rest of the public headers and use to build a `std` module that just re-exports the rest of libc++.
Reviewed By: Mordante, JDevlieghere, #libc
Differential Revision: https://reviews.llvm.org/D156177
Added:
libcxx/include/__std_clang_module
Modified:
libcxx/include/CMakeLists.txt
libcxx/include/module.modulemap.in
libcxx/test/libcxx/modules_include.gen.py
libcxx/utils/generate_iwyu_mapping.py
Removed:
################################################################################
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index af873fe0ea45ba..968ebaeeecf586 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -653,6 +653,7 @@ set(files
__ranges/views.h
__ranges/zip_view.h
__split_buffer
+ __std_clang_module
__std_mbstate_t.h
__stop_token/atomic_unique_lock.h
__stop_token/intrusive_list_view.h
diff --git a/libcxx/include/__std_clang_module b/libcxx/include/__std_clang_module
new file mode 100644
index 00000000000000..61a926eb6307e8
--- /dev/null
+++ b/libcxx/include/__std_clang_module
@@ -0,0 +1,212 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// This header should not be directly included, it's exclusively to import all
+// of the libc++ public clang modules for the `std` clang module to export. In
+// other words, it's to facilitate `@import std;` in Objective-C++ and `import std`
+// in Swift to expose all of the libc++ interfaces. This is generally not
+// recommended, however there are some clients that need to import all of libc++
+// without knowing what "all" is.
+#if !__building_module(std)
+# error "Do not include this header directly, include individual headers instead"
+#endif
+
+#include <__availability>
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+#include <algorithm>
+#include <any>
+#include <array>
+#include <atomic>
+#include <bit>
+#include <bitset>
+#include <charconv>
+#include <chrono>
+#include <compare>
+#include <complex>
+#include <concepts>
+#include <condition_variable>
+#include <deque>
+#include <exception>
+#include <execution>
+#include <expected>
+#include <format>
+#include <forward_list>
+#include <functional>
+#include <initializer_list>
+#include <iosfwd>
+#include <iterator>
+#include <limits>
+#include <list>
+#include <map>
+#include <mdspan>
+#include <memory>
+#include <memory_resource>
+#include <new>
+#include <numbers>
+#include <numeric>
+#include <optional>
+#include <queue>
+#include <random>
+#include <ranges>
+#include <ratio>
+#include <scoped_allocator>
+#include <set>
+#include <source_location>
+#include <span>
+#include <stack>
+#include <stdexcept>
+#include <string>
+#include <string_view>
+#include <system_error>
+#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>
+
+#include <cassert>
+#include <ccomplex>
+#include <cctype>
+#include <cerrno>
+#include <cfenv>
+#include <cfloat>
+#include <cinttypes>
+#include <ciso646>
+#include <climits>
+#include <cmath>
+#include <csetjmp>
+#include <csignal>
+#include <cstdarg>
+#include <cstdbool>
+#include <cstddef>
+#include <cstdint>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <ctgmath>
+#include <ctime>
+#include <cuchar>
+
+#include <complex.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fenv.h>
+#include <float.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <math.h>
+#include <setjmp.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tgmath.h>
+#include <uchar.h>
+
+#ifndef _LIBCPP_HAS_NO_LOCALIZATION
+# include <codecvt>
+# ifndef _LIBCPP_HAS_NO_FILESYSTEM
+# include <fstream>
+# endif
+# include <iomanip>
+# include <ios>
+# include <iostream>
+# include <istream>
+# include <locale>
+# include <ostream>
+# include <regex>
+# include <sstream>
+# include <streambuf>
+# include <strstream>
+
+# include <clocale>
+
+# include <locale.h>
+#endif
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+# include <cwchar>
+# include <cwctype>
+
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+#ifdef _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT
+# include <print>
+#endif
+
+#ifndef _LIBCPP_CXX03_LANG
+# ifndef _LIBCPP_HAS_NO_THREADS
+# include <future>
+# include <mutex>
+# include <thread>
+# endif
+
+# include <experimental/deque>
+# include <experimental/forward_list>
+# include <experimental/iterator>
+# include <experimental/list>
+# include <experimental/map>
+# include <experimental/memory_resource>
+# include <experimental/propagate_const>
+# ifndef _LIBCPP_HAS_NO_LOCALIZATION
+# include <experimental/regex>
+# endif
+# include <experimental/set>
+# include <experimental/simd>
+# include <experimental/string>
+# include <experimental/type_traits>
+# include <experimental/unordered_map>
+# include <experimental/unordered_set>
+# include <experimental/utility>
+# include <experimental/vector>
+#endif
+
+#if _LIBCPP_STD_VER >= 14
+# ifndef _LIBCPP_HAS_NO_THREADS
+# include <shared_mutex>
+# endif
+#endif
+
+#if _LIBCPP_STD_VER >= 17
+# ifndef _LIBCPP_HAS_NO_FILESYSTEM
+# include <filesystem>
+# endif
+#endif
+
+#if _LIBCPP_STD_VER >= 20
+# include <coroutine>
+
+# ifndef _LIBCPP_HAS_NO_THREADS
+# include <barrier>
+# include <latch>
+# include <semaphore>
+# include <stop_token>
+# endif
+#endif
+
+#if _LIBCPP_STD_VER >= 23
+# ifndef _LIBCPP_HAS_NO_THREADS
+# include <stdatomic.h>
+# endif
+#endif
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 0b418d2b78974e..d1a1a98752c07c 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -627,6 +627,13 @@ module std_experimental [system] {
}
}
+// Convenience method to get all of the above modules in a single import statement.
+// Importing only the needed modules is likely to be more performant.
+module std [system] {
+ header "__std_clang_module"
+ export *
+}
+
// Implementation detail headers that are private to libc++. These modules
// must not be directly imported.
module std_private_assert [system] {
diff --git a/libcxx/test/libcxx/modules_include.gen.py b/libcxx/test/libcxx/modules_include.gen.py
index 1d55b1c4ffdc6d..b6bad1b8a104d3 100644
--- a/libcxx/test/libcxx/modules_include.gen.py
+++ b/libcxx/test/libcxx/modules_include.gen.py
@@ -44,3 +44,34 @@
#include <{header}>
""")
+
+print(f"""
+//--- __std_clang_module.compile.pass.mm
+// RUN{BLOCKLIT}: %{{cxx}} %s %{{flags}} %{{compile_flags}} -fmodules -fcxx-modules -fmodules-cache-path=%t -fsyntax-only
+
+// REQUIRES{BLOCKLIT}: modules-build
+// UNSUPPORTED{BLOCKLIT}: use_module_std
+
+// GCC doesn't support -fcxx-modules
+// UNSUPPORTED{BLOCKLIT}: gcc
+
+// The Windows headers don't appear to be compatible with modules
+// UNSUPPORTED{BLOCKLIT}: windows
+// UNSUPPORTED{BLOCKLIT}: buildhost=windows
+
+// The AIX headers don't appear to be compatible with modules
+// UNSUPPORTED{BLOCKLIT}: LIBCXX-AIX-FIXME
+
+// The Android headers don't appear to be compatible with modules yet
+// XFAIL{BLOCKLIT}: LIBCXX-ANDROID-FIXME
+
+// TODO: Investigate this failure
+// UNSUPPORTED{BLOCKLIT}: LIBCXX-FREEBSD-FIXME
+
+// Lit seems to compile this twice: once with the default flags and once with with
+// the flags specified in the RUN directive. Guard the first compile from failing.
+#if __has_feature(modules)
+ at import std;
+#endif
+
+""")
diff --git a/libcxx/utils/generate_iwyu_mapping.py b/libcxx/utils/generate_iwyu_mapping.py
index e47fed77dcb44d..343538a6cae481 100644
--- a/libcxx/utils/generate_iwyu_mapping.py
+++ b/libcxx/utils/generate_iwyu_mapping.py
@@ -77,6 +77,8 @@ def generate_map(include):
continue
elif i == "__split_buffer":
public = ["deque", "vector"]
+ elif i == "__std_clang_module":
+ continue
elif i == "__std_mbstate_t.h":
continue
elif i == "__threading_support":
More information about the libcxx-commits
mailing list