1139823Simp//===-- sanitizer_platform_limits_solaris.h -------------------------------===// 21541Srgrimes// 31541Srgrimes// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41541Srgrimes// See https://llvm.org/LICENSE.txt for license information. 51541Srgrimes// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61541Srgrimes// 71541Srgrimes//===----------------------------------------------------------------------===// 81541Srgrimes// 91541Srgrimes// This file is a part of Sanitizer common code. 101541Srgrimes// 111541Srgrimes// Sizes and layouts of platform-specific Solaris data structures. 121541Srgrimes//===----------------------------------------------------------------------===// 131541Srgrimes 141541Srgrimes#ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H 151541Srgrimes#define SANITIZER_PLATFORM_LIMITS_SOLARIS_H 161541Srgrimes 171541Srgrimes#if SANITIZER_SOLARIS 181541Srgrimes 191541Srgrimes#include "sanitizer_internal_defs.h" 201541Srgrimes#include "sanitizer_platform.h" 211541Srgrimes 221541Srgrimesnamespace __sanitizer { 231541Srgrimesextern unsigned struct_utsname_sz; 241541Srgrimesextern unsigned struct_stat_sz; 251541Srgrimesextern unsigned struct_stat64_sz; 261541Srgrimesextern unsigned struct_rusage_sz; 271541Srgrimesextern unsigned siginfo_t_sz; 281541Srgrimesextern unsigned struct_itimerval_sz; 291541Srgrimesextern unsigned pthread_t_sz; 301541Srgrimesextern unsigned pthread_mutex_t_sz; 311541Srgrimesextern unsigned pthread_cond_t_sz; 321541Srgrimesextern unsigned pid_t_sz; 331541Srgrimesextern unsigned timeval_sz; 341541Srgrimesextern unsigned uid_t_sz; 351541Srgrimesextern unsigned gid_t_sz; 361541Srgrimesextern unsigned mbstate_t_sz; 371541Srgrimesextern unsigned struct_timezone_sz; 38172467Ssilbyextern unsigned struct_tms_sz; 39172467Ssilbyextern unsigned struct_itimerspec_sz; 40172467Ssilbyextern unsigned struct_sigevent_sz; 4132350Seivindextern unsigned struct_stack_t_sz; 42101090Srwatsonextern unsigned struct_sched_param_sz; 43142215Sglebiusextern unsigned struct_statfs64_sz; 4432350Seivindextern unsigned struct_statfs_sz; 451541Srgrimesextern unsigned struct_sockaddr_sz; 4612693Sphkextern unsigned ucontext_t_sz; 4744078Sdfr 4812693Sphkextern unsigned struct_timespec_sz; 491541Srgrimesextern unsigned struct_rlimit_sz; 5012693Sphkextern unsigned struct_utimbuf_sz; 511541Srgrimes 5218892Sbdestruct __sanitizer_sem_t { 531541Srgrimes //u64 data[6]; 541541Srgrimes u32 sem_count; 551541Srgrimes u16 sem_type; 561541Srgrimes u16 sem_magic; 5744165Sjulian u64 sem_pad1[3]; 581541Srgrimes u64 sem_pad2[2]; 598426Swollman}; 6058313Slile 6171963Sjulianstruct __sanitizer_ipc_perm { 621541Srgrimes unsigned int uid; // uid_t 631541Srgrimes unsigned int gid; // gid_t 641541Srgrimes unsigned int cuid; // uid_t 651541Srgrimes unsigned int cgid; // gid_t 661541Srgrimes unsigned int mode; // mode_t 6784931Sfjoe unsigned int seq; // uint_t 6844627Sjulian int key; // key_t 6944627Sjulian#if !defined(_LP64) 70142215Sglebius int pad[4]; 71142215Sglebius#endif 72142215Sglebius}; 73142215Sglebius 74163606Srwatsonstruct __sanitizer_shmid_ds { 75163606Srwatson __sanitizer_ipc_perm shm_perm; 761541Srgrimes unsigned long shm_segsz; // size_t 771541Srgrimes unsigned long shm_flags; // uintptr_t 781541Srgrimes unsigned short shm_lkcnt; // ushort_t 7944078Sdfr int shm_lpid; // pid_t 8012942Swollman int shm_cpid; // pid_t 811541Srgrimes unsigned long shm_nattch; // shmatt_t 8212693Sphk unsigned long shm_cnattch; // ulong_t 8312942Swollman#if defined(_LP64) 841541Srgrimes long shm_atime; // time_t 8512942Swollman long shm_dtime; 86153478Semaste long shm_ctime; 8712693Sphk void *shm_amp; 881541Srgrimes u64 shm_gransize; // uint64_t 891541Srgrimes u64 shm_allocated; // uint64_t 9011225Swollman u64 shm_pad4[1]; // int64_t 91167796Sglebius#else 9211225Swollman long shm_atime; // time_t 93110308Sorion int shm_pad1; // int32_t 94110544Sorion long shm_dtime; // time_t 95152188Sglebius int shm_pad2; // int32_t 9611225Swollman long shm_ctime; // time_t 9712693Sphk void *shm_amp; 98111888Sjlemon u64 shm_gransize; // uint64_t 99120727Ssam u64 shm_allocated; // uint64_t 1001541Srgrimes#endif 10112693Sphk}; 10212942Swollman 10312942Swollmanextern unsigned struct_statvfs_sz; 1043282Swollman#if SANITIZER_SOLARIS32 10512942Swollmanextern unsigned struct_statvfs64_sz; 106153478Semaste#endif 10712942Swollman 108153478Semastestruct __sanitizer_iovec { 10912942Swollman void *iov_base; 110153478Semaste uptr iov_len; 11112693Sphk}; 11292723Salfred 11392723Salfredstruct __sanitizer_ifaddrs { 11492723Salfred struct __sanitizer_ifaddrs *ifa_next; 11592723Salfred char *ifa_name; 116111888Sjlemon u64 ifa_flags; // uint64_t 11792723Salfred void *ifa_addr; // (struct sockaddr *) 118148955Sglebius void *ifa_netmask; // (struct sockaddr *) 119178888Sjulian // This is a union on Linux. 12032350Seivind# ifdef ifa_dstaddr 12192723Salfred# undef ifa_dstaddr 12232350Seivind# endif 12312693Sphk void *ifa_dstaddr; // (struct sockaddr *) 1241541Srgrimes void *ifa_data; 125167796Sglebius}; 1261541Srgrimes 1271541Srgrimestypedef unsigned __sanitizer_pthread_key_t; 128167796Sglebius 1291541Srgrimesstruct __sanitizer_XDR { 130167796Sglebius int x_op; 1311541Srgrimes void *x_ops; 132167796Sglebius uptr x_public; 133167796Sglebius uptr x_private; 134167796Sglebius uptr x_base; 135167796Sglebius unsigned x_handy; 136167796Sglebius}; 137167796Sglebius 138167796Sglebiusconst int __sanitizer_XDR_ENCODE = 0; 139167796Sglebiusconst int __sanitizer_XDR_DECODE = 1; 140148955Sglebiusconst int __sanitizer_XDR_FREE = 2; 141178888Sjulian 142178888Sjulianstruct __sanitizer_passwd { 1431541Srgrimes char *pw_name; 1441541Srgrimes char *pw_passwd; 1451541Srgrimes unsigned int pw_uid; // uid_t 1461541Srgrimes unsigned int pw_gid; // gid_t 1471541Srgrimes char *pw_age; 1485196Swollman char *pw_comment; 149169454Srwatson char *pw_gecos; 1501541Srgrimes char *pw_dir; 151126936Smdodd char *pw_shell; 152126936Smdodd}; 1531541Srgrimes 154138615Smlaierstruct __sanitizer_group { 155138615Smlaier char *gr_name; 1561541Srgrimes char *gr_passwd; 157120727Ssam int gr_gid; 158120727Ssam char **gr_mem; 1591541Srgrimes}; 1601541Srgrimes 161120727Ssamtypedef long __sanitizer_time_t; 162120727Ssam 1631541Srgrimestypedef long __sanitizer_suseconds_t; 1641541Srgrimes 1651541Srgrimesstruct __sanitizer_timeval { 1661541Srgrimes __sanitizer_time_t tv_sec; 1671541Srgrimes __sanitizer_suseconds_t tv_usec; 1681541Srgrimes}; 1691541Srgrimes 1701541Srgrimesstruct __sanitizer_itimerval { 1711541Srgrimes struct __sanitizer_timeval it_interval; 172136960Sbms struct __sanitizer_timeval it_value; 1731541Srgrimes}; 1741541Srgrimes 1751541Srgrimesstruct __sanitizer_timeb { 1761541Srgrimes __sanitizer_time_t time; 1771541Srgrimes unsigned short millitm; 1781541Srgrimes short timezone; 1791541Srgrimes short dstflag; 1801541Srgrimes}; 1811541Srgrimes 1821541Srgrimesstruct __sanitizer_ether_addr { 1831541Srgrimes u8 octet[6]; 184150351Sandre}; 1851541Srgrimes 1861541Srgrimesstruct __sanitizer_tm { 1871541Srgrimes int tm_sec; 1881541Srgrimes int tm_min; 18984931Sfjoe int tm_hour; 19036908Sjulian int tm_mday; 19136908Sjulian int tm_mon; 1921541Srgrimes int tm_year; 1931541Srgrimes int tm_wday; 1941541Srgrimes int tm_yday; 1951541Srgrimes int tm_isdst; 1961541Srgrimes}; 197120727Ssam 198120698Sbmsstruct __sanitizer_msghdr { 199120698Sbms void *msg_name; 200120699Sbms unsigned msg_namelen; 2011541Srgrimes struct __sanitizer_iovec *msg_iov; 2021541Srgrimes unsigned msg_iovlen; 2031541Srgrimes void *msg_control; 2041541Srgrimes unsigned msg_controllen; 2051541Srgrimes int msg_flags; 2061541Srgrimes}; 2071541Srgrimesstruct __sanitizer_cmsghdr { 2081541Srgrimes unsigned cmsg_len; 2091541Srgrimes int cmsg_level; 2101541Srgrimes int cmsg_type; 211120727Ssam}; 2121541Srgrimes 2131541Srgrimes#if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64) 214120727Ssamstruct __sanitizer_dirent { 2151541Srgrimes unsigned long long d_ino; 2161541Srgrimes long long d_off; 217120727Ssam unsigned short d_reclen; 218148955Sglebius // more fields that we don't care about 219148955Sglebius}; 220148955Sglebius#else 221148955Sglebiusstruct __sanitizer_dirent { 222148955Sglebius unsigned long d_ino; 223148955Sglebius long d_off; 224148955Sglebius unsigned short d_reclen; 225148955Sglebius // more fields that we don't care about 2261541Srgrimes}; 2271541Srgrimes#endif 228167796Sglebius 229167796Sglebiusstruct __sanitizer_dirent64 { 23013926Swollman unsigned long long d_ino; 23132350Seivind unsigned long long d_off; 23213926Swollman unsigned short d_reclen; 23313926Swollman // more fields that we don't care about 23413926Swollman}; 23513926Swollman 23613926Swollmantypedef long __sanitizer_clock_t; 23787776Sjlemontypedef int __sanitizer_clockid_t; 23887776Sjlemon 23913926Swollman// This thing depends on the platform. We are only interested in the upper 24013926Swollman// limit. Verified with a compiler assert in .cpp. 24113926Swollmanunion __sanitizer_pthread_attr_t { 24216576Speter char size[128]; 24313926Swollman void *align; 24413926Swollman}; 24584931Sfjoe 24684931Sfjoestruct __sanitizer_sigset_t { 24784931Sfjoe // uint32_t * 4 24816576Speter unsigned int __bits[4]; 24913926Swollman}; 25032350Seivind 25113926Swollmanstruct __sanitizer_siginfo { 252138615Smlaier // The size is determined by looking at sizeof of real siginfo_t on linux. 253138615Smlaier u64 opaque[128 / sizeof(u64)]; 254138615Smlaier}; 255138615Smlaier 256138615Smlaierusing __sanitizer_sighandler_ptr = void (*)(int sig); 257138615Smlaierusing __sanitizer_sigactionhandler_ptr = 258138615Smlaier void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx); 2591541Srgrimes 2601541Srgrimesstruct __sanitizer_sigaction { 2611541Srgrimes int sa_flags; 2621541Srgrimes union { 2631541Srgrimes __sanitizer_sigactionhandler_ptr sigaction; 2641541Srgrimes __sanitizer_sighandler_ptr handler; 2651541Srgrimes }; 2661541Srgrimes __sanitizer_sigset_t sa_mask; 2671541Srgrimes#if !defined(_LP64) 2681541Srgrimes int sa_resv[2]; 2691541Srgrimes#endif 270128398Sluigi}; 27184931Sfjoe 272162586Sjmgstruct __sanitizer_kernel_sigset_t { 2738090Spst u8 sig[8]; 274162586Sjmg}; 275162586Sjmg 2761541Srgrimesstruct __sanitizer_kernel_sigaction_t { 277138615Smlaier union { 278138615Smlaier void (*handler)(int signo); 279138615Smlaier void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx); 280138615Smlaier }; 281138615Smlaier unsigned long sa_flags; 282138615Smlaier void (*sa_restorer)(void); 283138615Smlaier __sanitizer_kernel_sigset_t sa_mask; 284138615Smlaier}; 285138615Smlaier 286138615Smlaierextern const uptr sig_ign; 287138615Smlaierextern const uptr sig_dfl; 2881541Srgrimesextern const uptr sig_err; 2891541Srgrimesextern const uptr sa_siginfo; 2901541Srgrimes 2911541Srgrimesextern int af_inet; 292167796Sglebiusextern int af_inet6; 2931541Srgrimesuptr __sanitizer_in_addr_sz(int af); 294167796Sglebius 295167796Sglebiusstruct __sanitizer_dl_phdr_info { 296167796Sglebius uptr dlpi_addr; 297148955Sglebius const char *dlpi_name; 2981541Srgrimes const void *dlpi_phdr; 2991541Srgrimes short dlpi_phnum; 3001541Srgrimes}; 3011541Srgrimes 3021541Srgrimesextern unsigned struct_ElfW_Phdr_sz; 3031541Srgrimes 3041541Srgrimesstruct __sanitizer_addrinfo { 3051541Srgrimes int ai_flags; 3061541Srgrimes int ai_family; 3071541Srgrimes int ai_socktype; 3081541Srgrimes int ai_protocol; 3091541Srgrimes#if defined(__sparcv9) 3101541Srgrimes int _ai_pad; 311169454Srwatson#endif 312169454Srwatson unsigned ai_addrlen; 3131541Srgrimes char *ai_canonname; 314126936Smdodd void *ai_addr; 315126936Smdodd struct __sanitizer_addrinfo *ai_next; 3161541Srgrimes}; 3171541Srgrimes 318111119Simpstruct __sanitizer_hostent { 3191541Srgrimes char *h_name; 320127261Smdodd char **h_aliases; 321127261Smdodd int h_addrtype; 322127277Smdodd int h_length; 323127277Smdodd char **h_addr_list; 324127277Smdodd}; 325127261Smdodd 326101090Srwatsonstruct __sanitizer_pollfd { 327173095Srwatson int fd; 328101090Srwatson short events; 32984931Sfjoe short revents; 33084931Sfjoe}; 33184931Sfjoe 33284931Sfjoetypedef unsigned long __sanitizer_nfds_t; 333127261Smdodd 334127261Smdoddstruct __sanitizer_glob_t { 335127261Smdodd uptr gl_pathc; 336127261Smdodd char **gl_pathv; 337127261Smdodd uptr gl_offs; 338127261Smdodd char **gl_pathp; 339127261Smdodd int gl_pathn; 34084931Sfjoe}; 341127261Smdodd 3421541Srgrimesextern int glob_nomatch; 3431541Srgrimesextern int glob_altdirfunc; 3441541Srgrimesextern const int wordexp_wrde_dooffs; 345128636Sluigi 346128636Sluigiextern unsigned path_max; 347128636Sluigi 348175025Sjulianstruct __sanitizer_wordexp_t { 349175025Sjulian uptr we_wordc; 350128636Sluigi char **we_wordv; 351128636Sluigi uptr we_offs; 352128636Sluigi char **we_wordp; 353128636Sluigi int we_wordn; 354128636Sluigi}; 355128636Sluigi 356175025Sjuliantypedef void __sanitizer_FILE; 3571541Srgrimes#define SANITIZER_HAS_STRUCT_FILE 0 3581541Srgrimes 359128636Sluigi// This simplifies generic code 360169454Srwatson#define struct_shminfo_sz -1 3611541Srgrimes#define struct_shm_info_sz -1 362148955Sglebius#define shmctl_shm_stat -1 363148955Sglebius#define shmctl_ipc_info -1 3641541Srgrimes#define shmctl_shm_info -1 365128636Sluigi 366178888Sjulianextern int shmctl_ipc_stat; 3671541Srgrimes 368175025Sjulianextern unsigned struct_utmp_sz; 369175025Sjulianextern unsigned struct_utmpx_sz; 370175025Sjulian 371175025Sjulianextern int map_fixed; 372175025Sjulian 373175025Sjulian// ioctl arguments 374175025Sjulianstruct __sanitizer_ifconf { 375175025Sjulian int ifc_len; 376175025Sjulian union { 377175025Sjulian void *ifcu_req; 378175025Sjulian } ifc_ifcu; 379175025Sjulian}; 380178888Sjulian 3811541Srgrimes// <sys/ioccom.h> 382148955Sglebius#define IOC_NRBITS 8 383148955Sglebius#define IOC_TYPEBITS 8 384178888Sjulian#define IOC_SIZEBITS 12 385178888Sjulian#define IOC_DIRBITS 4 386178888Sjulian#undef IOC_NONE 387178888Sjulian#define IOC_NONE 2U // IOC_VOID 388148955Sglebius#define IOC_READ 4U // IOC_OUT 389148955Sglebius#define IOC_WRITE 8U // IOC_IN 390148955Sglebius 391148955Sglebius#define IOC_NRMASK ((1 << IOC_NRBITS) - 1) 3921541Srgrimes#define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1) 393148955Sglebius#define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1) 394148955Sglebius#define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1) 3951541Srgrimes#define IOC_NRSHIFT 0 396148955Sglebius#define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS) 397148955Sglebius#define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS) 398178888Sjulian#define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS) 399178888Sjulian 400178888Sjulian#define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK) 401178888Sjulian#define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK) 402178888Sjulian#define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK) 403178888Sjulian 404148955Sglebius#if defined(__sparc__) 405178888Sjulian// In sparc the 14 bits SIZE field overlaps with the 406148955Sglebius// least significant bit of DIR, so either IOC_READ or 407148955Sglebius// IOC_WRITE shall be 1 in order to get a non-zero SIZE. 408148955Sglebius#define IOC_SIZE(nr) \ 409148955Sglebius ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff)) 410148955Sglebius#else 411148955Sglebius#define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK) 412148955Sglebius#endif 413148955Sglebius 414148955Sglebiusextern unsigned struct_ifreq_sz; 415148955Sglebiusextern unsigned struct_termios_sz; 416148955Sglebiusextern unsigned struct_winsize_sz; 417148955Sglebius 418148955Sglebiusextern unsigned struct_sioc_sg_req_sz; 419148955Sglebiusextern unsigned struct_sioc_vif_req_sz; 420148955Sglebius 421148955Sglebius// ioctl request identifiers 4221541Srgrimes 4231541Srgrimes// A special value to mark ioctls that are not present on the target platform, 4241541Srgrimes// when it can not be determined without including any system headers. 4251541Srgrimesextern const unsigned IOCTL_NOT_PRESENT; 4261541Srgrimes 4271541Srgrimesextern unsigned IOCTL_FIOASYNC; 428150351Sandreextern unsigned IOCTL_FIOCLEX; 4291541Srgrimesextern unsigned IOCTL_FIOGETOWN; 430149909Sglebiusextern unsigned IOCTL_FIONBIO; 431149909Sglebiusextern unsigned IOCTL_FIONCLEX; 432149909Sglebiusextern unsigned IOCTL_FIOSETOWN; 43392802Sorionextern unsigned IOCTL_SIOCADDMULTI; 43492802Sorionextern unsigned IOCTL_SIOCATMARK; 435152188Sglebiusextern unsigned IOCTL_SIOCDELMULTI; 43692802Sorionextern unsigned IOCTL_SIOCGIFADDR; 43792802Sorionextern unsigned IOCTL_SIOCGIFBRDADDR; 438150351Sandreextern unsigned IOCTL_SIOCGIFCONF; 439149909Sglebiusextern unsigned IOCTL_SIOCGIFDSTADDR; 440149909Sglebiusextern unsigned IOCTL_SIOCGIFFLAGS; 441149909Sglebiusextern unsigned IOCTL_SIOCGIFMETRIC; 442110544Sorionextern unsigned IOCTL_SIOCGIFMTU; 443149909Sglebiusextern unsigned IOCTL_SIOCGIFNETMASK; 444149909Sglebiusextern unsigned IOCTL_SIOCGPGRP; 445149909Sglebiusextern unsigned IOCTL_SIOCSIFADDR; 446149909Sglebiusextern unsigned IOCTL_SIOCSIFBRDADDR; 44792802Sorionextern unsigned IOCTL_SIOCSIFDSTADDR; 44892802Sorionextern unsigned IOCTL_SIOCSIFFLAGS; 449148955Sglebiusextern unsigned IOCTL_SIOCSIFMETRIC; 450128636Sluigiextern unsigned IOCTL_SIOCSIFMTU; 4511541Srgrimesextern unsigned IOCTL_SIOCSIFNETMASK; 4521541Srgrimesextern unsigned IOCTL_SIOCSPGRP; 453120626Sruextern unsigned IOCTL_TIOCEXCL; 45478295Sjlemonextern unsigned IOCTL_TIOCGETD; 45578295Sjlemonextern unsigned IOCTL_TIOCGPGRP; 45678295Sjlemonextern unsigned IOCTL_TIOCGWINSZ; 45778295Sjlemonextern unsigned IOCTL_TIOCMBIC; 458120626Sruextern unsigned IOCTL_TIOCMBIS; 459148955Sglebiusextern unsigned IOCTL_TIOCMGET; 46087410Sruextern unsigned IOCTL_TIOCMSET; 461128636Sluigiextern unsigned IOCTL_TIOCNOTTY; 46287410Sruextern unsigned IOCTL_TIOCNXCL; 46378295Sjlemonextern unsigned IOCTL_TIOCOUTQ; 4641541Srgrimesextern unsigned IOCTL_TIOCPKT; 4651541Srgrimesextern unsigned IOCTL_TIOCSCTTY; 4661541Srgrimesextern unsigned IOCTL_TIOCSETD; 4671541Srgrimesextern unsigned IOCTL_TIOCSPGRP; 468175025Sjulianextern unsigned IOCTL_TIOCSTI; 469175025Sjulianextern unsigned IOCTL_TIOCSWINSZ; 470175025Sjulianextern unsigned IOCTL_MTIOCGET; 471175025Sjulianextern unsigned IOCTL_MTIOCTOP; 472174699Skmacy 473152188Sglebiusextern const int si_SEGV_MAPERR; 4741541Srgrimesextern const int si_SEGV_ACCERR; 475152188Sglebius} // namespace __sanitizer 476152188Sglebius 477152188Sglebius#define CHECK_TYPE_SIZE(TYPE) \ 478152188Sglebius COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE)) 479152188Sglebius 480152188Sglebius#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER) \ 481152188Sglebius COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \ 482152188Sglebius sizeof(((CLASS *) NULL)->MEMBER)); \ 483152188Sglebius COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) == \ 484152188Sglebius offsetof(CLASS, MEMBER)) 485152188Sglebius 486166010Smaxim// For sigaction, which is a function and struct at the same time, 487152188Sglebius// and thus requires explicit "struct" in sizeof() expression. 488152188Sglebius#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER) \ 489152188Sglebius COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \ 490152188Sglebius sizeof(((struct CLASS *) NULL)->MEMBER)); \ 491167796Sglebius COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) == \ 492166010Smaxim offsetof(struct CLASS, MEMBER)) 493152188Sglebius 494152188Sglebius#endif // SANITIZER_SOLARIS 495152188Sglebius 496152188Sglebius#endif 497152188Sglebius