[compiler-rt] [sanitizer_common] Implement address sanitizer on AIX: platform specific support (PR #131866)
Jake Egan via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 15 16:49:43 PDT 2025
https://github.com/jakeegan updated https://github.com/llvm/llvm-project/pull/131866
>From 79a21096e8ae08df680b072c605b44b7e33fda9e Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 15 Jul 2025 14:48:35 -0400
Subject: [PATCH 1/4] Address comments
---
compiler-rt/cmake/base-config-ix.cmake | 6 +-
.../lib/sanitizer_common/sanitizer_errno.h | 2 +
.../lib/sanitizer_common/sanitizer_platform.h | 10 ++-
.../sanitizer_platform_limits_posix.cpp | 70 ++++++++++++------
.../sanitizer_platform_limits_posix.h | 72 +++++++++++++------
.../lib/sanitizer_common/sanitizer_posix.cpp | 2 +-
6 files changed, 115 insertions(+), 47 deletions(-)
diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake
index d92bc0e71fa1a..953fa3983ecfc 100644
--- a/compiler-rt/cmake/base-config-ix.cmake
+++ b/compiler-rt/cmake/base-config-ix.cmake
@@ -14,7 +14,11 @@ include(CompilerRTDarwinUtils)
check_include_file(unwind.h HAVE_UNWIND_H)
# Used by sanitizer_common and tests.
-check_include_file(rpc/xdr.h HAVE_RPC_XDR_H)
+if (${CMAKE_SYSTEM_NAME} MATCHES AIX)
+ check_include_file(tirpc/rpc/xdr.h HAVE_RPC_XDR_H)
+else()
+ check_include_file(rpc/xdr.h HAVE_RPC_XDR_H)
+endif()
if (NOT HAVE_RPC_XDR_H)
set(HAVE_RPC_XDR_H 0)
endif()
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_errno.h b/compiler-rt/lib/sanitizer_common/sanitizer_errno.h
index 76919da57d942..0d2a9307cde6f 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_errno.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_errno.h
@@ -31,6 +31,8 @@
# define __errno_location _errno
#elif SANITIZER_HAIKU
# define __errno_location _errnop
+#elif SANITIZER_AIX
+# define __errno_location _Errno
#endif
extern "C" int *__errno_location();
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
index 196c0a988478e..8f1a7986b16cf 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
@@ -15,7 +15,7 @@
#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
!defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) && \
!(defined(__sun__) && defined(__svr4__)) && !defined(__HAIKU__) && \
- !defined(__wasi__)
+ !defined(__wasi__) && !defined(_AIX)
# error "This operating system is not supported"
#endif
@@ -32,6 +32,12 @@
# define SANITIZER_LINUX 0
#endif
+#if defined(_AIX)
+# define SANITIZER_AIX 1
+#else
+# define SANITIZER_AIX 0
+#endif
+
#if defined(__GLIBC__)
# define SANITIZER_GLIBC 1
#else
@@ -151,7 +157,7 @@
#define SANITIZER_POSIX \
(SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
- SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU)
+ SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU || SANITIZER_AIX)
#if __LP64__ || defined(_WIN64)
# define SANITIZER_WORDSIZE 64
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 7a89bf1c74985..033c0405cff24 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -24,7 +24,7 @@
// Must go after undef _FILE_OFFSET_BITS.
#include "sanitizer_platform.h"
-#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
+#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
// Must go after undef _FILE_OFFSET_BITS.
#include "sanitizer_glibc_version.h"
@@ -61,7 +61,7 @@
#endif
#if !SANITIZER_ANDROID
-#if !SANITIZER_HAIKU
+#if !SANITIZER_HAIKU && !SANITIZER_AIX
#include <sys/mount.h>
#endif
#include <sys/timeb.h>
@@ -112,11 +112,15 @@ typedef struct user_fpregs elf_fpregset_t;
#endif
#if !SANITIZER_ANDROID
-#include <ifaddrs.h>
-#if !SANITIZER_HAIKU
-#include <sys/ucontext.h>
-#include <wordexp.h>
-#endif
+# if !SANITIZER_AIX
+# include <ifaddrs.h>
+# else
+# include <netinet/in.h>
+# endif
+# if !SANITIZER_HAIKU
+# include <sys/ucontext.h>
+# include <wordexp.h>
+# endif
#endif
#if SANITIZER_LINUX
@@ -182,6 +186,17 @@ typedef struct user_fpregs elf_fpregset_t;
#include <sys/ioctl.h>
#endif
+# if SANITIZER_AIX
+# include <netinet/ip_mroute.h>
+# include <stropts.h>
+# include <sys/ioctl.h>
+# include <sys/statfs.h>
+# include <unistd.h>
+# if HAVE_RPC_XDR_H
+# include <tirpc/rpc/xdr.h>
+# endif
+# endif
+
// Include these after system headers to avoid name clashes and ambiguities.
# include "sanitizer_common.h"
# include "sanitizer_internal_defs.h"
@@ -557,13 +572,20 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
const unsigned IOCTL_NOT_PRESENT = 0;
- unsigned IOCTL_FIONBIO = FIONBIO;
+ // On AIX, some variables are unsigned long types.
+#if SANITIZER_AIX
+ using ioctl_alttype = uptr;
+#else
+ using ioctl_alttype = unsigned;
+#endif
+
+ ioctl_alttype IOCTL_FIONBIO = FIONBIO;
#if !SANITIZER_HAIKU
- unsigned IOCTL_FIOASYNC = FIOASYNC;
+ ioctl_alttype IOCTL_FIOASYNC = FIOASYNC;
unsigned IOCTL_FIOCLEX = FIOCLEX;
unsigned IOCTL_FIOGETOWN = FIOGETOWN;
unsigned IOCTL_FIONCLEX = FIONCLEX;
- unsigned IOCTL_FIOSETOWN = FIOSETOWN;
+ ioctl_alttype IOCTL_FIOSETOWN = FIOSETOWN;
#endif
unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
unsigned IOCTL_SIOCATMARK = SIOCATMARK;
@@ -584,29 +606,31 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;
unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
- unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
+ ioctl_alttype IOCTL_SIOCSPGRP = SIOCSPGRP;
#if !SANITIZER_HAIKU
- unsigned IOCTL_TIOCCONS = TIOCCONS;
+ ioctl_alttype IOCTL_TIOCCONS = TIOCCONS;
unsigned IOCTL_TIOCGETD = TIOCGETD;
unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
- unsigned IOCTL_TIOCPKT = TIOCPKT;
- unsigned IOCTL_TIOCSETD = TIOCSETD;
- unsigned IOCTL_TIOCSTI = TIOCSTI;
+ ioctl_alttype IOCTL_TIOCPKT = TIOCPKT;
+ ioctl_alttype IOCTL_TIOCSETD = TIOCSETD;
+ ioctl_alttype IOCTL_TIOCSTI = TIOCSTI;
#endif
unsigned IOCTL_TIOCEXCL = TIOCEXCL;
unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
- unsigned IOCTL_TIOCMBIC = TIOCMBIC;
- unsigned IOCTL_TIOCMBIS = TIOCMBIS;
+ ioctl_alttype IOCTL_TIOCMBIC = TIOCMBIC;
+ ioctl_alttype IOCTL_TIOCMBIS = TIOCMBIS;
unsigned IOCTL_TIOCMGET = TIOCMGET;
- unsigned IOCTL_TIOCMSET = TIOCMSET;
+ ioctl_alttype IOCTL_TIOCMSET = TIOCMSET;
unsigned IOCTL_TIOCNXCL = TIOCNXCL;
unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
+# if !SANITIZER_AIX
unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
- unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
- unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
+# endif
+ ioctl_alttype IOCTL_TIOCSPGRP = TIOCSPGRP;
+ ioctl_alttype IOCTL_TIOCSWINSZ = TIOCSWINSZ;
#if SANITIZER_LINUX && !SANITIZER_ANDROID
unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
@@ -1115,6 +1139,8 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
CHECK_SIZE_AND_OFFSET(dirent, d_ino);
#if SANITIZER_APPLE
CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
+#elif SANITIZER_AIX
+CHECK_SIZE_AND_OFFSET(dirent, d_offset);
#elif SANITIZER_FREEBSD || SANITIZER_HAIKU
// There is no 'd_off' field on FreeBSD.
#else
@@ -1205,8 +1231,10 @@ CHECK_SIZE_AND_OFFSET(tm, tm_year);
CHECK_SIZE_AND_OFFSET(tm, tm_wday);
CHECK_SIZE_AND_OFFSET(tm, tm_yday);
CHECK_SIZE_AND_OFFSET(tm, tm_isdst);
+# if !SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(tm, tm_gmtoff);
CHECK_SIZE_AND_OFFSET(tm, tm_zone);
+# endif
#if SANITIZER_LINUX
CHECK_TYPE_SIZE(mntent);
@@ -1258,7 +1286,7 @@ CHECK_TYPE_SIZE(clock_t);
CHECK_TYPE_SIZE(clockid_t);
#endif
-#if !SANITIZER_ANDROID && !SANITIZER_HAIKU
+#if !SANITIZER_ANDROID && !SANITIZER_HAIKU && !SANITIZER_AIX
CHECK_TYPE_SIZE(ifaddrs);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index a2b6c37d5450c..619b787198afa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -14,7 +14,7 @@
#ifndef SANITIZER_PLATFORM_LIMITS_POSIX_H
#define SANITIZER_PLATFORM_LIMITS_POSIX_H
-#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
+#if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
# include "sanitizer_internal_defs.h"
# include "sanitizer_mallinfo.h"
@@ -29,7 +29,7 @@
# define SANITIZER_HAS_STAT64 0
# define SANITIZER_HAS_STATFS64 0
# endif
-# elif SANITIZER_GLIBC || SANITIZER_ANDROID
+# elif SANITIZER_GLIBC || SANITIZER_ANDROID || SANITIZER_AIX
# define SANITIZER_HAS_STAT64 1
# define SANITIZER_HAS_STATFS64 1
# endif
@@ -319,7 +319,7 @@ struct __sanitizer_iovec {
usize iov_len;
};
-# if !SANITIZER_ANDROID
+# if !SANITIZER_ANDROID && !SANITIZER_AIX
struct __sanitizer_ifaddrs {
struct __sanitizer_ifaddrs *ifa_next;
char *ifa_name;
@@ -333,7 +333,7 @@ struct __sanitizer_ifaddrs {
void *ifa_dstaddr; // (struct sockaddr *)
void *ifa_data;
};
-# endif // !SANITIZER_ANDROID
+# endif // !SANITIZER_ANDROID && !SANITIZER_AIX
# if SANITIZER_APPLE
typedef unsigned long __sanitizer_pthread_key_t;
@@ -341,7 +341,7 @@ typedef unsigned long __sanitizer_pthread_key_t;
typedef unsigned __sanitizer_pthread_key_t;
# endif
-# if SANITIZER_LINUX && !SANITIZER_ANDROID
+# if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_AIX
struct __sanitizer_XDR {
int x_op;
@@ -436,12 +436,14 @@ struct __sanitizer_tm {
int tm_wday;
int tm_yday;
int tm_isdst;
+# if !SANITIZER_AIX
# if SANITIZER_HAIKU
int tm_gmtoff;
# else
long int tm_gmtoff;
# endif
const char *tm_zone;
+# endif
};
# if SANITIZER_LINUX
@@ -528,8 +530,13 @@ struct __sanitizer_dirent {
};
# else
struct __sanitizer_dirent {
+# if SANITIZER_AIX
+ uptr d_offset;
+ uptr d_ino;
+# else
uptr d_ino;
uptr d_off;
+#endif
unsigned short d_reclen;
// more fields that we don't care about
};
@@ -545,7 +552,7 @@ struct __sanitizer_dirent64 {
extern unsigned struct_sock_fprog_sz;
# endif
-# if SANITIZER_HAIKU
+# if SANITIZER_HAIKU || SANITIZER_AIX
typedef int __sanitizer_clock_t;
# elif defined(__x86_64__) && !defined(_LP64)
typedef long long __sanitizer_clock_t;
@@ -609,6 +616,14 @@ struct __sanitizer_sigset_t {
// The size is determined by looking at sizeof of real sigset_t on linux.
uptr val[128 / sizeof(uptr)];
};
+# elif SANITIZER_AIX
+struct __sanitizer_sigset_t {
+# if SANITIZER_WORDSIZE == 64
+ uptr val[4];
+# else
+ uptr val[2];
+# endif
+};
# endif
struct __sanitizer_siginfo_pad {
@@ -800,8 +815,12 @@ struct __sanitizer_addrinfo {
int ai_family;
int ai_socktype;
int ai_protocol;
-# if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_HAIKU
+# if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
+# if SANITIZER_AIX // AIX ai_addrlen type is size_t
+ uptr ai_addrlen;
+# else
unsigned ai_addrlen;
+# endif
char *ai_canonname;
void *ai_addr;
# else // LINUX
@@ -810,6 +829,9 @@ struct __sanitizer_addrinfo {
char *ai_canonname;
# endif
struct __sanitizer_addrinfo *ai_next;
+# if SANITIZER_AIX
+ int ai_eflags;
+# endif
};
struct __sanitizer_hostent {
@@ -826,7 +848,7 @@ struct __sanitizer_pollfd {
short revents;
};
-# if SANITIZER_ANDROID || SANITIZER_APPLE
+# if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_AIX
typedef unsigned __sanitizer_nfds_t;
# else
typedef unsigned long __sanitizer_nfds_t;
@@ -864,6 +886,10 @@ struct __sanitizer_wordexp_t {
uptr we_wordc;
char **we_wordv;
uptr we_offs;
+# if SANITIZER_AIX
+ int we_sflags;
+ uptr we_soffs;
+# endif
};
# if SANITIZER_LINUX && !SANITIZER_ANDROID
@@ -1122,12 +1148,12 @@ extern unsigned fpos_t_sz;
// when it can not be determined without including any system headers.
extern const unsigned IOCTL_NOT_PRESENT;
-extern unsigned IOCTL_FIOASYNC;
+extern ioctl_alttype IOCTL_FIOASYNC;
extern unsigned IOCTL_FIOCLEX;
extern unsigned IOCTL_FIOGETOWN;
-extern unsigned IOCTL_FIONBIO;
+extern ioctl_alttype IOCTL_FIONBIO;
extern unsigned IOCTL_FIONCLEX;
-extern unsigned IOCTL_FIOSETOWN;
+extern ioctl_alttype IOCTL_FIOSETOWN;
extern unsigned IOCTL_SIOCADDMULTI;
extern unsigned IOCTL_SIOCATMARK;
extern unsigned IOCTL_SIOCDELMULTI;
@@ -1147,27 +1173,29 @@ extern unsigned IOCTL_SIOCSIFFLAGS;
extern unsigned IOCTL_SIOCSIFMETRIC;
extern unsigned IOCTL_SIOCSIFMTU;
extern unsigned IOCTL_SIOCSIFNETMASK;
-extern unsigned IOCTL_SIOCSPGRP;
+extern ioctl_alttype IOCTL_SIOCSPGRP;
# if !SANITIZER_HAIKU
-extern unsigned IOCTL_TIOCCONS;
+extern ioctl_alttype IOCTL_TIOCCONS;
extern unsigned IOCTL_TIOCGETD;
extern unsigned IOCTL_TIOCNOTTY;
-extern unsigned IOCTL_TIOCPKT;
-extern unsigned IOCTL_TIOCSETD;
-extern unsigned IOCTL_TIOCSTI;
+extern ioctl_alttype IOCTL_TIOCPKT;
+extern ioctl_alttype IOCTL_TIOCSETD;
+extern ioctl_alttype IOCTL_TIOCSTI;
# endif
extern unsigned IOCTL_TIOCEXCL;
extern unsigned IOCTL_TIOCGPGRP;
extern unsigned IOCTL_TIOCGWINSZ;
-extern unsigned IOCTL_TIOCMBIC;
-extern unsigned IOCTL_TIOCMBIS;
+extern ioctl_alttype IOCTL_TIOCMBIC;
+extern ioctl_alttype IOCTL_TIOCMBIS;
extern unsigned IOCTL_TIOCMGET;
-extern unsigned IOCTL_TIOCMSET;
+extern ioctl_alttype IOCTL_TIOCMSET;
extern unsigned IOCTL_TIOCNXCL;
extern unsigned IOCTL_TIOCOUTQ;
+# if !SANITIZER_AIX
extern unsigned IOCTL_TIOCSCTTY;
-extern unsigned IOCTL_TIOCSPGRP;
-extern unsigned IOCTL_TIOCSWINSZ;
+# endif
+extern ioctl_alttype IOCTL_TIOCSPGRP;
+extern ioctl_alttype IOCTL_TIOCSWINSZ;
# if SANITIZER_LINUX && !SANITIZER_ANDROID
extern unsigned IOCTL_SIOCGETSGCNT;
extern unsigned IOCTL_SIOCGETVIFCNT;
@@ -1567,6 +1595,6 @@ extern const int si_SEGV_ACCERR;
typedef void *__sanitizer_timer_t;
# endif
-#endif // SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
+#endif // SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
#endif
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
index 69af6465a62c2..44c40036babb2 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
@@ -27,7 +27,7 @@
#include <signal.h>
#include <sys/mman.h>
-#if SANITIZER_FREEBSD
+#if SANITIZER_FREEBSD || SANITIZER_AIX
// The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before
// that, it was never implemented. So just define it to zero.
#undef MAP_NORESERVE
>From 35a8b5711a07694d97cef18f0258b2326b9aef24 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 15 Jul 2025 19:17:14 -0400
Subject: [PATCH 2/4] Address comments
---
.../sanitizer_platform_limits_posix.cpp | 3 +++
.../sanitizer_platform_limits_posix.h | 17 +++++++++++++++++
.../lib/sanitizer_common/sanitizer_posix.cpp | 1 +
3 files changed, 21 insertions(+)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 033c0405cff24..79f870b87d459 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -1093,6 +1093,9 @@ CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addrlen);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_canonname);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addr);
+#if SANITIZER_AIX
+CHECK_SIZE_AND_OFFSET(addrinfo, ai_eflags);
+#endif
CHECK_TYPE_SIZE(hostent);
CHECK_SIZE_AND_OFFSET(hostent, h_name);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index 619b787198afa..4469af3b3886b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -487,11 +487,19 @@ struct __sanitizer_msghdr {
struct __sanitizer_iovec *msg_iov;
uptr msg_iovlen;
void *msg_control;
+# if !SANITIZER_AIX
uptr msg_controllen;
+# else
+ unsigned msg_controllen;
+# endif
int msg_flags;
};
struct __sanitizer_cmsghdr {
+# if !SANITIZER_AIX
uptr cmsg_len;
+# else
+ unsigned cmsg_len;
+# endif
int cmsg_level;
int cmsg_type;
};
@@ -563,6 +571,8 @@ typedef long __sanitizer_clock_t;
# if SANITIZER_LINUX || SANITIZER_HAIKU
typedef int __sanitizer_clockid_t;
typedef unsigned long long __sanitizer_eventfd_t;
+# elif SANITIZER_AIX
+typedef int __sanitizer_clockid_t;
# endif
# if SANITIZER_LINUX
@@ -1148,6 +1158,13 @@ extern unsigned fpos_t_sz;
// when it can not be determined without including any system headers.
extern const unsigned IOCTL_NOT_PRESENT;
+ // On AIX, some variables are unsigned long types.
+#if SANITIZER_AIX
+using ioctl_alttype = uptr;
+#else
+using ioctl_alttype = unsigned;
+#endif
+
extern ioctl_alttype IOCTL_FIOASYNC;
extern unsigned IOCTL_FIOCLEX;
extern unsigned IOCTL_FIOGETOWN;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
index 44c40036babb2..fec5615e770a6 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
@@ -30,6 +30,7 @@
#if SANITIZER_FREEBSD || SANITIZER_AIX
// The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before
// that, it was never implemented. So just define it to zero.
+// Similarly, AIX does not define MAP_NORESERVE.
#undef MAP_NORESERVE
#define MAP_NORESERVE 0
#endif
>From 712480e906380621e4aa68f1c2885a193df8ea28 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 15 Jul 2025 19:20:49 -0400
Subject: [PATCH 3/4] Add CHECK_SIZE_AND_OFFSET for wordexp_t
---
.../lib/sanitizer_common/sanitizer_platform_limits_posix.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 79f870b87d459..a424a394f5ef0 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -1223,6 +1223,10 @@ CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_offs);
#endif
+#if SANITIZER_AIX
+CHECK_SIZE_AND_OFFSET(wordexp_t, we_sflags);
+CHECK_SIZE_AND_OFFSET(wordexp_t, we_soffs);
+#endif
CHECK_TYPE_SIZE(tm);
CHECK_SIZE_AND_OFFSET(tm, tm_sec);
>From 9455a08ba128a6269a329564eacfef73da966872 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 15 Jul 2025 19:49:27 -0400
Subject: [PATCH 4/4] Fix formatting
---
.../sanitizer_platform_limits_posix.cpp | 46 +++++++++----------
.../sanitizer_platform_limits_posix.h | 15 +++---
.../lib/sanitizer_common/sanitizer_posix.cpp | 8 ++--
3 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index a424a394f5ef0..b328bd1f1fc60 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -61,11 +61,11 @@
#endif
#if !SANITIZER_ANDROID
-#if !SANITIZER_HAIKU && !SANITIZER_AIX
-#include <sys/mount.h>
-#endif
-#include <sys/timeb.h>
-#include <utmpx.h>
+# if !SANITIZER_HAIKU && !SANITIZER_AIX
+# include <sys/mount.h>
+# endif
+# include <sys/timeb.h>
+# include <utmpx.h>
#endif
#if SANITIZER_LINUX
@@ -573,20 +573,20 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
const unsigned IOCTL_NOT_PRESENT = 0;
// On AIX, some variables are unsigned long types.
-#if SANITIZER_AIX
+# if SANITIZER_AIX
using ioctl_alttype = uptr;
-#else
+# else
using ioctl_alttype = unsigned;
-#endif
+# endif
ioctl_alttype IOCTL_FIONBIO = FIONBIO;
-#if !SANITIZER_HAIKU
+# if !SANITIZER_HAIKU
ioctl_alttype IOCTL_FIOASYNC = FIOASYNC;
unsigned IOCTL_FIOCLEX = FIOCLEX;
unsigned IOCTL_FIOGETOWN = FIOGETOWN;
unsigned IOCTL_FIONCLEX = FIONCLEX;
ioctl_alttype IOCTL_FIOSETOWN = FIOSETOWN;
-#endif
+# endif
unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
unsigned IOCTL_SIOCATMARK = SIOCATMARK;
unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;
@@ -608,14 +608,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
ioctl_alttype IOCTL_SIOCSPGRP = SIOCSPGRP;
-#if !SANITIZER_HAIKU
+# if !SANITIZER_HAIKU
ioctl_alttype IOCTL_TIOCCONS = TIOCCONS;
unsigned IOCTL_TIOCGETD = TIOCGETD;
unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
ioctl_alttype IOCTL_TIOCPKT = TIOCPKT;
ioctl_alttype IOCTL_TIOCSETD = TIOCSETD;
ioctl_alttype IOCTL_TIOCSTI = TIOCSTI;
-#endif
+# endif
unsigned IOCTL_TIOCEXCL = TIOCEXCL;
unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
@@ -631,7 +631,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
# endif
ioctl_alttype IOCTL_TIOCSPGRP = TIOCSPGRP;
ioctl_alttype IOCTL_TIOCSWINSZ = TIOCSWINSZ;
-#if SANITIZER_LINUX && !SANITIZER_ANDROID
+# if SANITIZER_LINUX && !SANITIZER_ANDROID
unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
#endif
@@ -1093,9 +1093,9 @@ CHECK_SIZE_AND_OFFSET(addrinfo, ai_protocol);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addrlen);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_canonname);
CHECK_SIZE_AND_OFFSET(addrinfo, ai_addr);
-#if SANITIZER_AIX
+# if SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(addrinfo, ai_eflags);
-#endif
+# endif
CHECK_TYPE_SIZE(hostent);
CHECK_SIZE_AND_OFFSET(hostent, h_name);
@@ -1142,13 +1142,13 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
CHECK_SIZE_AND_OFFSET(dirent, d_ino);
#if SANITIZER_APPLE
CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
-#elif SANITIZER_AIX
+# elif SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(dirent, d_offset);
-#elif SANITIZER_FREEBSD || SANITIZER_HAIKU
+# elif SANITIZER_FREEBSD || SANITIZER_HAIKU
// There is no 'd_off' field on FreeBSD.
-#else
+# else
CHECK_SIZE_AND_OFFSET(dirent, d_off);
-#endif
+# endif
CHECK_SIZE_AND_OFFSET(dirent, d_reclen);
#if SANITIZER_GLIBC
@@ -1223,10 +1223,10 @@ CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_offs);
#endif
-#if SANITIZER_AIX
+# if SANITIZER_AIX
CHECK_SIZE_AND_OFFSET(wordexp_t, we_sflags);
CHECK_SIZE_AND_OFFSET(wordexp_t, we_soffs);
-#endif
+# endif
CHECK_TYPE_SIZE(tm);
CHECK_SIZE_AND_OFFSET(tm, tm_sec);
@@ -1243,7 +1243,7 @@ CHECK_SIZE_AND_OFFSET(tm, tm_gmtoff);
CHECK_SIZE_AND_OFFSET(tm, tm_zone);
# endif
-#if SANITIZER_LINUX
+# if SANITIZER_LINUX
CHECK_TYPE_SIZE(mntent);
CHECK_SIZE_AND_OFFSET(mntent, mnt_fsname);
CHECK_SIZE_AND_OFFSET(mntent, mnt_dir);
@@ -1293,7 +1293,7 @@ CHECK_TYPE_SIZE(clock_t);
CHECK_TYPE_SIZE(clockid_t);
#endif
-#if !SANITIZER_ANDROID && !SANITIZER_HAIKU && !SANITIZER_AIX
+# if !SANITIZER_ANDROID && !SANITIZER_HAIKU && !SANITIZER_AIX
CHECK_TYPE_SIZE(ifaddrs);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_next);
CHECK_SIZE_AND_OFFSET(ifaddrs, ifa_name);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index 4469af3b3886b..1d4af80a42761 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -437,7 +437,7 @@ struct __sanitizer_tm {
int tm_yday;
int tm_isdst;
# if !SANITIZER_AIX
-# if SANITIZER_HAIKU
+# if SANITIZER_HAIKU
int tm_gmtoff;
# else
long int tm_gmtoff;
@@ -544,7 +544,7 @@ struct __sanitizer_dirent {
# else
uptr d_ino;
uptr d_off;
-#endif
+# endif
unsigned short d_reclen;
// more fields that we don't care about
};
@@ -1158,12 +1158,12 @@ extern unsigned fpos_t_sz;
// when it can not be determined without including any system headers.
extern const unsigned IOCTL_NOT_PRESENT;
- // On AIX, some variables are unsigned long types.
-#if SANITIZER_AIX
+// On AIX, some variables are unsigned long types.
+# if SANITIZER_AIX
using ioctl_alttype = uptr;
-#else
+# else
using ioctl_alttype = unsigned;
-#endif
+# endif
extern ioctl_alttype IOCTL_FIOASYNC;
extern unsigned IOCTL_FIOCLEX;
@@ -1612,6 +1612,7 @@ extern const int si_SEGV_ACCERR;
typedef void *__sanitizer_timer_t;
# endif
-#endif // SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
+#endif // SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU ||
+ // SANITIZER_AIX
#endif
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
index fec5615e770a6..cda0f4450d4b7 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp
@@ -27,13 +27,13 @@
#include <signal.h>
#include <sys/mman.h>
-#if SANITIZER_FREEBSD || SANITIZER_AIX
+# if SANITIZER_FREEBSD || SANITIZER_AIX
// The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before
// that, it was never implemented. So just define it to zero.
// Similarly, AIX does not define MAP_NORESERVE.
-#undef MAP_NORESERVE
-#define MAP_NORESERVE 0
-#endif
+# undef MAP_NORESERVE
+# define MAP_NORESERVE 0
+# endif
namespace __sanitizer {
More information about the llvm-commits
mailing list