[libcxx-commits] [libcxx] 119cef4 - [libc++] Remove workarounds for systems that used to require __need_XXX macros

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Mon Nov 21 05:22:21 PST 2022


Author: Louis Dionne
Date: 2022-11-21T08:22:09-05:00
New Revision: 119cef40d18c48240854edc553dca61c4e9fdf27

URL: https://github.com/llvm/llvm-project/commit/119cef40d18c48240854edc553dca61c4e9fdf27
DIFF: https://github.com/llvm/llvm-project/commit/119cef40d18c48240854edc553dca61c4e9fdf27.diff

LOG: [libc++] Remove workarounds for systems that used to require __need_XXX macros

Libc++ tried accomodating systems that need to be able to define various
__need_FOO macros before including C library headers, however it does not
appear to be needed anymore in most cases. Indeed, glibc used to use that
system to conditionally provide definitions, however almost all instances
of these macros have been removed from glibc years ago.

I think the next step would be to also fix Clang's own builtin headers
to stop needing these macros.

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

Added: 
    

Modified: 
    libcxx/include/ext/__hash
    libcxx/include/module.modulemap.in
    libcxx/include/stdbool.h
    libcxx/include/stddef.h
    libcxx/include/stdio.h
    libcxx/include/stdlib.h
    libcxx/include/wchar.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/ext/__hash b/libcxx/include/ext/__hash
index 0e6c2cc05b529..880d0eebef490 100644
--- a/libcxx/include/ext/__hash
+++ b/libcxx/include/ext/__hash
@@ -14,6 +14,7 @@
 
 #include <__config>
 #include <cstring>
+#include <stddef.h>
 #include <string>
 
 namespace __gnu_cxx {

diff  --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 5f07d9df0a59b..bc4526b5d05d8 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -75,14 +75,12 @@ module std [system] {
       export Darwin.C.stdint
     }
     module stdio_h {
-      // <stdio.h>'s __need_* macros require textual inclusion.
-      textual header "stdio.h"
+      header "stdio.h"
       export *
       export Darwin.C.stdio
     }
     module stdlib_h {
-      // <stdlib.h>'s __need_* macros require textual inclusion.
-      textual header "stdlib.h"
+      header "stdlib.h"
       export *
     }
     module string_h {
@@ -96,8 +94,7 @@ module std [system] {
     // <time.h> provided by C library.
     module wchar_h {
       @requires_LIBCXX_ENABLE_WIDE_CHARACTERS@
-      // <wchar.h>'s __need_* macros require textual inclusion.
-      textual header "wchar.h"
+      header "wchar.h"
       export *
     }
     module wctype_h {

diff  --git a/libcxx/include/stdbool.h b/libcxx/include/stdbool.h
index 5bba00568dffc..74869b46d5614 100644
--- a/libcxx/include/stdbool.h
+++ b/libcxx/include/stdbool.h
@@ -6,6 +6,7 @@
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
+
 #ifndef _LIBCPP_STDBOOL_H
 #define _LIBCPP_STDBOOL_H
 

diff  --git a/libcxx/include/stddef.h b/libcxx/include/stddef.h
index f1725db062125..e97100b2f8c39 100644
--- a/libcxx/include/stddef.h
+++ b/libcxx/include/stddef.h
@@ -7,16 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if defined(__need_ptr
diff _t) || defined(__need_size_t) || \
-    defined(__need_wchar_t) || defined(__need_NULL) || defined(__need_wint_t)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#  pragma GCC system_header
-#endif
-
-#include_next <stddef.h>
-
-#elif !defined(_LIBCPP_STDDEF_H)
+#ifndef _LIBCPP_STDDEF_H
 #define _LIBCPP_STDDEF_H
 
 /*
@@ -42,9 +33,38 @@
 #  pragma GCC system_header
 #endif
 
-#  if __has_include_next(<stddef.h>)
-#    include_next <stddef.h>
+#if __has_include_next(<stddef.h>)
+    // The Clang builtin headers only define the types we need when we request it explicitly.
+    // TODO: We should fix that in Clang and drop these defines.
+#  ifndef __need_ptr
diff _t
+#    define __need_ptr
diff _t
+#  endif
+#  ifndef __need_size_t
+#    define __need_size_t
 #  endif
+#  ifndef __need_wchar_t
+#    define __need_wchar_t
+#  endif
+#  ifndef __need_NULL
+#    define __need_NULL
+#  endif
+#  ifndef __need_STDDEF_H_misc
+#    define __need_STDDEF_H_misc
+#  endif
+
+#  include_next <stddef.h>
+
+    // Now re-include the header without requesting any specific types, so as to get
+    // any other remaining types from stddef.h. This can all go away once the Clang
+    // buitin headers stop using these macros.
+#  undef __need_ptr
diff _t
+#  undef __need_size_t
+#  undef __need_wchar_t
+#  undef __need_NULL
+#  undef __need_STDDEF_H_misc
+
+#  include_next <stddef.h>
+#endif
 
 #ifdef __cplusplus
     typedef decltype(nullptr) nullptr_t;

diff  --git a/libcxx/include/stdio.h b/libcxx/include/stdio.h
index cea43aa7680bc..4ca40df2b5269 100644
--- a/libcxx/include/stdio.h
+++ b/libcxx/include/stdio.h
@@ -7,15 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if defined(__need_FILE) || defined(__need___FILE)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#  pragma GCC system_header
-#endif
-
-#include_next <stdio.h>
-
-#elif !defined(_LIBCPP_STDIO_H)
+#ifndef _LIBCPP_STDIO_H
 #define _LIBCPP_STDIO_H
 
 /*

diff  --git a/libcxx/include/stdlib.h b/libcxx/include/stdlib.h
index 64581b67f245f..1c990c162956c 100644
--- a/libcxx/include/stdlib.h
+++ b/libcxx/include/stdlib.h
@@ -7,15 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if defined(__need_malloc_and_calloc)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#  pragma GCC system_header
-#endif
-
-#include_next <stdlib.h>
-
-#elif !defined(_LIBCPP_STDLIB_H)
+#ifndef _LIBCPP_STDLIB_H
 #define _LIBCPP_STDLIB_H
 
 /*

diff  --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h
index c684508dc2ccd..d34ed4d3a1cf2 100644
--- a/libcxx/include/wchar.h
+++ b/libcxx/include/wchar.h
@@ -7,15 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if defined(__need_wint_t) || defined(__need_mbstate_t)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#  pragma GCC system_header
-#endif
-
-#include_next <wchar.h>
-
-#elif !defined(_LIBCPP_WCHAR_H)
+#ifndef _LIBCPP_WCHAR_H
 #define _LIBCPP_WCHAR_H
 
 /*


        


More information about the libcxx-commits mailing list