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..ca6003ad71084 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,11 +61,11 @@ #endif #if !SANITIZER_ANDROID -#if !SANITIZER_HAIKU -#include -#endif -#include -#include +# if !SANITIZER_HAIKU && !SANITIZER_AIX +# include +# endif +# include +# include #endif #if SANITIZER_LINUX @@ -112,11 +112,15 @@ typedef struct user_fpregs elf_fpregset_t; #endif #if !SANITIZER_ANDROID -#include -#if !SANITIZER_HAIKU -#include -#include -#endif +# if !SANITIZER_AIX +# include +# else +# include +# endif +# if !SANITIZER_HAIKU +# include +# include +# endif #endif #if SANITIZER_LINUX @@ -182,6 +186,17 @@ typedef struct user_fpregs elf_fpregset_t; #include #endif +# if SANITIZER_AIX +# include +# include +# include +# include +# include +# if HAVE_RPC_XDR_H +# include +# endif +# endif + // Include these after system headers to avoid name clashes and ambiguities. # include "sanitizer_common.h" # include "sanitizer_internal_defs.h" @@ -557,14 +572,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr); const unsigned IOCTL_NOT_PRESENT = 0; - unsigned IOCTL_FIONBIO = FIONBIO; -#if !SANITIZER_HAIKU - unsigned IOCTL_FIOASYNC = FIOASYNC; + ioctl_alttype IOCTL_FIONBIO = FIONBIO; +# if !SANITIZER_HAIKU + ioctl_alttype IOCTL_FIOASYNC = FIOASYNC; unsigned IOCTL_FIOCLEX = FIOCLEX; unsigned IOCTL_FIOGETOWN = FIOGETOWN; unsigned IOCTL_FIONCLEX = FIONCLEX; - unsigned IOCTL_FIOSETOWN = FIOSETOWN; -#endif + ioctl_alttype IOCTL_FIOSETOWN = FIOSETOWN; +# endif unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI; unsigned IOCTL_SIOCATMARK = SIOCATMARK; unsigned IOCTL_SIOCDELMULTI = SIOCDELMULTI; @@ -584,30 +599,32 @@ 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; +# if !SANITIZER_HAIKU + 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; -#endif + 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; -#if SANITIZER_LINUX && !SANITIZER_ANDROID +# endif + ioctl_alttype IOCTL_TIOCSPGRP = TIOCSPGRP; + ioctl_alttype IOCTL_TIOCSWINSZ = TIOCSWINSZ; +# if SANITIZER_LINUX && !SANITIZER_ANDROID unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT; unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT; #endif @@ -1069,6 +1086,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); @@ -1115,11 +1135,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_FREEBSD || SANITIZER_HAIKU +# 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 @@ -1194,6 +1216,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); @@ -1205,10 +1231,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 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); @@ -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..1d4af80a42761 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_HAIKU +# 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 }; @@ -545,7 +560,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; @@ -556,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 @@ -609,6 +626,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 +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 @@ -810,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 { @@ -826,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; @@ -864,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 +1158,19 @@ 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; +// 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; -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 +1190,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 +1612,7 @@ 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..cda0f4450d4b7 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp @@ -27,12 +27,13 @@ #include #include -#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 -#define MAP_NORESERVE 0 -#endif +// Similarly, AIX does not define MAP_NORESERVE. +# undef MAP_NORESERVE +# define MAP_NORESERVE 0 +# endif namespace __sanitizer {