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