From 3fbec448b853fbe9252341ab7fc985978296e799 Mon Sep 17 00:00:00 2001 From: Ian Anderson Date: Mon, 24 Jul 2023 15:35:00 -0700 Subject: [PATCH] [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 (cherry picked from commit a800485a2deda0807cb9dc212b7d42ac916055fd) --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__std_clang_module | 212 ++++++++++++++++++++++++++++++ libcxx/include/module.modulemap.in | 7 + libcxx/test/libcxx/modules_include.gen.py | 31 +++++ libcxx/utils/generate_iwyu_mapping.py | 2 + 5 files changed, 253 insertions(+) create mode 100644 libcxx/include/__std_clang_module diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index af873fe..968ebae 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 0000000..61a926e --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +# ifndef _LIBCPP_HAS_NO_FILESYSTEM +# include +# endif +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# include + +# include +#endif + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# include +# include + +# include +# include +#endif + +#ifdef _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT +# include +#endif + +#ifndef _LIBCPP_CXX03_LANG +# ifndef _LIBCPP_HAS_NO_THREADS +# include +# include +# include +# endif + +# include +# include +# include +# include +# include +# include +# include +# ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +# endif +# include +# include +# include +# include +# include +# include +# include +# include +#endif + +#if _LIBCPP_STD_VER >= 14 +# ifndef _LIBCPP_HAS_NO_THREADS +# include +# endif +#endif + +#if _LIBCPP_STD_VER >= 17 +# ifndef _LIBCPP_HAS_NO_FILESYSTEM +# include +# endif +#endif + +#if _LIBCPP_STD_VER >= 20 +# include + +# ifndef _LIBCPP_HAS_NO_THREADS +# include +# include +# include +# include +# endif +#endif + +#if _LIBCPP_STD_VER >= 23 +# ifndef _LIBCPP_HAS_NO_THREADS +# include +# endif +#endif diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 0b418d2..d1a1a98 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 1d55b1c..b6bad1b 100644 --- a/libcxx/test/libcxx/modules_include.gen.py +++ b/libcxx/test/libcxx/modules_include.gen.py @@ -44,3 +44,34 @@ for header in public_headers: #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) +@import std; +#endif + +""") diff --git a/libcxx/utils/generate_iwyu_mapping.py b/libcxx/utils/generate_iwyu_mapping.py index e47fed7..343538a 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": -- 2.7.4