[clang] Ensure proper NULL macro definition for system include files. (PR #149176)

2025-07-23 Thread Jamie Schmeiser via cfe-commits

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)

2025-07-21 Thread Aaron Ballman via cfe-commits


@@ -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)

2025-07-21 Thread Aaron Ballman via cfe-commits

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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits

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)

2025-07-17 Thread Eli Friedman via cfe-commits

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)

2025-07-17 Thread Eli Friedman via cfe-commits


@@ -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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits

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)

2025-07-17 Thread Hubert Tong via cfe-commits

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)

2025-07-17 Thread Hubert Tong via cfe-commits


@@ -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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits


@@ -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)

2025-07-17 Thread Eli Friedman via cfe-commits

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)

2025-07-17 Thread Eli Friedman via cfe-commits


@@ -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)

2025-07-17 Thread Eli Friedman via cfe-commits

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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits

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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits


@@ -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)

2025-07-17 Thread Jamie Schmeiser via cfe-commits

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)

2025-07-16 Thread Hubert Tong via cfe-commits


@@ -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)

2025-07-16 Thread via cfe-commits

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)

2025-07-16 Thread via cfe-commits

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)

2025-07-16 Thread Jamie Schmeiser via cfe-commits

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
+