[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
jamieschmeiser wrote: > I think it makes sense for Clang to handle the C Standard Library headers > which can introduce `NULL`, but I'm surprised to see us adding new headers > like `dbm.h`, the `sys` directory, and `unistd,h`. These other headers define NULL to 0 on AIX and are included through the system include paths. Note that they are guarded to only deal with NULL on AIX and just include_next on other platforms. > Why is the pattern to define `NULL`, include_next the header the user asked > for, and then define `NULL` again? Are the include_next headers defining > `NULL` to something different? And if so, what are we potentially breaking by > redefining it out from under them? (The following relates to AIX, I do not know what happens on other platforms...) Yes, some of the include_next headers are defining NULL to 0, hence the pattern. The definitions are typically guarded such that NULL is not defined if it is already defined. Therefore, it is necessary to force the expected macro before the include_next to ensure that a potentially existing definition is not retained nor a definition of NULL to 0 introduced. The include_next file will now not define the macro since it is already defined but there are ways that the processing of the included files could be unexpected (eg, a header could be replaced) so NULL is forced to the expected definition again after the include_next is processed. Yes, this pattern can potentially break code if the user has defined NULL to something unexpected before including the header but unfortunately, NULL is not a special identifier. The proposed pattern attempts to ensure that the definition is at least consistent within the expected processing of system header files (and after) for those headers that define NULL. There really isn't much more the compiler can do to maintain consistency of the macro and the pattern should provide the correct macro definitions for the overwhelming majority of users. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -0,0 +1,24 @@ +/*=== dbm.h - BSD header for database management --===*\ + * + * 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 + * +\*===--===*/ + +#if !defined(_AIX) + +#include_next + +#else + +#define __need_NULL +#include + +#include_next + +/* Ensure that the definition of NULL is as expected. */ +#define __need_NULL +#include AaronBallman wrote: Why is the pattern to define `NULL`, include_next the header the user asked for, and then define `NULL` again? Are the include_next headers defining `NULL` to something different? And if so, what are we potentially breaking by redefining it out from under them? https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
AaronBallman wrote: > In other words, part of the motivation of this PR is to address a general > issue where Clang fails to cover the set of headers that it ought to. I think it makes sense for Clang to handle the C Standard Library headers which can introduce `NULL`, but I'm surprised to see us adding new headers like `dbm.h`, the `sys` directory, and `unistd,h`. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
jamieschmeiser wrote: > > are you saying that you have a strong preference to not handle locale.h > > (for example) for non-AIX environments? > > Yes. > > You know exactly which AIX headers define NULL, and because IBM also ships > the AIX headers, you can ensure no future version of the headers changes the > status quo. But there are a lot of different libc variants, and I don't want > to try to chase after every variant, and figure out exactly which headers > define NULL, or how we accidentally broke something. Messing with core libc > headers is fundamentally risky. > > Most libcs don't make the mistake of defining null to plain "0" on 64-bit > systems, anyway. > > One more issue: do we need to update module.modulemap to mark these headers > as "textual"? I had proposed this universally as a "public service" due to it being mandated by the C standard. Since you are opposed, I will alter the files involved to be guarded as Aix specific. Regarding module.modulemap, since this will now be Aix specific, we will deal with that aspect at some future point. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
efriedma-quic wrote: > are you saying that you have a strong preference to not handle locale.h (for > example) for non-AIX environments? Yes. You know exactly which AIX headers define NULL, and because IBM also ships the AIX headers, you can ensure no future version of the headers changes the status quo. But there are a lot of different libc variants, and I don't want to try to chase after every variant, and figure out exactly which headers define NULL, or how we accidentally broke something. Messing with core libc headers is fundamentally risky. Most libcs don't make the mistake of defining null to plain "0" on 64-bit systems, anyway. --- One more issue: do we need to update module.modulemap to mark these headers as "textual"? https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -0,0 +1,15 @@ +// There are at least 2 valid C null-pointer constants as defined +// by the C language standard. +// Test that the macro NULL is defined consistently for all platforms by +// those headers that the C standard mandates a macro definition for NULL. + +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s efriedma-quic wrote: The statement "Clang assumes the host triple" is an approximation. clang's default target is specified by the LLVM_DEFAULT_TARGET_TRIPLE CMake flag. By default, that's the host triple, but you can override it. If you need some specific set of "libc" headers, you can mock them in clang/test/Headers/Inputs/ . https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
jamieschmeiser wrote: > What logic did you use to decide which headers should use `#idfdef _AIX`? The headers that exist on AIX that define NULL but are not mandated by the C standard to define NULL are guarded with `#ifdef _AIX`. See previous comment: > For those non-mandated system headers that also define it on Aix, it is > conditionally forced. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
hubert-reinterpretcast wrote: > I'm not going to argue very hard about it, but I don't really want to > entangle every other operating system in this. The current situation is > mostly stable. @efriedma-quic, are you saying that you have a strong preference to not handle `locale.h` (for example) for non-AIX environments? `locale.h` is expected to define `NULL` via some mechanism on every platform. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -0,0 +1,15 @@ +// There are at least 2 valid C null-pointer constants as defined +// by the C language standard. +// Test that the macro NULL is defined consistently for all platforms by +// those headers that the C standard mandates a macro definition for NULL. + +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s hubert-reinterpretcast wrote: > There is no target specified so it will not be cross-compiling. It's entirely possible to create a cross-compiling build where the architecture is the same but the OS is different. Using ``` %clang_cc1 -x c++ -internal-isystem %S/Inputs/include ``` instead of `%clang` seems like part of the solution. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -0,0 +1,15 @@ +// There are at least 2 valid C null-pointer constants as defined +// by the C language standard. +// Test that the macro NULL is defined consistently for all platforms by +// those headers that the C standard mandates a macro definition for NULL. + +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s jamieschmeiser wrote: How can that happen? According to https://clang.llvm.org/docs/CrossCompilation.html: `If you don’t specify the target, CPU names won’t match (since Clang assumes the host triple), and the compilation will go ahead, creating code for the host platform`. There is no target specified so it will not be cross-compiling. Is there something that you would suggest to alleviate your concerns? https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
https://github.com/efriedma-quic commented: I guess... if you think this is what's best for AIX, I'm not going to argue very hard about it, but I don't really want to entangle every other operating system in this. The current situation is mostly stable. What logic did you use to decide which headers should use `#idfdef _AIX`? https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -0,0 +1,15 @@ +// There are at least 2 valid C null-pointer constants as defined +// by the C language standard. +// Test that the macro NULL is defined consistently for all platforms by +// those headers that the C standard mandates a macro definition for NULL. + +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s +// RUN: %clang %s -Dheader="" -E | tail -1 | FileCheck %s efriedma-quic wrote: This is assuming that the default search path for clang will find system headers. This isn't really a safe assumption if the default triple is a cross-compile triple. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
https://github.com/efriedma-quic edited https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
jamieschmeiser wrote: > This seems like a very complicated solution. > > If the AIX system headers want to define NULL, should we just let them? Just > `#include_next ` to ensure clang's stddef.h doesn't define NULL in > an inconsistent way. Just doing an `#include_next ` is a dangerous solution. For C, at least, the clang header `__stddef_null.h` makes it very clear that the expected definition of NULL is ((void*)0). However, if one just lets the platform decide on the definition of NULL, which the standard indicates can be 0 or ((void*)0), there can be unexpected consequences should 0 be chosen. On AIX in 64 bit mode, and I suspect on other platforms, an int is 4 bytes long while a pointer is 8 bytes long, which could lead to subtle bugs (eg sizeof(NULL) or _Alignof(NULL) may be different for int and void* on some platforms). There may be an implicit understanding within the compiler that the C null pointer constant will be type void* (I'm not saying there is, and I hope there isn't) which may be problematic for those platforms using 0. It is safer to enforce what the compiler is expecting. It may also aid in portability of code across platforms. The standard mandates that certain headers define NULL but what if the `#include_next` defines it as 0 and uses it somehow before returning? Then there is inconsistency within the header. I force the clang definition before the `#include_next` to try to ensure as much consistency as possible since it is reasonable to hope that the definition of NULL is guarded since many headers are mandated to define it but there is only so much one can do... Afterwards, it is again forced in case it was changed. This is done universally for those files that are mandated to define NULL. For those non-mandated system headers that also define it on Aix, it is conditionally forced. I would suggest other platforms to do similarly. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -39,6 +39,25 @@ set(core_files varargs.h ) +set(aix_wrapper_files + dbm.h + stdio.h + stdlib.h + string.h + time.h + unistd.h + wchar.h + ) jamieschmeiser wrote: Thanks @hubert-reinterpretcast, good catch. I will add it in. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
https://github.com/jamieschmeiser updated
https://github.com/llvm/llvm-project/pull/149176
>From e50062b48a09bd6e077b86bdeed65c7c1abb2ebe Mon Sep 17 00:00:00 2001
From: Jamie Schmeiser
Date: Wed, 16 Jul 2025 15:40:09 -0400
Subject: [PATCH] Ensure proper NULL macro definition for system include files.
The C standard allows for at least 2 valid definitions of a null pointer
constant and mandates that several standard headers files define the macro
NULL to be a null pointer constant. Ensure that definitions of NULL are
consistent across the various C header files.
respond to review: add in locale.h
---
clang/lib/Headers/CMakeLists.txt| 38
clang/lib/Headers/dbm.h | 39 +
clang/lib/Headers/locale.h | 25 ++
clang/lib/Headers/stdio.h | 25 ++
clang/lib/Headers/stdlib.h | 25 ++
clang/lib/Headers/string.h | 25 ++
clang/lib/Headers/sys/dir.h | 38
clang/lib/Headers/sys/param.h | 38
clang/lib/Headers/sys/types.h | 38
clang/lib/Headers/time.h| 25 ++
clang/lib/Headers/unistd.h | 35 ++
clang/lib/Headers/wchar.h | 25 ++
clang/test/Headers/check-NULL-aix.c | 16
clang/test/Headers/check-NULL.c | 15 +++
14 files changed, 407 insertions(+)
create mode 100644 clang/lib/Headers/dbm.h
create mode 100644 clang/lib/Headers/locale.h
create mode 100644 clang/lib/Headers/stdio.h
create mode 100644 clang/lib/Headers/stdlib.h
create mode 100644 clang/lib/Headers/string.h
create mode 100644 clang/lib/Headers/sys/dir.h
create mode 100644 clang/lib/Headers/sys/param.h
create mode 100644 clang/lib/Headers/sys/types.h
create mode 100644 clang/lib/Headers/time.h
create mode 100644 clang/lib/Headers/unistd.h
create mode 100644 clang/lib/Headers/wchar.h
create mode 100644 clang/test/Headers/check-NULL-aix.c
create mode 100644 clang/test/Headers/check-NULL.c
diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
index dd52498bbef4c..6c238c2e8aee9 100644
--- a/clang/lib/Headers/CMakeLists.txt
+++ b/clang/lib/Headers/CMakeLists.txt
@@ -39,6 +39,26 @@ set(core_files
varargs.h
)
+set(aix_wrapper_files
+ dbm.h
+ locale.h
+ stdio.h
+ stdlib.h
+ string.h
+ time.h
+ unistd.h
+ wchar.h
+ )
+set(aix_sys_subdir_wrapper_files
+ sys/dir.h
+ sys/param.h
+ sys/types.h
+ )
+set(aix_files
+ ${aix_wrapper_files}
+ ${aix_sys_subdir_wrapper_files}
+ )
+
set(arm_common_files
# Headers shared by Arm and AArch64
arm_acle.h
@@ -312,6 +332,7 @@ set(utility_files
set(files
${core_files}
+ ${aix_files}
${arm_common_files}
${arm_only_files}
${aarch64_only_files}
@@ -529,6 +550,7 @@ set_target_properties("clang-resource-headers" PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${output_dir}")
add_dependencies("clang-resource-headers"
"core-resource-headers"
+"aix-resource-headers"
"arm-common-resource-headers"
"arm-resource-headers"
"aarch64-resource-headers"
@@ -557,6 +579,7 @@ add_header_target("core-resource-headers" ${core_files})
add_header_target("arm-common-resource-headers"
"${arm_common_files};${arm_common_generated_files}")
# Architecture/platform specific targets
+add_header_target("aix-resource-headers" "${aix_files}")
add_header_target("arm-resource-headers"
"${arm_only_files};${arm_only_generated_files}")
add_header_target("aarch64-resource-headers"
"${aarch64_only_files};${aarch64_only_generated_files}")
add_header_target("cuda-resource-headers"
"${cuda_files};${cuda_wrapper_files};${cuda_wrapper_bits_files};${cuda_wrapper_utility_files}")
@@ -644,6 +667,18 @@ install(
EXCLUDE_FROM_ALL
COMPONENT core-resource-headers)
+install(
+ FILES ${aix_wrapper_files}
+ DESTINATION ${header_install_dir}
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
+install(
+ FILES ${aix_sys_subdir_wrapper_files}
+ DESTINATION ${header_install_dir}/sys
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
install(
FILES ${arm_common_files} ${arm_common_generated_files}
DESTINATION ${header_install_dir}
@@ -837,6 +872,9 @@ if (NOT LLVM_ENABLE_IDE)
add_llvm_install_targets(install-core-resource-headers
DEPENDS core-resource-headers
COMPONENT core-resource-headers)
+ add_llvm_install_targets(install-aix-resource-headers
+ DEPENDS aix-resource-headers
+ COMPONENT aix-resource-headers)
add_llvm_install_targets(install-arm-common-resource-headers
DEPENDS arm-common-resource-headers
COMPONENT arm-common-resource
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
@@ -39,6 +39,25 @@ set(core_files varargs.h ) +set(aix_wrapper_files + dbm.h + stdio.h + stdlib.h + string.h + time.h + unistd.h + wchar.h + ) hubert-reinterpretcast wrote: At least `locale.h` was also affected. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
github-actions[bot] wrote: ⚠️ We detected that you are using a GitHub private e-mail address to contribute to the repo. Please turn off [Keep my email addresses private](https://github.com/settings/emails) setting in your account. See [LLVM Developer Policy](https://llvm.org/docs/DeveloperPolicy.html#email-addresses) and [LLVM Discourse](https://discourse.llvm.org/t/hidden-emails-on-github-should-we-do-something-about-it) for more information. https://github.com/llvm/llvm-project/pull/149176 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
llvmbot wrote:
@llvm/pr-subscribers-backend-x86
Author: Jamie Schmeiser (jamieschmeiser)
Changes
The C standard allows for at least 2 valid definitions of a null pointer
constant and mandates that several standard headers files define the macro NULL
to be a null pointer constant. Ensure that definitions of NULL are consistent
across the various C header files.
---
Patch is 20.22 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/149176.diff
14 Files Affected:
- (modified) clang/lib/Headers/CMakeLists.txt (+37)
- (added) clang/lib/Headers/dbm.h (+39)
- (added) clang/lib/Headers/locale.h (+25)
- (added) clang/lib/Headers/stdio.h (+25)
- (added) clang/lib/Headers/stdlib.h (+25)
- (added) clang/lib/Headers/string.h (+25)
- (added) clang/lib/Headers/sys/dir.h (+38)
- (added) clang/lib/Headers/sys/param.h (+38)
- (added) clang/lib/Headers/sys/types.h (+38)
- (added) clang/lib/Headers/time.h (+25)
- (added) clang/lib/Headers/unistd.h (+35)
- (added) clang/lib/Headers/wchar.h (+25)
- (added) clang/test/Headers/check-NULL-aix.c (+16)
- (added) clang/test/Headers/check-NULL.c (+15)
``diff
diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
index dd52498bbef4c..f1c10595ea38e 100644
--- a/clang/lib/Headers/CMakeLists.txt
+++ b/clang/lib/Headers/CMakeLists.txt
@@ -39,6 +39,25 @@ set(core_files
varargs.h
)
+set(aix_wrapper_files
+ dbm.h
+ stdio.h
+ stdlib.h
+ string.h
+ time.h
+ unistd.h
+ wchar.h
+ )
+set(aix_sys_subdir_wrapper_files
+ sys/dir.h
+ sys/param.h
+ sys/types.h
+ )
+set(aix_files
+ ${aix_wrapper_files}
+ ${aix_sys_subdir_wrapper_files}
+ )
+
set(arm_common_files
# Headers shared by Arm and AArch64
arm_acle.h
@@ -312,6 +331,7 @@ set(utility_files
set(files
${core_files}
+ ${aix_files}
${arm_common_files}
${arm_only_files}
${aarch64_only_files}
@@ -529,6 +549,7 @@ set_target_properties("clang-resource-headers" PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${output_dir}")
add_dependencies("clang-resource-headers"
"core-resource-headers"
+"aix-resource-headers"
"arm-common-resource-headers"
"arm-resource-headers"
"aarch64-resource-headers"
@@ -557,6 +578,7 @@ add_header_target("core-resource-headers" ${core_files})
add_header_target("arm-common-resource-headers"
"${arm_common_files};${arm_common_generated_files}")
# Architecture/platform specific targets
+add_header_target("aix-resource-headers" "${aix_files}")
add_header_target("arm-resource-headers"
"${arm_only_files};${arm_only_generated_files}")
add_header_target("aarch64-resource-headers"
"${aarch64_only_files};${aarch64_only_generated_files}")
add_header_target("cuda-resource-headers"
"${cuda_files};${cuda_wrapper_files};${cuda_wrapper_bits_files};${cuda_wrapper_utility_files}")
@@ -644,6 +666,18 @@ install(
EXCLUDE_FROM_ALL
COMPONENT core-resource-headers)
+install(
+ FILES ${aix_wrapper_files}
+ DESTINATION ${header_install_dir}
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
+install(
+ FILES ${aix_sys_subdir_wrapper_files}
+ DESTINATION ${header_install_dir}/sys
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
install(
FILES ${arm_common_files} ${arm_common_generated_files}
DESTINATION ${header_install_dir}
@@ -837,6 +871,9 @@ if (NOT LLVM_ENABLE_IDE)
add_llvm_install_targets(install-core-resource-headers
DEPENDS core-resource-headers
COMPONENT core-resource-headers)
+ add_llvm_install_targets(install-aix-resource-headers
+ DEPENDS aix-resource-headers
+ COMPONENT aix-resource-headers)
add_llvm_install_targets(install-arm-common-resource-headers
DEPENDS arm-common-resource-headers
COMPONENT arm-common-resource-headers)
diff --git a/clang/lib/Headers/dbm.h b/clang/lib/Headers/dbm.h
new file mode 100644
index 0..8b7e2f51c5664
--- /dev/null
+++ b/clang/lib/Headers/dbm.h
@@ -0,0 +1,39 @@
+/*=== dbm.h - BSD header for database management
--===*\
+ *
+ * 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
+ *
+\*===--===*/
+
+// Although technically correct according to the standard, NULL defined as 0
+// may be problematic since it may result in a different size object than a
+// pointer (eg 64 bit mode on AIX). Therefore, re-define the macro to
+// ((void*)0) for consistency where needed.
+
+// Limit the effects to those platforms that have this as a system header.
+#if defined(_AIX)
+
+// Ensure that the definition of NULL (if present) is correct since
[clang] Ensure proper NULL macro definition for system include files. (PR #149176)
https://github.com/jamieschmeiser created
https://github.com/llvm/llvm-project/pull/149176
The C standard allows for at least 2 valid definitions of a null pointer
constant and mandates that several standard headers files define the macro NULL
to be a null pointer constant. Ensure that definitions of NULL are consistent
across the various C header files.
>From de5058054d3dd7deaaf218b6b354f79dbeaf29d6 Mon Sep 17 00:00:00 2001
From: Jamie Schmeiser
Date: Wed, 16 Jul 2025 15:40:09 -0400
Subject: [PATCH] Ensure proper NULL macro definition for system include files.
The C standard allows for at least 2 valid definitions of a null pointer
constant and mandates that several standard headers files define the macro
NULL to be a null pointer constant. Ensure that definitions of NULL are
consistent across the various C header files.
---
clang/lib/Headers/CMakeLists.txt| 37 +++
clang/lib/Headers/dbm.h | 39 +
clang/lib/Headers/locale.h | 25 ++
clang/lib/Headers/stdio.h | 25 ++
clang/lib/Headers/stdlib.h | 25 ++
clang/lib/Headers/string.h | 25 ++
clang/lib/Headers/sys/dir.h | 38
clang/lib/Headers/sys/param.h | 38
clang/lib/Headers/sys/types.h | 38
clang/lib/Headers/time.h| 25 ++
clang/lib/Headers/unistd.h | 35 ++
clang/lib/Headers/wchar.h | 25 ++
clang/test/Headers/check-NULL-aix.c | 16
clang/test/Headers/check-NULL.c | 15 +++
14 files changed, 406 insertions(+)
create mode 100644 clang/lib/Headers/dbm.h
create mode 100644 clang/lib/Headers/locale.h
create mode 100644 clang/lib/Headers/stdio.h
create mode 100644 clang/lib/Headers/stdlib.h
create mode 100644 clang/lib/Headers/string.h
create mode 100644 clang/lib/Headers/sys/dir.h
create mode 100644 clang/lib/Headers/sys/param.h
create mode 100644 clang/lib/Headers/sys/types.h
create mode 100644 clang/lib/Headers/time.h
create mode 100644 clang/lib/Headers/unistd.h
create mode 100644 clang/lib/Headers/wchar.h
create mode 100644 clang/test/Headers/check-NULL-aix.c
create mode 100644 clang/test/Headers/check-NULL.c
diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
index dd52498bbef4c..f1c10595ea38e 100644
--- a/clang/lib/Headers/CMakeLists.txt
+++ b/clang/lib/Headers/CMakeLists.txt
@@ -39,6 +39,25 @@ set(core_files
varargs.h
)
+set(aix_wrapper_files
+ dbm.h
+ stdio.h
+ stdlib.h
+ string.h
+ time.h
+ unistd.h
+ wchar.h
+ )
+set(aix_sys_subdir_wrapper_files
+ sys/dir.h
+ sys/param.h
+ sys/types.h
+ )
+set(aix_files
+ ${aix_wrapper_files}
+ ${aix_sys_subdir_wrapper_files}
+ )
+
set(arm_common_files
# Headers shared by Arm and AArch64
arm_acle.h
@@ -312,6 +331,7 @@ set(utility_files
set(files
${core_files}
+ ${aix_files}
${arm_common_files}
${arm_only_files}
${aarch64_only_files}
@@ -529,6 +549,7 @@ set_target_properties("clang-resource-headers" PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${output_dir}")
add_dependencies("clang-resource-headers"
"core-resource-headers"
+"aix-resource-headers"
"arm-common-resource-headers"
"arm-resource-headers"
"aarch64-resource-headers"
@@ -557,6 +578,7 @@ add_header_target("core-resource-headers" ${core_files})
add_header_target("arm-common-resource-headers"
"${arm_common_files};${arm_common_generated_files}")
# Architecture/platform specific targets
+add_header_target("aix-resource-headers" "${aix_files}")
add_header_target("arm-resource-headers"
"${arm_only_files};${arm_only_generated_files}")
add_header_target("aarch64-resource-headers"
"${aarch64_only_files};${aarch64_only_generated_files}")
add_header_target("cuda-resource-headers"
"${cuda_files};${cuda_wrapper_files};${cuda_wrapper_bits_files};${cuda_wrapper_utility_files}")
@@ -644,6 +666,18 @@ install(
EXCLUDE_FROM_ALL
COMPONENT core-resource-headers)
+install(
+ FILES ${aix_wrapper_files}
+ DESTINATION ${header_install_dir}
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
+install(
+ FILES ${aix_sys_subdir_wrapper_files}
+ DESTINATION ${header_install_dir}/sys
+ EXCLUDE_FROM_ALL
+ COMPONENT aix-resource-headers)
+
install(
FILES ${arm_common_files} ${arm_common_generated_files}
DESTINATION ${header_install_dir}
@@ -837,6 +871,9 @@ if (NOT LLVM_ENABLE_IDE)
add_llvm_install_targets(install-core-resource-headers
DEPENDS core-resource-headers
COMPONENT core-resource-headers)
+ add_llvm_install_targets(install-aix-resource-headers
+ DEPENDS aix-resource-headers
+
