[compiler-rt] [sanitizer_common][asan] Implement address sanitizer on AIX: add platform specific support (3/n) (PR #131866)

Jake Egan via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 29 08:43:00 PDT 2025


https://github.com/jakeegan updated https://github.com/llvm/llvm-project/pull/131866

>From 829ed78471828ce9eaefd59a9d9c0cb4de1699dc Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Fri, 14 Mar 2025 13:37:39 -0400
Subject: [PATCH 01/12] [sanitizer_common] recognize AIX

---
 .../sanitizer_allocator_internal.h            |  5 ++
 .../sanitizer_allocator_primary32.h           |  1 +
 .../sanitizer_common/sanitizer_atomic_clang.h | 16 ++++
 .../sanitizer_common_libcdep.cpp              |  7 +-
 .../lib/sanitizer_common/sanitizer_errno.h    |  2 +
 .../lib/sanitizer_common/sanitizer_flags.inc  |  3 +
 .../lib/sanitizer_common/sanitizer_platform.h | 17 +++-
 .../sanitizer_platform_limits_posix.cpp       | 40 +++++++--
 .../sanitizer_platform_limits_posix.h         | 82 ++++++++++++++++---
 .../lib/sanitizer_common/sanitizer_posix.cpp  |  2 +-
 10 files changed, 156 insertions(+), 19 deletions(-)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_internal.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_internal.h
index 62523c7ae187c..e5b912d70e61e 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_internal.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_internal.h
@@ -23,7 +23,12 @@ namespace __sanitizer {
 typedef CompactSizeClassMap InternalSizeClassMap;
 
 struct AP32 {
+// For AIX 64-bit, the mmap begin is at address 0x0a00000000000000ULL.
+#if SANITIZER_AIX && SANITIZER_WORDSIZE == 64
+  static const uptr kSpaceBeg = 0x0a00000000000000ULL;
+#else
   static const uptr kSpaceBeg = 0;
+#endif
   static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;
   static const uptr kMetadataSize = 0;
   typedef InternalSizeClassMap SizeClassMap;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h
index 602b197c42ae3..0faf9b3c151a4 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h
@@ -288,6 +288,7 @@ class SizeClassAllocator32 {
   uptr ComputeRegionId(uptr mem) const {
     if (SANITIZER_SIGN_EXTENDED_ADDRESSES)
       mem &= (kSpaceSize - 1);
+    mem -= kSpaceBeg;
     const uptr res = mem >> kRegionSizeLog;
     CHECK_LT(res, kNumPossibleRegions);
     return res;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
index 1414092e38d7e..db4805468c2d5 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
@@ -14,6 +14,18 @@
 #ifndef SANITIZER_ATOMIC_CLANG_H
 #define SANITIZER_ATOMIC_CLANG_H
 
+// Helper to suppress warnings related to 8-byte atomic accesses when the target
+// is 32-bit AIX (where such accesses use libatomic).
+#if defined(_AIX) && !defined(__powerpc64__) && defined(__clang__)
+#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN                                \
+  _Pragma("clang diagnostic push")                                             \
+      _Pragma("clang diagnostic ignored \"-Watomic-alignment\"")
+#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END _Pragma("clang diagnostic pop")
+#else
+#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
+#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
+#endif
+
 namespace __sanitizer {
 
 // We use the compiler builtin atomic operations for loads and stores, which
@@ -35,6 +47,8 @@ inline void proc_yield(int cnt) {
 #endif
 }
 
+SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
+
 template <typename T>
 inline typename T::Type atomic_load(const volatile T *a, memory_order mo) {
   DCHECK(mo == memory_order_relaxed || mo == memory_order_consume ||
@@ -92,6 +106,8 @@ inline bool atomic_compare_exchange_weak(volatile T *a, typename T::Type *cmp,
   return atomic_compare_exchange_strong(a, cmp, xchg, mo);
 }
 
+SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
+
 }  // namespace __sanitizer
 
 #undef ATOMIC_ORDER
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
index f275e81ff0416..a770c8cf656b3 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
@@ -169,7 +169,12 @@ void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name,
                      : !MmapFixedNoReserve(beg, size, name)) {
     Report(
         "ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. "
-        "Perhaps you're using ulimit -v or ulimit -d\n",
+        "Perhaps you're using ulimit -v "
+#if SANITIZER_AIX && SANITIZER_WORDSIZE == 32
+        "or using large address-space model for 32-bit XCOFF by using ldedit "
+        "or setting LDR_CNTRL=MAXDATA or compiling the binary with -bmaxdata "
+#endif
+        "\n",
         size);
     Die();
   }
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_flags.inc b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
index c1e3530618c20..a6c760b2387fb 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
@@ -269,6 +269,9 @@ COMMON_FLAG(bool, detect_write_exec, false,
 COMMON_FLAG(bool, test_only_emulate_no_memorymap, false,
             "TEST ONLY fail to read memory mappings to emulate sanitized "
             "\"init\"")
+COMMON_FLAG(bool, enable_unmalloced_free_check, !SANITIZER_AIX,
+            "if true, FreeNotMalloced error will be reported. Only disable "
+            "this error detecting on AIX by default for now.")
 // With static linking, dladdr((void*)pthread_join) or similar will return the
 // path to the main program. This flag will replace dlopen(<main program,...>
 // with dlopen(NULL,...), which is the correct way to get a handle to the main
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
index 9f5f41cd85514..982011eedd75a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
@@ -14,7 +14,8 @@
 
 #if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && \
     !defined(__APPLE__) && !defined(_WIN32) && !defined(__Fuchsia__) &&     \
-    !(defined(__sun__) && defined(__svr4__)) && !defined(__HAIKU__)
+    !(defined(__sun__) && defined(__svr4__)) && !defined(__HAIKU__) &&      \
+    !defined(_AIX)
 #  error "This operating system is not supported"
 #endif
 
@@ -31,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
@@ -144,7 +151,11 @@
 
 #define SANITIZER_POSIX                                       \
   (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
+<<<<<<< HEAD
    SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU)
+=======
+   SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_AIX)
+>>>>>>> d8273ed5690f ([sanitizer_common] recognize AIX)
 
 #if __LP64__ || defined(_WIN64)
 #  define SANITIZER_WORDSIZE 64
@@ -398,7 +409,9 @@
 // (ie. same as double) to 128-bit long double.  On those, glibc symbols
 // involving long doubles come in two versions, and we need to pass the
 // correct one to dlvsym when intercepting them.
-#if SANITIZER_LINUX && (SANITIZER_S390 || SANITIZER_PPC32 || SANITIZER_PPC64V1)
+#if SANITIZER_LINUX &&                                        \
+    (SANITIZER_S390 || (SANITIZER_PPC32 && !SANITIZER_AIX) || \
+     SANITIZER_PPC64V1)
 #  define SANITIZER_NLDBL_VERSION "GLIBC_2.4"
 #endif
 
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 b4d87ab6228e5..87bada2d5fef2 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,7 +112,11 @@ typedef struct user_fpregs elf_fpregset_t;
 #endif
 
 #if !SANITIZER_ANDROID
+#if !SANITIZER_AIX
 #include <ifaddrs.h>
+#else
+#include <netinet/in.h>
+#endif
 #if !SANITIZER_HAIKU
 #include <sys/ucontext.h>
 #include <wordexp.h>
@@ -177,6 +181,17 @@ typedef struct user_fpregs elf_fpregset_t;
 #include <sys/sockio.h>
 #endif
 
+#if SANITIZER_AIX
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stropts.h>
+#include <sys/statfs.h>
+#include <netinet/ip_mroute.h>
+#if HAVE_RPC_XDR_H
+#include <tirpc/rpc/xdr.h>
+#endif
+#endif
+
 #if SANITIZER_HAIKU
 #include <sys/sockio.h>
 #include <sys/ioctl.h>
@@ -563,6 +578,19 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_FIONBIO = FIONBIO;
 #if !SANITIZER_HAIKU
   unsigned IOCTL_FIOASYNC = FIOASYNC;
+  unsigned IOCTL_FIONBIO = FIONBIO;
+  unsigned IOCTL_FIOSETOWN = FIOSETOWN;
+  unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
+  unsigned IOCTL_TIOCCONS = TIOCCONS;
+  unsigned IOCTL_TIOCMBIC = TIOCMBIC;
+  unsigned IOCTL_TIOCMBIS = TIOCMBIS;
+  unsigned IOCTL_TIOCMSET = TIOCMSET;
+  unsigned IOCTL_TIOCPKT = TIOCPKT;
+  unsigned IOCTL_TIOCSETD = TIOCSETD;
+  unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
+  unsigned IOCTL_TIOCSTI = TIOCSTI;
+  unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
+#endif
   unsigned IOCTL_FIOCLEX = FIOCLEX;
   unsigned IOCTL_FIOGETOWN = FIOGETOWN;
   unsigned IOCTL_FIONCLEX = FIONCLEX;
@@ -601,8 +629,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_TIOCEXCL = TIOCEXCL;
   unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
   unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
-  unsigned IOCTL_TIOCMBIC = TIOCMBIC;
-  unsigned IOCTL_TIOCMBIS = TIOCMBIS;
   unsigned IOCTL_TIOCMGET = TIOCMGET;
   unsigned IOCTL_TIOCMSET = TIOCMSET;
   unsigned IOCTL_TIOCNXCL = TIOCNXCL;
@@ -1118,6 +1144,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
@@ -1208,8 +1236,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);
@@ -1261,7 +1291,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 348bb4f27aec3..bcb7823aeeed4 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_platform.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;
@@ -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
@@ -485,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;
 };
@@ -528,8 +538,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
 };
@@ -547,6 +562,9 @@ extern unsigned struct_sock_fprog_sz;
 
 #if SANITIZER_HAIKU
 typedef int __sanitizer_clock_t;
+#if SANITIZER_AIX
+typedef int __sanitizer_clock_t;
+typedef int __sanitizer_clockid_t;
 #elif defined(__x86_64__) && !defined(_LP64)
 typedef long long __sanitizer_clock_t;
 #else
@@ -609,6 +627,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 {
@@ -799,8 +825,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
@@ -809,6 +839,9 @@ struct __sanitizer_addrinfo {
   char *ai_canonname;
 #endif
   struct __sanitizer_addrinfo *ai_next;
+#if SANITIZER_AIX
+  int ai_eflags;
+#endif
 };
 
 struct __sanitizer_hostent {
@@ -825,7 +858,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;
@@ -863,6 +896,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 +1159,39 @@ extern unsigned fpos_t_sz;
 // when it can not be determined without including any system headers.
 extern const unsigned IOCTL_NOT_PRESENT;
 
+#if SANITIZER_AIX
+extern uptr IOCTL_FIOASYNC;
+extern uptr IOCTL_FIONBIO;
+extern uptr IOCTL_FIOSETOWN;
+extern uptr IOCTL_SIOCSPGRP;
+extern uptr IOCTL_TIOCCONS;
+extern uptr IOCTL_TIOCMBIC;
+extern uptr IOCTL_TIOCMBIS;
+extern uptr IOCTL_TIOCMSET;
+extern uptr IOCTL_TIOCPKT;
+extern uptr IOCTL_TIOCSETD;
+extern uptr IOCTL_TIOCSPGRP;
+extern uptr IOCTL_TIOCSTI;
+extern uptr IOCTL_TIOCSWINSZ;
+#else
 extern unsigned IOCTL_FIOASYNC;
+extern unsigned IOCTL_FIONBIO;
+extern unsigned IOCTL_FIOSETOWN;
+extern unsigned IOCTL_SIOCSPGRP;
+extern unsigned IOCTL_TIOCCONS;
+extern unsigned IOCTL_TIOCMBIC;
+extern unsigned IOCTL_TIOCMBIS;
+extern unsigned IOCTL_TIOCMSET;
+extern unsigned IOCTL_TIOCPKT;
+extern unsigned IOCTL_TIOCSETD;
+extern unsigned IOCTL_TIOCSPGRP;
+extern unsigned IOCTL_TIOCSTI;
+extern unsigned IOCTL_TIOCSWINSZ;
+#endif
+
 extern unsigned IOCTL_FIOCLEX;
 extern unsigned IOCTL_FIOGETOWN;
-extern unsigned IOCTL_FIONBIO;
 extern unsigned IOCTL_FIONCLEX;
-extern unsigned IOCTL_FIOSETOWN;
 extern unsigned IOCTL_SIOCADDMULTI;
 extern unsigned IOCTL_SIOCATMARK;
 extern unsigned IOCTL_SIOCDELMULTI;
@@ -1159,8 +1223,6 @@ extern unsigned IOCTL_TIOCSTI;
 extern unsigned IOCTL_TIOCEXCL;
 extern unsigned IOCTL_TIOCGPGRP;
 extern unsigned IOCTL_TIOCGWINSZ;
-extern unsigned IOCTL_TIOCMBIC;
-extern unsigned IOCTL_TIOCMBIS;
 extern unsigned IOCTL_TIOCMGET;
 extern unsigned IOCTL_TIOCMSET;
 extern unsigned IOCTL_TIOCNXCL;
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 075dd32ebd49e5403a02acc5da545eb4db0b72a5 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 1 Apr 2025 10:09:50 -0400
Subject: [PATCH 02/12] Fix formatting

---
 .../sanitizer_common/sanitizer_atomic_clang.h | 12 +--
 .../sanitizer_common_libcdep.cpp              |  4 +-
 .../sanitizer_platform_limits_posix.cpp       | 37 +++----
 .../sanitizer_platform_limits_posix.h         | 96 +++++++++----------
 .../lib/sanitizer_common/sanitizer_posix.cpp  |  2 +-
 5 files changed, 76 insertions(+), 75 deletions(-)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
index db4805468c2d5..b357345ec7854 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang.h
@@ -17,13 +17,13 @@
 // Helper to suppress warnings related to 8-byte atomic accesses when the target
 // is 32-bit AIX (where such accesses use libatomic).
 #if defined(_AIX) && !defined(__powerpc64__) && defined(__clang__)
-#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN                                \
-  _Pragma("clang diagnostic push")                                             \
-      _Pragma("clang diagnostic ignored \"-Watomic-alignment\"")
-#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END _Pragma("clang diagnostic pop")
+#  define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN \
+    _Pragma("clang diagnostic push")              \
+        _Pragma("clang diagnostic ignored \"-Watomic-alignment\"")
+#  define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END _Pragma("clang diagnostic pop")
 #else
-#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
-#define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
+#  define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_BEGIN
+#  define SANITIZER_IGNORE_ATOMIC_ALIGNMENT_END
 #endif
 
 namespace __sanitizer {
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
index a770c8cf656b3..aa30fd9b5dd96 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_libcdep.cpp
@@ -170,10 +170,10 @@ void ReserveShadowMemoryRange(uptr beg, uptr end, const char *name,
     Report(
         "ReserveShadowMemoryRange failed while trying to map 0x%zx bytes. "
         "Perhaps you're using ulimit -v "
-#if SANITIZER_AIX && SANITIZER_WORDSIZE == 32
+#  if SANITIZER_AIX && SANITIZER_WORDSIZE == 32
         "or using large address-space model for 32-bit XCOFF by using ldedit "
         "or setting LDR_CNTRL=MAXDATA or compiling the binary with -bmaxdata "
-#endif
+#  endif
         "\n",
         size);
     Die();
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 87bada2d5fef2..1c54b7c0f152c 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -61,7 +61,7 @@
 #endif
 
 #if !SANITIZER_ANDROID
-#if !SANITIZER_HAIKU && !SANITIZER_AIX
+#if !SANITIZER_AIX && !SANITIZER_HAIKU
 #include <sys/mount.h>
 #endif
 #include <sys/timeb.h>
@@ -181,16 +181,16 @@ typedef struct user_fpregs elf_fpregset_t;
 #include <sys/sockio.h>
 #endif
 
-#if SANITIZER_AIX
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <stropts.h>
-#include <sys/statfs.h>
-#include <netinet/ip_mroute.h>
-#if HAVE_RPC_XDR_H
-#include <tirpc/rpc/xdr.h>
-#endif
-#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
 
 #if SANITIZER_HAIKU
 #include <sys/sockio.h>
@@ -590,7 +590,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
   unsigned IOCTL_TIOCSTI = TIOCSTI;
   unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
-#endif
+#  endif
   unsigned IOCTL_FIOCLEX = FIOCLEX;
   unsigned IOCTL_FIOGETOWN = FIOGETOWN;
   unsigned IOCTL_FIONCLEX = FIONCLEX;
@@ -637,6 +637,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
   unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
 #if SANITIZER_LINUX && !SANITIZER_ANDROID
+
   unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
   unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
 #endif
@@ -1144,13 +1145,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
 // 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
@@ -1236,12 +1237,12 @@ 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
+#  if !SANITIZER_AIX
 CHECK_SIZE_AND_OFFSET(tm, tm_gmtoff);
 CHECK_SIZE_AND_OFFSET(tm, tm_zone);
-#endif
+#  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);
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 bcb7823aeeed4..eaca02ca51111 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -16,25 +16,25 @@
 
 #if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
 
-#include "sanitizer_internal_defs.h"
-#include "sanitizer_platform.h"
-#include "sanitizer_mallinfo.h"
-
-#if SANITIZER_APPLE
-#include <sys/cdefs.h>
-#if !__DARWIN_ONLY_64_BIT_INO_T
-#define SANITIZER_HAS_STAT64 1
-#define SANITIZER_HAS_STATFS64 1
-#else
-#define SANITIZER_HAS_STAT64 0
-#define SANITIZER_HAS_STATFS64 0
-#endif
-#elif SANITIZER_GLIBC || SANITIZER_ANDROID || SANITIZER_AIX
-#define SANITIZER_HAS_STAT64 1
-#define SANITIZER_HAS_STATFS64 1
-#endif
+#  include "sanitizer_internal_defs.h"
+#  include "sanitizer_platform.h"
+#  include "sanitizer_mallinfo.h"
+
+#  if SANITIZER_APPLE
+#    include <sys/cdefs.h>
+#    if !__DARWIN_ONLY_64_BIT_INO_T
+#      define SANITIZER_HAS_STAT64 1
+#      define SANITIZER_HAS_STATFS64 1
+#    else
+#      define SANITIZER_HAS_STAT64 0
+#      define SANITIZER_HAS_STATFS64 0
+#    endif
+#  elif SANITIZER_GLIBC || SANITIZER_ANDROID || SANITIZER_AIX
+#    define SANITIZER_HAS_STAT64 1
+#    define SANITIZER_HAS_STATFS64 1
+#  endif
 
-#if defined(__sparc__)
+#  if defined(__sparc__)
 // FIXME: This can't be included from tsan which does not support sparc yet.
 #include "sanitizer_glibc_version.h"
 #endif
@@ -319,7 +319,7 @@ struct __sanitizer_iovec {
   usize iov_len;
 };
 
-#if !SANITIZER_ANDROID && !SANITIZER_AIX
+#  if !SANITIZER_ANDROID && !SANITIZER_AIX
 struct __sanitizer_ifaddrs {
   struct __sanitizer_ifaddrs *ifa_next;
   char *ifa_name;
@@ -341,7 +341,7 @@ typedef unsigned long __sanitizer_pthread_key_t;
 typedef unsigned __sanitizer_pthread_key_t;
 #endif
 
-#if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_AIX
+#  if (SANITIZER_LINUX && !SANITIZER_ANDROID) || SANITIZER_AIX
 
 struct __sanitizer_XDR {
   int x_op;
@@ -443,7 +443,7 @@ struct __sanitizer_tm {
   long int tm_gmtoff;
 #endif
   const char *tm_zone;
-#endif
+#  endif
 };
 
 #if SANITIZER_LINUX
@@ -487,19 +487,19 @@ struct __sanitizer_msghdr {
   struct __sanitizer_iovec *msg_iov;
   uptr msg_iovlen;
   void *msg_control;
-#if !SANITIZER_AIX
+#    if !SANITIZER_AIX
   uptr msg_controllen;
-#else
+#    else
   unsigned msg_controllen;
-#endif
+#    endif
   int msg_flags;
 };
 struct __sanitizer_cmsghdr {
-#if !SANITIZER_AIX
+#    if !SANITIZER_AIX
   uptr cmsg_len;
-#else
+#    else
   unsigned cmsg_len;
-#endif
+#    endif
   int cmsg_level;
   int cmsg_type;
 };
@@ -538,13 +538,13 @@ struct __sanitizer_dirent {
 };
 #  else
 struct __sanitizer_dirent {
-#if SANITIZER_AIX
+#    if SANITIZER_AIX
   uptr d_offset;
   uptr d_ino;
-#else
+#    else
   uptr d_ino;
   uptr d_off;
-#endif
+#    endif
   unsigned short d_reclen;
   // more fields that we don't care about
 };
@@ -565,11 +565,11 @@ typedef int __sanitizer_clock_t;
 #if SANITIZER_AIX
 typedef int __sanitizer_clock_t;
 typedef int __sanitizer_clockid_t;
-#elif defined(__x86_64__) && !defined(_LP64)
+#  elif defined(__x86_64__) && !defined(_LP64)
 typedef long long __sanitizer_clock_t;
-#else
+#  else
 typedef long __sanitizer_clock_t;
-#endif
+#  endif
 
 #if SANITIZER_LINUX || SANITIZER_HAIKU
 typedef int __sanitizer_clockid_t;
@@ -627,15 +627,15 @@ 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
+#  elif SANITIZER_AIX
 struct __sanitizer_sigset_t {
-#if SANITIZER_WORDSIZE == 64
+#    if SANITIZER_WORDSIZE == 64
   uptr val[4];
-#else
+#    else
   uptr val[2];
-#endif
+#    endif
 };
-#endif
+#  endif
 
 struct __sanitizer_siginfo_pad {
 #if SANITIZER_X32
@@ -828,9 +828,9 @@ struct __sanitizer_addrinfo {
 #if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
 #if SANITIZER_AIX // AIX ai_addrlen type is size_t
   uptr ai_addrlen;
-#else
+#    else
   unsigned ai_addrlen;
-#endif
+#    endif
   char *ai_canonname;
   void *ai_addr;
 #else // LINUX
@@ -839,9 +839,9 @@ struct __sanitizer_addrinfo {
   char *ai_canonname;
 #endif
   struct __sanitizer_addrinfo *ai_next;
-#if SANITIZER_AIX
+#  if SANITIZER_AIX
   int ai_eflags;
-#endif
+#  endif
 };
 
 struct __sanitizer_hostent {
@@ -858,7 +858,7 @@ struct __sanitizer_pollfd {
   short revents;
 };
 
-#if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_AIX
+#  if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_AIX
 typedef unsigned __sanitizer_nfds_t;
 #else
 typedef unsigned long __sanitizer_nfds_t;
@@ -896,10 +896,10 @@ struct __sanitizer_wordexp_t {
   uptr we_wordc;
   char **we_wordv;
   uptr we_offs;
-#if SANITIZER_AIX
+#  if SANITIZER_AIX
   int we_sflags;
   uptr we_soffs;
-#endif
+#  endif
 };
 
 #if SANITIZER_LINUX && !SANITIZER_ANDROID
@@ -1159,7 +1159,7 @@ extern unsigned fpos_t_sz;
 // when it can not be determined without including any system headers.
 extern const unsigned IOCTL_NOT_PRESENT;
 
-#if SANITIZER_AIX
+#  if SANITIZER_AIX
 extern uptr IOCTL_FIOASYNC;
 extern uptr IOCTL_FIONBIO;
 extern uptr IOCTL_FIOSETOWN;
@@ -1173,7 +1173,7 @@ extern uptr IOCTL_TIOCSETD;
 extern uptr IOCTL_TIOCSPGRP;
 extern uptr IOCTL_TIOCSTI;
 extern uptr IOCTL_TIOCSWINSZ;
-#else
+#  else
 extern unsigned IOCTL_FIOASYNC;
 extern unsigned IOCTL_FIONBIO;
 extern unsigned IOCTL_FIOSETOWN;
@@ -1187,7 +1187,7 @@ extern unsigned IOCTL_TIOCSETD;
 extern unsigned IOCTL_TIOCSPGRP;
 extern unsigned IOCTL_TIOCSTI;
 extern unsigned IOCTL_TIOCSWINSZ;
-#endif
+#  endif
 
 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..b25ec8a66f64a 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 || 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.
 #undef  MAP_NORESERVE

>From 50405237e22140c0c5d891e66b25939c49f061c0 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 1 Apr 2025 10:18:13 -0400
Subject: [PATCH 03/12] Fix formatting 2

---
 .../lib/sanitizer_common/sanitizer_platform_limits_posix.h      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 eaca02ca51111..f7913b7e39171 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -17,8 +17,8 @@
 #if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
 
 #  include "sanitizer_internal_defs.h"
-#  include "sanitizer_platform.h"
 #  include "sanitizer_mallinfo.h"
+#  include "sanitizer_platform.h"
 
 #  if SANITIZER_APPLE
 #    include <sys/cdefs.h>

>From d994b0a302cab10a50bae18063cb5624d3376f46 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 22 Apr 2025 11:24:13 -0400
Subject: [PATCH 04/12] Add general asan part

---
 compiler-rt/cmake/Modules/AddCompilerRT.cmake |  17 +++
 compiler-rt/lib/asan/CMakeLists.txt           |  11 ++
 .../lib/asan/asan.link_with_main_exec.txt     | 115 ++++++++++++++++++
 compiler-rt/lib/asan/asan_aix.cpp             |  44 +++++++
 compiler-rt/lib/asan/asan_allocator.cpp       |   6 +-
 .../lib/asan/asan_cxx.link_with_main_exec.txt |  21 ++++
 compiler-rt/lib/asan/asan_posix.cpp           |   7 +-
 .../lib/asan/scripts/asan_symbolize.py        |   3 +-
 8 files changed, 220 insertions(+), 4 deletions(-)
 create mode 100644 compiler-rt/lib/asan/asan.link_with_main_exec.txt
 create mode 100644 compiler-rt/lib/asan/asan_aix.cpp
 create mode 100644 compiler-rt/lib/asan/asan_cxx.link_with_main_exec.txt

diff --git a/compiler-rt/cmake/Modules/AddCompilerRT.cmake b/compiler-rt/cmake/Modules/AddCompilerRT.cmake
index d346b0ec01b03..d29ee07ccbdfe 100644
--- a/compiler-rt/cmake/Modules/AddCompilerRT.cmake
+++ b/compiler-rt/cmake/Modules/AddCompilerRT.cmake
@@ -582,6 +582,23 @@ macro(add_compiler_rt_script name)
     DESTINATION ${COMPILER_RT_INSTALL_BINARY_DIR})
 endmacro(add_compiler_rt_script src name)
 
+macro(add_compiler_rt_cfg target_name file_name component)
+  set(src_file "${CMAKE_CURRENT_SOURCE_DIR}/${file_name}")
+  get_compiler_rt_output_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} output_dir)
+  set(dst_file "${output_dir}/${file_name}")
+  add_custom_command(OUTPUT ${dst_file}
+    DEPENDS ${src_file}
+    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src_file} ${dst_file}
+    COMMENT "Copying ${file_name}...")
+  add_custom_target(${target_name} DEPENDS ${dst_file})
+  install(FILES ${file_name}
+    DESTINATION ${COMPILER_RT_INSTALL_LIBRARY_DIR}
+    COMPONENT ${component})
+  add_dependencies(${component} ${target_name})
+
+  set_target_properties(${target_name} PROPERTIES FOLDER "Compiler-RT Misc")
+endmacro()
+
 # Builds custom version of libc++ and installs it in <prefix>.
 # Can be used to build sanitized versions of libc++ for running unit tests.
 # add_custom_libcxx(<name> <prefix>
diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt
index e2f39f224df9c..1ccf3fd3fb8c7 100644
--- a/compiler-rt/lib/asan/CMakeLists.txt
+++ b/compiler-rt/lib/asan/CMakeLists.txt
@@ -1,6 +1,7 @@
 # Build for the AddressSanitizer runtime support library.
 
 set(ASAN_SOURCES
+  asan_aix.cpp
   asan_allocator.cpp
   asan_activation.cpp
   asan_debugging.cpp
@@ -281,6 +282,8 @@ else()
       PARENT_TARGET asan)
   endif()
 
+  # On AIX, we only need the static libraries.
+  if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
   foreach(arch ${ASAN_SUPPORTED_ARCH})
     if (COMPILER_RT_HAS_VERSION_SCRIPT)
       if(WIN32)
@@ -382,10 +385,18 @@ else()
       endif()
     endif()
   endforeach()
+  endif()
 endif()
 
 add_compiler_rt_resource_file(asan_ignorelist asan_ignorelist.txt asan)
 
+On AIX, we need to put asan.link_with_main_exec.txt and asan_cxx.link_with_main_exec.txt
+# to the build and install dir.
+if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+  add_compiler_rt_cfg(asan_symbols asan.link_with_main_exec.txt asan)
+  add_compiler_rt_cfg(asan_cxx_symbols asan_cxx.link_with_main_exec.txt asan)
+endif()
+
 add_subdirectory(scripts)
 
 if(COMPILER_RT_INCLUDE_TESTS)
diff --git a/compiler-rt/lib/asan/asan.link_with_main_exec.txt b/compiler-rt/lib/asan/asan.link_with_main_exec.txt
new file mode 100644
index 0000000000000..5efc48c262369
--- /dev/null
+++ b/compiler-rt/lib/asan/asan.link_with_main_exec.txt
@@ -0,0 +1,115 @@
+#! .
+__asan_report_load_n
+__asan_loadN
+__asan_report_load1
+__asan_load1
+__asan_report_load2
+__asan_load2
+__asan_report_load4
+__asan_load4
+__asan_report_load8
+__asan_load8
+__asan_report_load16
+__asan_load16
+__asan_report_store_n
+__asan_storeN
+__asan_report_store1
+__asan_store1
+__asan_report_store2
+__asan_store2
+__asan_report_store4
+__asan_store4
+__asan_report_store8
+__asan_store8
+__asan_report_store16
+__asan_store16
+__asan_report_exp_load_n
+__asan_exp_loadN
+__asan_report_exp_load1
+__asan_exp_load1
+__asan_report_exp_load2
+__asan_exp_load2
+__asan_report_exp_load4
+__asan_exp_load4
+__asan_report_exp_load8
+__asan_exp_load8
+__asan_report_exp_load16
+__asan_exp_load16
+__asan_report_exp_store_n
+__asan_exp_storeN
+__asan_report_exp_store1
+__asan_exp_store1
+__asan_report_exp_store2
+__asan_exp_store2
+__asan_report_exp_store4
+__asan_exp_store4
+__asan_report_exp_store8
+__asan_exp_store8
+__asan_report_exp_store16
+__asan_exp_store16
+__asan_memmove
+__asan_memcpy
+__asan_memset
+__asan_handle_no_return
+__sanitizer_ptr_cmp
+__sanitizer_ptr_sub
+__asan_before_dynamic_init
+__asan_after_dynamic_init
+__asan_register_globals
+__asan_unregister_globals
+__asan_register_image_globals
+__asan_unregister_image_globals
+__asan_register_elf_globals
+__asan_unregister_elf_globals
+__asan_init
+__asan_version_mismatch_check_v8
+__asan_stack_malloc_0
+__asan_stack_malloc_1
+__asan_stack_malloc_2
+__asan_stack_malloc_3
+__asan_stack_malloc_4
+__asan_stack_malloc_5
+__asan_stack_malloc_6
+__asan_stack_malloc_7
+__asan_stack_malloc_8
+__asan_stack_malloc_9
+__asan_stack_malloc_10
+__asan_stack_malloc_always_0
+__asan_stack_malloc_always_1
+__asan_stack_malloc_always_2
+__asan_stack_malloc_always_3
+__asan_stack_malloc_always_4
+__asan_stack_malloc_always_5
+__asan_stack_malloc_always_6
+__asan_stack_malloc_always_7
+__asan_stack_malloc_always_8
+__asan_stack_malloc_always_9
+__asan_stack_malloc_always_10
+__asan_stack_free_0
+__asan_stack_free_1
+__asan_stack_free_2
+__asan_stack_free_3
+__asan_stack_free_4
+__asan_stack_free_5
+__asan_stack_free_6
+__asan_stack_free_7
+__asan_stack_free_8
+__asan_stack_free_9
+__asan_stack_free_10
+__asan_set_shadow_00
+__asan_set_shadow_01
+__asan_set_shadow_02
+__asan_set_shadow_03
+__asan_set_shadow_04
+__asan_set_shadow_05
+__asan_set_shadow_06
+__asan_set_shadow_07
+__asan_set_shadow_f1
+__asan_set_shadow_f2
+__asan_set_shadow_f3
+__asan_set_shadow_f5
+__asan_set_shadow_f8
+__asan_poison_stack_memory
+__asan_unpoison_stack_memory
+__asan_option_detect_stack_use_after_return
+__asan_shadow_memory_dynamic_address
diff --git a/compiler-rt/lib/asan/asan_aix.cpp b/compiler-rt/lib/asan/asan_aix.cpp
new file mode 100644
index 0000000000000..d1a8a5ac8e59d
--- /dev/null
+++ b/compiler-rt/lib/asan/asan_aix.cpp
@@ -0,0 +1,44 @@
+//===-- asan_aix.cpp ------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+// AIX-specific details.
+//===----------------------------------------------------------------------===//
+
+#include "sanitizer_common/sanitizer_platform.h"
+
+#if SANITIZER_AIX
+#  include "asan_mapping.h"
+#  include "sanitizer_common/sanitizer_internal_defs.h"
+
+namespace __asan {
+
+void AsanCheckIncompatibleRT() {}
+
+void AsanCheckDynamicRTPrereqs() {}
+
+void InitializePlatformExceptionHandlers() {}
+
+void *AsanDoesNotSupportStaticLinkage() { return 0; }
+
+void InitializePlatformInterceptors() {}
+void AsanApplyToGlobals(globals_op_fptr op, const void *needle) {}
+
+uptr FindDynamicShadowStart() {
+  UNREACHABLE("AIX does not use dynamic shadow offset!");
+  return 0;
+}
+
+void FlushUnneededASanShadowMemory(uptr p, uptr size) {
+  ReleaseMemoryPagesToOS(MemToShadow(p), MemToShadow(p + size));
+}
+
+}  // namespace __asan
+
+#endif  // SANITIZER_AIX
diff --git a/compiler-rt/lib/asan/asan_allocator.cpp b/compiler-rt/lib/asan/asan_allocator.cpp
index 3a55c2af65653..8a56132bf946a 100644
--- a/compiler-rt/lib/asan/asan_allocator.cpp
+++ b/compiler-rt/lib/asan/asan_allocator.cpp
@@ -797,8 +797,10 @@ struct Allocator {
   void ReportInvalidFree(void *ptr, u8 chunk_state, BufferedStackTrace *stack) {
     if (chunk_state == CHUNK_QUARANTINE)
       ReportDoubleFree((uptr)ptr, stack);
-    else
-      ReportFreeNotMalloced((uptr)ptr, stack);
+    else {
+      if (common_flags()->enable_unmalloced_free_check)
+        ReportFreeNotMalloced((uptr)ptr, stack);
+    }
   }
 
   void CommitBack(AsanThreadLocalMallocStorage *ms, BufferedStackTrace *stack) {
diff --git a/compiler-rt/lib/asan/asan_cxx.link_with_main_exec.txt b/compiler-rt/lib/asan/asan_cxx.link_with_main_exec.txt
new file mode 100644
index 0000000000000..7387f8173e859
--- /dev/null
+++ b/compiler-rt/lib/asan/asan_cxx.link_with_main_exec.txt
@@ -0,0 +1,21 @@
+#! .
+_ZdaPv
+_ZdaPvRKSt9nothrow_t
+_ZdaPvSt11align_val_t
+_ZdaPvSt11align_val_tRKSt9nothrow_t
+_ZdaPvm
+_ZdaPvmSt11align_val_t
+_ZdlPv
+_ZdlPvRKSt9nothrow_t
+_ZdlPvSt11align_val_t
+_ZdlPvSt11align_val_tRKSt9nothrow_t
+_ZdlPvm
+_ZdlPvmSt11align_val_t
+_Znam
+_ZnamRKSt9nothrow_t
+_ZnamSt11align_val_t
+_ZnamSt11align_val_tRKSt9nothrow_t
+_Znwm
+_ZnwmRKSt9nothrow_t
+_ZnwmSt11align_val_t
+_ZnwmSt11align_val_tRKSt9nothrow_t
diff --git a/compiler-rt/lib/asan/asan_posix.cpp b/compiler-rt/lib/asan/asan_posix.cpp
index fb66c871ea8a5..43a5cef27ea35 100644
--- a/compiler-rt/lib/asan/asan_posix.cpp
+++ b/compiler-rt/lib/asan/asan_posix.cpp
@@ -14,7 +14,11 @@
 #include "sanitizer_common/sanitizer_platform.h"
 #if SANITIZER_POSIX
 
+// tid_t is also defined in AIX header /usr/include/sys/types.h which is
+// included by system pthread.h
+#  define tid_t tid_t_temp
 #  include <pthread.h>
+#  undef tid_t
 #  include <signal.h>
 #  include <stdlib.h>
 #  include <sys/resource.h>
@@ -180,7 +184,8 @@ static void AfterFork(bool fork_child) {
 
 void InstallAtForkHandler() {
 #  if SANITIZER_SOLARIS || SANITIZER_NETBSD || SANITIZER_APPLE || \
-      (SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU
+      (SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU ||  \
+      SANITIZER_AIX
   // While other Linux targets use clone in internal_fork which doesn't
   // trigger pthread_atfork handlers, Linux/sparc64 uses __fork, causing a
   // hang.
diff --git a/compiler-rt/lib/asan/scripts/asan_symbolize.py b/compiler-rt/lib/asan/scripts/asan_symbolize.py
index 058a1614b55e6..466173336d8b1 100755
--- a/compiler-rt/lib/asan/scripts/asan_symbolize.py
+++ b/compiler-rt/lib/asan/scripts/asan_symbolize.py
@@ -59,6 +59,7 @@ def is_valid_arch(s):
         "armv7s",
         "armv7k",
         "arm64",
+        "powerpc",
         "powerpc64",
         "powerpc64le",
         "s390x",
@@ -449,7 +450,7 @@ def __init__(self, plugin_proxy=None, dsym_hint_producer=None):
             # E.g. in Chrome several binaries may share a single .dSYM.
             self.dsym_hint_producer = dsym_hint_producer
             self.system = os.uname()[0]
-            if self.system not in ["Linux", "Darwin", "FreeBSD", "NetBSD", "SunOS"]:
+            if self.system not in ["Linux", "Darwin", "FreeBSD", "NetBSD", "SunOS", "AIX"]:
                 raise Exception("Unknown system")
             self.llvm_symbolizers = {}
             self.last_llvm_symbolizer = None

>From 6bc803eae1f857cf8178aeab101213fc4f85dd2e Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Thu, 24 Apr 2025 11:03:22 -0400
Subject: [PATCH 05/12] Fix xdr.h path

---
 compiler-rt/cmake/base-config-ix.cmake | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

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

>From ada3b70170ed3cf2ff01b9c525ce3c3adba2c638 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 27 Apr 2025 13:19:06 -0400
Subject: [PATCH 06/12] Fix merge resolution

---
 .../lib/sanitizer_common/sanitizer_platform.h |  6 +--
 .../sanitizer_platform_limits_posix.cpp       | 53 ++++++++++---------
 .../sanitizer_platform_limits_posix.h         | 24 ++++-----
 3 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
index 982011eedd75a..3916721654a44 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform.h
@@ -151,11 +151,7 @@
 
 #define SANITIZER_POSIX                                       \
   (SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_APPLE || \
-<<<<<<< HEAD
-   SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_HAIKU)
-=======
-   SANITIZER_NETBSD || SANITIZER_SOLARIS || SANITIZER_AIX)
->>>>>>> d8273ed5690f ([sanitizer_common] recognize AIX)
+   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 1c54b7c0f152c..61d7549e94e7b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -575,26 +575,44 @@ 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
+  uptr IOCTL_FIOASYNC = FIOASYNC;
+  uptr IOCTL_FIONBIO = FIONBIO;
+  uptr IOCTL_FIOSETOWN = FIOSETOWN;
+  uptr IOCTL_SIOCSPGRP = SIOCSPGRP;
+  uptr IOCTL_TIOCCONS = TIOCCONS;
+  uptr IOCTL_TIOCMBIC = TIOCMBIC;
+  uptr IOCTL_TIOCMBIS = TIOCMBIS;
+  uptr IOCTL_TIOCMSET = TIOCMSET;
+  uptr IOCTL_TIOCPKT = TIOCPKT;
+  uptr IOCTL_TIOCSETD = TIOCSETD;
+  uptr IOCTL_TIOCSPGRP = TIOCSPGRP;
+  uptr IOCTL_TIOCSTI = TIOCSTI;
+  uptr IOCTL_TIOCSWINSZ = TIOCSWINSZ;
+#else
   unsigned IOCTL_FIONBIO = FIONBIO;
 #if !SANITIZER_HAIKU
   unsigned IOCTL_FIOASYNC = FIOASYNC;
-  unsigned IOCTL_FIONBIO = FIONBIO;
   unsigned IOCTL_FIOSETOWN = FIOSETOWN;
-  unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
   unsigned IOCTL_TIOCCONS = TIOCCONS;
-  unsigned IOCTL_TIOCMBIC = TIOCMBIC;
-  unsigned IOCTL_TIOCMBIS = TIOCMBIS;
-  unsigned IOCTL_TIOCMSET = TIOCMSET;
   unsigned IOCTL_TIOCPKT = TIOCPKT;
   unsigned IOCTL_TIOCSETD = TIOCSETD;
-  unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
   unsigned IOCTL_TIOCSTI = TIOCSTI;
+#endif
+  unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
+  unsigned IOCTL_TIOCMBIC = TIOCMBIC;
+  unsigned IOCTL_TIOCMBIS = TIOCMBIS;
   unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
-#  endif
+  unsigned IOCTL_TIOCMSET = TIOCMSET;
+  unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
+#endif
+#if !SANITIZER_HAIKU
   unsigned IOCTL_FIOCLEX = FIOCLEX;
   unsigned IOCTL_FIOGETOWN = FIOGETOWN;
   unsigned IOCTL_FIONCLEX = FIONCLEX;
-  unsigned IOCTL_FIOSETOWN = FIOSETOWN;
+  unsigned IOCTL_TIOCGETD = TIOCGETD;
+  unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
 #endif
   unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
   unsigned IOCTL_SIOCATMARK = SIOCATMARK;
@@ -615,29 +633,17 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;
   unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
   unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
-  unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
-
-#if !SANITIZER_HAIKU
-  unsigned IOCTL_TIOCCONS = TIOCCONS;
-  unsigned IOCTL_TIOCGETD = TIOCGETD;
-  unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
-  unsigned IOCTL_TIOCPKT = TIOCPKT;
-  unsigned IOCTL_TIOCSETD = TIOCSETD;
-  unsigned IOCTL_TIOCSTI = TIOCSTI;
-#endif
 
   unsigned IOCTL_TIOCEXCL = TIOCEXCL;
   unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
   unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
   unsigned IOCTL_TIOCMGET = TIOCMGET;
-  unsigned 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
 #if SANITIZER_LINUX && !SANITIZER_ANDROID
-
   unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
   unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
 #endif
@@ -1033,8 +1039,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
 
   const int si_SEGV_MAPERR = SEGV_MAPERR;
   const int si_SEGV_ACCERR = SEGV_ACCERR;
-} // namespace __sanitizer
-
+} // namespace __sanitizer 
 using namespace __sanitizer;
 
 COMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t));
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 f7913b7e39171..98466398f8da6 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -1159,7 +1159,7 @@ extern unsigned fpos_t_sz;
 // when it can not be determined without including any system headers.
 extern const unsigned IOCTL_NOT_PRESENT;
 
-#  if SANITIZER_AIX
+#if SANITIZER_AIX
 extern uptr IOCTL_FIOASYNC;
 extern uptr IOCTL_FIONBIO;
 extern uptr IOCTL_FIOSETOWN;
@@ -1173,21 +1173,23 @@ extern uptr IOCTL_TIOCSETD;
 extern uptr IOCTL_TIOCSPGRP;
 extern uptr IOCTL_TIOCSTI;
 extern uptr IOCTL_TIOCSWINSZ;
-#  else
+#else
 extern unsigned IOCTL_FIOASYNC;
 extern unsigned IOCTL_FIONBIO;
 extern unsigned IOCTL_FIOSETOWN;
 extern unsigned IOCTL_SIOCSPGRP;
-extern unsigned IOCTL_TIOCCONS;
 extern unsigned IOCTL_TIOCMBIC;
 extern unsigned IOCTL_TIOCMBIS;
 extern unsigned IOCTL_TIOCMSET;
+extern unsigned IOCTL_TIOCSPGRP;
+extern unsigned IOCTL_TIOCSWINSZ;
+#if !SANITIZER_HAIKU
+extern unsigned IOCTL_TIOCCONS;
 extern unsigned IOCTL_TIOCPKT;
 extern unsigned IOCTL_TIOCSETD;
-extern unsigned IOCTL_TIOCSPGRP;
 extern unsigned IOCTL_TIOCSTI;
-extern unsigned IOCTL_TIOCSWINSZ;
-#  endif
+#endif
+#endif
 
 extern unsigned IOCTL_FIOCLEX;
 extern unsigned IOCTL_FIOGETOWN;
@@ -1211,25 +1213,19 @@ extern unsigned IOCTL_SIOCSIFFLAGS;
 extern unsigned IOCTL_SIOCSIFMETRIC;
 extern unsigned IOCTL_SIOCSIFMTU;
 extern unsigned IOCTL_SIOCSIFNETMASK;
-extern unsigned IOCTL_SIOCSPGRP;
 #if !SANITIZER_HAIKU
-extern unsigned IOCTL_TIOCCONS;
 extern unsigned IOCTL_TIOCGETD;
 extern unsigned IOCTL_TIOCNOTTY;
-extern unsigned IOCTL_TIOCPKT;
-extern unsigned IOCTL_TIOCSETD;
-extern unsigned IOCTL_TIOCSTI;
 #endif
 extern unsigned IOCTL_TIOCEXCL;
 extern unsigned IOCTL_TIOCGPGRP;
 extern unsigned IOCTL_TIOCGWINSZ;
 extern unsigned IOCTL_TIOCMGET;
-extern unsigned 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
 #if SANITIZER_LINUX && !SANITIZER_ANDROID
 extern unsigned IOCTL_SIOCGETSGCNT;
 extern unsigned IOCTL_SIOCGETVIFCNT;

>From 8641fca344af7f05871a70bc8230898128acf5b1 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 27 Apr 2025 22:37:37 -0400
Subject: [PATCH 07/12] Add missing #

---
 compiler-rt/lib/asan/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt
index 1ccf3fd3fb8c7..3a8043fbb9adb 100644
--- a/compiler-rt/lib/asan/CMakeLists.txt
+++ b/compiler-rt/lib/asan/CMakeLists.txt
@@ -390,7 +390,7 @@ endif()
 
 add_compiler_rt_resource_file(asan_ignorelist asan_ignorelist.txt asan)
 
-On AIX, we need to put asan.link_with_main_exec.txt and asan_cxx.link_with_main_exec.txt
+# On AIX, we need to put asan.link_with_main_exec.txt and asan_cxx.link_with_main_exec.txt
 # to the build and install dir.
 if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
   add_compiler_rt_cfg(asan_symbols asan.link_with_main_exec.txt asan)

>From 35db4098a6200d247106041f027e68e8a60afd2c Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Sun, 27 Apr 2025 23:48:51 -0400
Subject: [PATCH 08/12] Resolve build fail

---
 .../lib/sanitizer_common/sanitizer_platform_limits_posix.h  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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 98466398f8da6..956d679662766 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -560,9 +560,9 @@ struct __sanitizer_dirent64 {
 extern unsigned struct_sock_fprog_sz;
 #endif
 
-#if SANITIZER_HAIKU
+#  if SANITIZER_HAIKU
 typedef int __sanitizer_clock_t;
-#if SANITIZER_AIX
+#  elif SANITIZER_AIX
 typedef int __sanitizer_clock_t;
 typedef int __sanitizer_clockid_t;
 #  elif defined(__x86_64__) && !defined(_LP64)
@@ -1625,6 +1625,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

>From f5ce2a73b9684474d6b5a58690747e558e130431 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Mon, 28 Apr 2025 10:21:37 -0400
Subject: [PATCH 09/12] Add TryReExecWithoutASLR stub

---
 compiler-rt/lib/asan/asan_aix.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/compiler-rt/lib/asan/asan_aix.cpp b/compiler-rt/lib/asan/asan_aix.cpp
index d1a8a5ac8e59d..6131e425d6950 100644
--- a/compiler-rt/lib/asan/asan_aix.cpp
+++ b/compiler-rt/lib/asan/asan_aix.cpp
@@ -19,6 +19,10 @@
 
 namespace __asan {
 
+void TryReExecWithoutASLR() {
+   // Allowed to fail and do nothing.
+ }
+
 void AsanCheckIncompatibleRT() {}
 
 void AsanCheckDynamicRTPrereqs() {}

>From 12653e19bafcad8655ba4f4f89f97c6fb571fd83 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 29 Apr 2025 09:57:32 -0400
Subject: [PATCH 10/12] enable_unmalloced_free_check

---
 compiler-rt/lib/asan/asan_allocator.cpp              | 6 ++----
 compiler-rt/lib/sanitizer_common/sanitizer_flags.inc | 3 ---
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/compiler-rt/lib/asan/asan_allocator.cpp b/compiler-rt/lib/asan/asan_allocator.cpp
index 8a56132bf946a..3a55c2af65653 100644
--- a/compiler-rt/lib/asan/asan_allocator.cpp
+++ b/compiler-rt/lib/asan/asan_allocator.cpp
@@ -797,10 +797,8 @@ struct Allocator {
   void ReportInvalidFree(void *ptr, u8 chunk_state, BufferedStackTrace *stack) {
     if (chunk_state == CHUNK_QUARANTINE)
       ReportDoubleFree((uptr)ptr, stack);
-    else {
-      if (common_flags()->enable_unmalloced_free_check)
-        ReportFreeNotMalloced((uptr)ptr, stack);
-    }
+    else
+      ReportFreeNotMalloced((uptr)ptr, stack);
   }
 
   void CommitBack(AsanThreadLocalMallocStorage *ms, BufferedStackTrace *stack) {
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
index a6c760b2387fb..c1e3530618c20 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_flags.inc
@@ -269,9 +269,6 @@ COMMON_FLAG(bool, detect_write_exec, false,
 COMMON_FLAG(bool, test_only_emulate_no_memorymap, false,
             "TEST ONLY fail to read memory mappings to emulate sanitized "
             "\"init\"")
-COMMON_FLAG(bool, enable_unmalloced_free_check, !SANITIZER_AIX,
-            "if true, FreeNotMalloced error will be reported. Only disable "
-            "this error detecting on AIX by default for now.")
 // With static linking, dladdr((void*)pthread_join) or similar will return the
 // path to the main program. This flag will replace dlopen(<main program,...>
 // with dlopen(NULL,...), which is the correct way to get a handle to the main

>From 26bf8fe8d135543d171571ba7dd42a7d828a5272 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 29 Apr 2025 11:25:00 -0400
Subject: [PATCH 11/12] Fix formatting

---
 compiler-rt/lib/asan/scripts/asan_symbolize.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/compiler-rt/lib/asan/scripts/asan_symbolize.py b/compiler-rt/lib/asan/scripts/asan_symbolize.py
index 466173336d8b1..7cff87b6c9bc9 100755
--- a/compiler-rt/lib/asan/scripts/asan_symbolize.py
+++ b/compiler-rt/lib/asan/scripts/asan_symbolize.py
@@ -450,7 +450,14 @@ def __init__(self, plugin_proxy=None, dsym_hint_producer=None):
             # E.g. in Chrome several binaries may share a single .dSYM.
             self.dsym_hint_producer = dsym_hint_producer
             self.system = os.uname()[0]
-            if self.system not in ["Linux", "Darwin", "FreeBSD", "NetBSD", "SunOS", "AIX"]:
+            if self.system not in [
+                "Linux",
+                "Darwin",
+                "FreeBSD",
+                "NetBSD",
+                "SunOS",
+                "AIX",
+            ]:
                 raise Exception("Unknown system")
             self.llvm_symbolizers = {}
             self.last_llvm_symbolizer = None

>From cc252b9d0097e541a6d38c12ff7217f026fbb846 Mon Sep 17 00:00:00 2001
From: Jake Egan <jake.egan at ibm.com>
Date: Tue, 29 Apr 2025 11:42:04 -0400
Subject: [PATCH 12/12] Fix formatting

---
 compiler-rt/lib/asan/asan_aix.cpp             |  4 +-
 compiler-rt/lib/asan/asan_posix.cpp           |  3 +-
 .../sanitizer_platform_limits_posix.cpp       | 62 +++++++++----------
 .../sanitizer_platform_limits_posix.h         | 33 +++++-----
 4 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/compiler-rt/lib/asan/asan_aix.cpp b/compiler-rt/lib/asan/asan_aix.cpp
index 6131e425d6950..24edc5cf90228 100644
--- a/compiler-rt/lib/asan/asan_aix.cpp
+++ b/compiler-rt/lib/asan/asan_aix.cpp
@@ -20,8 +20,8 @@
 namespace __asan {
 
 void TryReExecWithoutASLR() {
-   // Allowed to fail and do nothing.
- }
+  // Allowed to fail and do nothing.
+}
 
 void AsanCheckIncompatibleRT() {}
 
diff --git a/compiler-rt/lib/asan/asan_posix.cpp b/compiler-rt/lib/asan/asan_posix.cpp
index 43a5cef27ea35..c2f85099a3e36 100644
--- a/compiler-rt/lib/asan/asan_posix.cpp
+++ b/compiler-rt/lib/asan/asan_posix.cpp
@@ -184,8 +184,7 @@ static void AfterFork(bool fork_child) {
 
 void InstallAtForkHandler() {
 #  if SANITIZER_SOLARIS || SANITIZER_NETBSD || SANITIZER_APPLE || \
-      (SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU ||  \
-      SANITIZER_AIX
+      (SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU || SANITIZER_AIX
   // While other Linux targets use clone in internal_fork which doesn't
   // trigger pthread_atfork handlers, Linux/sparc64 uses __fork, causing a
   // hang.
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 61d7549e94e7b..9cbe4c8dac6be 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_AIX && !SANITIZER_HAIKU
-#include <sys/mount.h>
-#endif
-#include <sys/timeb.h>
-#include <utmpx.h>
+#    if !SANITIZER_AIX && !SANITIZER_HAIKU
+#      include <sys/mount.h>
+#    endif
+#    include <sys/timeb.h>
+#    include <utmpx.h>
 #endif
 
 #if SANITIZER_LINUX
@@ -112,15 +112,15 @@ typedef struct user_fpregs elf_fpregset_t;
 #endif
 
 #if !SANITIZER_ANDROID
-#if !SANITIZER_AIX
-#include <ifaddrs.h>
-#else
-#include <netinet/in.h>
-#endif
-#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
@@ -192,10 +192,10 @@ typedef struct user_fpregs elf_fpregset_t;
 #    endif
 #  endif
 
-#if SANITIZER_HAIKU
-#include <sys/sockio.h>
-#include <sys/ioctl.h>
-#endif
+#  if SANITIZER_HAIKU
+#    include <sys/sockio.h>
+#    include <sys/ioctl.h>
+#  endif
 
 // Include these after system headers to avoid name clashes and ambiguities.
 #  include "sanitizer_common.h"
@@ -576,7 +576,7 @@ 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
   uptr IOCTL_FIOASYNC = FIOASYNC;
   uptr IOCTL_FIONBIO = FIONBIO;
   uptr IOCTL_FIOSETOWN = FIOSETOWN;
@@ -590,30 +590,30 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   uptr IOCTL_TIOCSPGRP = TIOCSPGRP;
   uptr IOCTL_TIOCSTI = TIOCSTI;
   uptr IOCTL_TIOCSWINSZ = TIOCSWINSZ;
-#else
+#  else
   unsigned IOCTL_FIONBIO = FIONBIO;
-#if !SANITIZER_HAIKU
+#    if !SANITIZER_HAIKU
   unsigned IOCTL_FIOASYNC = FIOASYNC;
   unsigned IOCTL_FIOSETOWN = FIOSETOWN;
   unsigned IOCTL_TIOCCONS = TIOCCONS;
   unsigned IOCTL_TIOCPKT = TIOCPKT;
   unsigned IOCTL_TIOCSETD = TIOCSETD;
   unsigned IOCTL_TIOCSTI = TIOCSTI;
-#endif
+#    endif
   unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
   unsigned IOCTL_TIOCMBIC = TIOCMBIC;
   unsigned IOCTL_TIOCMBIS = TIOCMBIS;
   unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
   unsigned IOCTL_TIOCMSET = TIOCMSET;
   unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
-#endif
-#if !SANITIZER_HAIKU
+#  endif
+#  if !SANITIZER_HAIKU
   unsigned IOCTL_FIOCLEX = FIOCLEX;
   unsigned IOCTL_FIOGETOWN = FIOGETOWN;
   unsigned IOCTL_FIONCLEX = FIONCLEX;
   unsigned IOCTL_TIOCGETD = TIOCGETD;
   unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
-#endif
+#  endif
   unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
   unsigned IOCTL_SIOCATMARK = SIOCATMARK;
   unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI;
@@ -640,10 +640,10 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
   unsigned IOCTL_TIOCMGET = TIOCMGET;
   unsigned IOCTL_TIOCNXCL = TIOCNXCL;
   unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
-#if !SANITIZER_AIX
+#  if !SANITIZER_AIX
   unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
-#endif
-#if SANITIZER_LINUX && !SANITIZER_ANDROID
+#  endif
+#  if SANITIZER_LINUX && !SANITIZER_ANDROID
   unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
   unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
 #endif
@@ -1039,7 +1039,7 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
 
   const int si_SEGV_MAPERR = SEGV_MAPERR;
   const int si_SEGV_ACCERR = SEGV_ACCERR;
-} // namespace __sanitizer 
+  }  // namespace __sanitizer
 using namespace __sanitizer;
 
 COMPILER_CHECK(sizeof(__sanitizer_pthread_attr_t) >= sizeof(pthread_attr_t));
@@ -1152,7 +1152,7 @@ CHECK_SIZE_AND_OFFSET(dirent, d_ino);
 CHECK_SIZE_AND_OFFSET(dirent, d_seekoff);
 #  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
 CHECK_SIZE_AND_OFFSET(dirent, d_off);
@@ -1297,7 +1297,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 956d679662766..67d3865473e6a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -436,8 +436,8 @@ struct __sanitizer_tm {
   int tm_wday;
   int tm_yday;
   int tm_isdst;
-#if !SANITIZER_AIX
-#if SANITIZER_HAIKU
+#  if !SANITIZER_AIX
+#    if SANITIZER_HAIKU
   int tm_gmtoff;
 #else
   long int tm_gmtoff;
@@ -571,7 +571,7 @@ typedef long long __sanitizer_clock_t;
 typedef long __sanitizer_clock_t;
 #  endif
 
-#if SANITIZER_LINUX || SANITIZER_HAIKU
+#  if SANITIZER_LINUX || SANITIZER_HAIKU
 typedef int __sanitizer_clockid_t;
 typedef unsigned long long __sanitizer_eventfd_t;
 #endif
@@ -825,8 +825,8 @@ struct __sanitizer_addrinfo {
   int ai_family;
   int ai_socktype;
   int ai_protocol;
-#if SANITIZER_ANDROID || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
-#if SANITIZER_AIX // AIX ai_addrlen type is size_t
+#  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;
@@ -1159,7 +1159,7 @@ extern unsigned fpos_t_sz;
 // when it can not be determined without including any system headers.
 extern const unsigned IOCTL_NOT_PRESENT;
 
-#if SANITIZER_AIX
+#  if SANITIZER_AIX
 extern uptr IOCTL_FIOASYNC;
 extern uptr IOCTL_FIONBIO;
 extern uptr IOCTL_FIOSETOWN;
@@ -1173,7 +1173,7 @@ extern uptr IOCTL_TIOCSETD;
 extern uptr IOCTL_TIOCSPGRP;
 extern uptr IOCTL_TIOCSTI;
 extern uptr IOCTL_TIOCSWINSZ;
-#else
+#  else
 extern unsigned IOCTL_FIOASYNC;
 extern unsigned IOCTL_FIONBIO;
 extern unsigned IOCTL_FIOSETOWN;
@@ -1183,13 +1183,13 @@ extern unsigned IOCTL_TIOCMBIS;
 extern unsigned IOCTL_TIOCMSET;
 extern unsigned IOCTL_TIOCSPGRP;
 extern unsigned IOCTL_TIOCSWINSZ;
-#if !SANITIZER_HAIKU
+#    if !SANITIZER_HAIKU
 extern unsigned IOCTL_TIOCCONS;
 extern unsigned IOCTL_TIOCPKT;
 extern unsigned IOCTL_TIOCSETD;
 extern unsigned IOCTL_TIOCSTI;
-#endif
-#endif
+#    endif
+#  endif
 
 extern unsigned IOCTL_FIOCLEX;
 extern unsigned IOCTL_FIOGETOWN;
@@ -1213,20 +1213,20 @@ extern unsigned IOCTL_SIOCSIFFLAGS;
 extern unsigned IOCTL_SIOCSIFMETRIC;
 extern unsigned IOCTL_SIOCSIFMTU;
 extern unsigned IOCTL_SIOCSIFNETMASK;
-#if !SANITIZER_HAIKU
+#  if !SANITIZER_HAIKU
 extern unsigned IOCTL_TIOCGETD;
 extern unsigned IOCTL_TIOCNOTTY;
-#endif
+#  endif
 extern unsigned IOCTL_TIOCEXCL;
 extern unsigned IOCTL_TIOCGPGRP;
 extern unsigned IOCTL_TIOCGWINSZ;
 extern unsigned IOCTL_TIOCMGET;
 extern unsigned IOCTL_TIOCNXCL;
 extern unsigned IOCTL_TIOCOUTQ;
-#if !SANITIZER_AIX
+#  if !SANITIZER_AIX
 extern unsigned IOCTL_TIOCSCTTY;
-#endif
-#if SANITIZER_LINUX && !SANITIZER_ANDROID
+#  endif
+#  if SANITIZER_LINUX && !SANITIZER_ANDROID
 extern unsigned IOCTL_SIOCGETSGCNT;
 extern unsigned IOCTL_SIOCGETVIFCNT;
 #endif
@@ -1625,6 +1625,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



More information about the llvm-commits mailing list