1326943Sdim//===-- sanitizer_platform_limits_solaris.h -------------------------------===//
2326943Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326943Sdim//
7326943Sdim//===----------------------------------------------------------------------===//
8326943Sdim//
9326943Sdim// This file is a part of Sanitizer common code.
10326943Sdim//
11326943Sdim// Sizes and layouts of platform-specific Solaris data structures.
12326943Sdim//===----------------------------------------------------------------------===//
13326943Sdim
14326943Sdim#ifndef SANITIZER_PLATFORM_LIMITS_SOLARIS_H
15326943Sdim#define SANITIZER_PLATFORM_LIMITS_SOLARIS_H
16326943Sdim
17326943Sdim#if SANITIZER_SOLARIS
18326943Sdim
19326943Sdim#include "sanitizer_internal_defs.h"
20326943Sdim#include "sanitizer_platform.h"
21326943Sdim
22326943Sdimnamespace __sanitizer {
23326943Sdimextern unsigned struct_utsname_sz;
24326943Sdimextern unsigned struct_stat_sz;
25326943Sdimextern unsigned struct_stat64_sz;
26326943Sdimextern unsigned struct_rusage_sz;
27326943Sdimextern unsigned siginfo_t_sz;
28326943Sdimextern unsigned struct_itimerval_sz;
29326943Sdimextern unsigned pthread_t_sz;
30326943Sdimextern unsigned pthread_mutex_t_sz;
31326943Sdimextern unsigned pthread_cond_t_sz;
32326943Sdimextern unsigned pid_t_sz;
33326943Sdimextern unsigned timeval_sz;
34326943Sdimextern unsigned uid_t_sz;
35326943Sdimextern unsigned gid_t_sz;
36326943Sdimextern unsigned mbstate_t_sz;
37326943Sdimextern unsigned struct_timezone_sz;
38326943Sdimextern unsigned struct_tms_sz;
39326943Sdimextern unsigned struct_itimerspec_sz;
40326943Sdimextern unsigned struct_sigevent_sz;
41326943Sdimextern unsigned struct_sched_param_sz;
42326943Sdimextern unsigned struct_statfs64_sz;
43326943Sdimextern unsigned struct_statfs_sz;
44326943Sdimextern unsigned struct_sockaddr_sz;
45326943Sdimextern unsigned ucontext_t_sz;
46326943Sdim
47326943Sdimextern unsigned struct_timespec_sz;
48326943Sdimextern unsigned struct_rlimit_sz;
49326943Sdimextern unsigned struct_utimbuf_sz;
50326943Sdim
51326943Sdimstruct __sanitizer_sem_t {
52326943Sdim  //u64 data[6];
53326943Sdim  u32 sem_count;
54326943Sdim  u16 sem_type;
55326943Sdim  u16 sem_magic;
56326943Sdim  u64 sem_pad1[3];
57326943Sdim  u64 sem_pad2[2];
58326943Sdim};
59326943Sdim
60326943Sdimstruct __sanitizer_ipc_perm {
61326943Sdim  unsigned int uid;           // uid_t
62326943Sdim  unsigned int gid;           // gid_t
63326943Sdim  unsigned int cuid;          // uid_t
64326943Sdim  unsigned int cgid;          // gid_t
65326943Sdim  unsigned int mode;          // mode_t
66326943Sdim  unsigned int seq;           // uint_t
67326943Sdim  int key;                    // key_t
68326943Sdim#if !defined(_LP64)
69326943Sdim  int pad[4];
70326943Sdim#endif
71360784Sdim};
72326943Sdim
73326943Sdimstruct __sanitizer_shmid_ds {
74326943Sdim  __sanitizer_ipc_perm shm_perm;
75326943Sdim  unsigned long shm_segsz;    // size_t
76326943Sdim  unsigned long shm_flags;    // uintptr_t
77326943Sdim  unsigned short shm_lkcnt;   // ushort_t
78326943Sdim  int shm_lpid;               // pid_t
79326943Sdim  int shm_cpid;               // pid_t
80326943Sdim  unsigned long shm_nattch;   // shmatt_t
81326943Sdim  unsigned long shm_cnattch;  // ulong_t
82326943Sdim#if defined(_LP64)
83326943Sdim  long shm_atime;             // time_t
84326943Sdim  long shm_dtime;
85326943Sdim  long shm_ctime;
86326943Sdim  void *shm_amp;
87326943Sdim  u64 shm_gransize;           // uint64_t
88326943Sdim  u64 shm_allocated;          // uint64_t
89326943Sdim  u64 shm_pad4[1];            // int64_t
90326943Sdim#else
91326943Sdim  long shm_atime;             // time_t
92326943Sdim  int shm_pad1;               // int32_t
93326943Sdim  long shm_dtime;             // time_t
94326943Sdim  int shm_pad2;               // int32_t
95326943Sdim  long shm_ctime;             // time_t
96326943Sdim  void *shm_amp;
97326943Sdim  u64 shm_gransize;           // uint64_t
98326943Sdim  u64 shm_allocated;          // uint64_t
99326943Sdim#endif
100326943Sdim};
101326943Sdim
102326943Sdimextern unsigned struct_statvfs_sz;
103326943Sdim#if SANITIZER_SOLARIS32
104326943Sdimextern unsigned struct_statvfs64_sz;
105326943Sdim#endif
106326943Sdim
107326943Sdimstruct __sanitizer_iovec {
108326943Sdim  void *iov_base;
109326943Sdim  uptr iov_len;
110326943Sdim};
111326943Sdim
112326943Sdimstruct __sanitizer_ifaddrs {
113326943Sdim  struct __sanitizer_ifaddrs *ifa_next;
114326943Sdim  char *ifa_name;
115326943Sdim  u64 ifa_flags;     // uint64_t
116326943Sdim  void *ifa_addr;    // (struct sockaddr *)
117326943Sdim  void *ifa_netmask; // (struct sockaddr *)
118326943Sdim  // This is a union on Linux.
119326943Sdim# ifdef ifa_dstaddr
120326943Sdim# undef ifa_dstaddr
121326943Sdim# endif
122326943Sdim  void *ifa_dstaddr; // (struct sockaddr *)
123326943Sdim  void *ifa_data;
124326943Sdim};
125326943Sdim
126326943Sdimtypedef unsigned __sanitizer_pthread_key_t;
127326943Sdim
128326943Sdimstruct __sanitizer_XDR {
129326943Sdim  int x_op;
130326943Sdim  void *x_ops;
131326943Sdim  uptr x_public;
132326943Sdim  uptr x_private;
133326943Sdim  uptr x_base;
134326943Sdim  unsigned x_handy;
135326943Sdim};
136326943Sdim
137326943Sdimconst int __sanitizer_XDR_ENCODE = 0;
138326943Sdimconst int __sanitizer_XDR_DECODE = 1;
139326943Sdimconst int __sanitizer_XDR_FREE = 2;
140326943Sdim
141326943Sdimstruct __sanitizer_passwd {
142326943Sdim  char *pw_name;
143326943Sdim  char *pw_passwd;
144326943Sdim  unsigned int pw_uid;    // uid_t
145326943Sdim  unsigned int pw_gid;    // gid_t
146326943Sdim  char *pw_age;
147326943Sdim  char *pw_comment;
148326943Sdim  char *pw_gecos;
149326943Sdim  char *pw_dir;
150326943Sdim  char *pw_shell;
151326943Sdim};
152326943Sdim
153326943Sdimstruct __sanitizer_group {
154326943Sdim  char *gr_name;
155326943Sdim  char *gr_passwd;
156326943Sdim  int gr_gid;
157326943Sdim  char **gr_mem;
158326943Sdim};
159326943Sdim
160326943Sdimtypedef long __sanitizer_time_t;
161326943Sdim
162341825Sdimtypedef long __sanitizer_suseconds_t;
163341825Sdim
164341825Sdimstruct __sanitizer_timeval {
165341825Sdim  __sanitizer_time_t tv_sec;
166341825Sdim  __sanitizer_suseconds_t tv_usec;
167341825Sdim};
168341825Sdim
169341825Sdimstruct __sanitizer_itimerval {
170341825Sdim  struct __sanitizer_timeval it_interval;
171341825Sdim  struct __sanitizer_timeval it_value;
172341825Sdim};
173341825Sdim
174326943Sdimstruct __sanitizer_timeb {
175326943Sdim  __sanitizer_time_t time;
176326943Sdim  unsigned short millitm;
177326943Sdim  short timezone;
178326943Sdim  short dstflag;
179326943Sdim};
180326943Sdim
181326943Sdimstruct __sanitizer_ether_addr {
182326943Sdim  u8 octet[6];
183326943Sdim};
184326943Sdim
185326943Sdimstruct __sanitizer_tm {
186326943Sdim  int tm_sec;
187326943Sdim  int tm_min;
188326943Sdim  int tm_hour;
189326943Sdim  int tm_mday;
190326943Sdim  int tm_mon;
191326943Sdim  int tm_year;
192326943Sdim  int tm_wday;
193326943Sdim  int tm_yday;
194326943Sdim  int tm_isdst;
195326943Sdim};
196326943Sdim
197326943Sdimstruct __sanitizer_msghdr {
198326943Sdim  void *msg_name;
199326943Sdim  unsigned msg_namelen;
200326943Sdim  struct __sanitizer_iovec *msg_iov;
201326943Sdim  unsigned msg_iovlen;
202326943Sdim  void *msg_control;
203326943Sdim  unsigned msg_controllen;
204326943Sdim  int msg_flags;
205326943Sdim};
206326943Sdimstruct __sanitizer_cmsghdr {
207326943Sdim  unsigned cmsg_len;
208326943Sdim  int cmsg_level;
209326943Sdim  int cmsg_type;
210326943Sdim};
211326943Sdim
212344779Sdim#if SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)
213326943Sdimstruct __sanitizer_dirent {
214326943Sdim  unsigned long long d_ino;
215326943Sdim  long long d_off;
216326943Sdim  unsigned short d_reclen;
217326943Sdim  // more fields that we don't care about
218326943Sdim};
219326943Sdim#else
220326943Sdimstruct __sanitizer_dirent {
221326943Sdim  unsigned long d_ino;
222326943Sdim  long d_off;
223326943Sdim  unsigned short d_reclen;
224326943Sdim  // more fields that we don't care about
225326943Sdim};
226326943Sdim#endif
227326943Sdim
228326943Sdimstruct __sanitizer_dirent64 {
229326943Sdim  unsigned long long d_ino;
230326943Sdim  unsigned long long d_off;
231326943Sdim  unsigned short d_reclen;
232326943Sdim  // more fields that we don't care about
233326943Sdim};
234326943Sdim
235326943Sdimtypedef long __sanitizer_clock_t;
236326943Sdimtypedef int __sanitizer_clockid_t;
237326943Sdim
238326943Sdim// This thing depends on the platform. We are only interested in the upper
239360784Sdim// limit. Verified with a compiler assert in .cpp.
240326943Sdimunion __sanitizer_pthread_attr_t {
241360784Sdim  char size[128];
242326943Sdim  void *align;
243326943Sdim};
244326943Sdim
245326943Sdimstruct __sanitizer_sigset_t {
246326943Sdim  // uint32_t * 4
247326943Sdim  unsigned int __bits[4];
248326943Sdim};
249326943Sdim
250326943Sdimstruct __sanitizer_siginfo {
251326943Sdim  // The size is determined by looking at sizeof of real siginfo_t on linux.
252326943Sdim  u64 opaque[128 / sizeof(u64)];
253326943Sdim};
254326943Sdim
255326943Sdimusing __sanitizer_sighandler_ptr = void (*)(int sig);
256326943Sdimusing __sanitizer_sigactionhandler_ptr =
257326943Sdim    void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);
258326943Sdim
259326943Sdimstruct __sanitizer_sigaction {
260326943Sdim  int sa_flags;
261326943Sdim  union {
262326943Sdim    __sanitizer_sigactionhandler_ptr sigaction;
263326943Sdim    __sanitizer_sighandler_ptr handler;
264326943Sdim  };
265326943Sdim  __sanitizer_sigset_t sa_mask;
266326943Sdim#if !defined(_LP64)
267326943Sdim  int sa_resv[2];
268326943Sdim#endif
269326943Sdim};
270326943Sdim
271326943Sdimstruct __sanitizer_kernel_sigset_t {
272326943Sdim  u8 sig[8];
273326943Sdim};
274326943Sdim
275326943Sdimstruct __sanitizer_kernel_sigaction_t {
276326943Sdim  union {
277326943Sdim    void (*handler)(int signo);
278326943Sdim    void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
279326943Sdim  };
280326943Sdim  unsigned long sa_flags;
281326943Sdim  void (*sa_restorer)(void);
282326943Sdim  __sanitizer_kernel_sigset_t sa_mask;
283326943Sdim};
284326943Sdim
285326943Sdimextern const uptr sig_ign;
286326943Sdimextern const uptr sig_dfl;
287326943Sdimextern const uptr sig_err;
288326943Sdimextern const uptr sa_siginfo;
289326943Sdim
290326943Sdimextern int af_inet;
291326943Sdimextern int af_inet6;
292326943Sdimuptr __sanitizer_in_addr_sz(int af);
293326943Sdim
294326943Sdimstruct __sanitizer_dl_phdr_info {
295326943Sdim  uptr dlpi_addr;
296326943Sdim  const char *dlpi_name;
297326943Sdim  const void *dlpi_phdr;
298326943Sdim  short dlpi_phnum;
299326943Sdim};
300326943Sdim
301326943Sdimextern unsigned struct_ElfW_Phdr_sz;
302326943Sdim
303326943Sdimstruct __sanitizer_addrinfo {
304326943Sdim  int ai_flags;
305326943Sdim  int ai_family;
306326943Sdim  int ai_socktype;
307326943Sdim  int ai_protocol;
308326943Sdim#if defined(__sparcv9)
309326943Sdim  int _ai_pad;
310326943Sdim#endif
311326943Sdim  unsigned ai_addrlen;
312326943Sdim  char *ai_canonname;
313326943Sdim  void *ai_addr;
314326943Sdim  struct __sanitizer_addrinfo *ai_next;
315326943Sdim};
316326943Sdim
317326943Sdimstruct __sanitizer_hostent {
318326943Sdim  char *h_name;
319326943Sdim  char **h_aliases;
320326943Sdim  int h_addrtype;
321326943Sdim  int h_length;
322326943Sdim  char **h_addr_list;
323326943Sdim};
324326943Sdim
325326943Sdimstruct __sanitizer_pollfd {
326326943Sdim  int fd;
327326943Sdim  short events;
328326943Sdim  short revents;
329326943Sdim};
330326943Sdim
331326943Sdimtypedef unsigned long __sanitizer_nfds_t;
332326943Sdim
333326943Sdimstruct __sanitizer_glob_t {
334326943Sdim  uptr gl_pathc;
335326943Sdim  char **gl_pathv;
336326943Sdim  uptr gl_offs;
337326943Sdim  char **gl_pathp;
338326943Sdim  int gl_pathn;
339326943Sdim};
340326943Sdim
341326943Sdimextern int glob_nomatch;
342326943Sdimextern int glob_altdirfunc;
343326943Sdim
344326943Sdimextern unsigned path_max;
345326943Sdim
346326943Sdimstruct __sanitizer_wordexp_t {
347326943Sdim  uptr we_wordc;
348326943Sdim  char **we_wordv;
349326943Sdim  uptr we_offs;
350326943Sdim  char **we_wordp;
351326943Sdim  int we_wordn;
352326943Sdim};
353326943Sdim
354326943Sdimtypedef void __sanitizer_FILE;
355326943Sdim#define SANITIZER_HAS_STRUCT_FILE 0
356326943Sdim
357326943Sdim// This simplifies generic code
358326943Sdim#define struct_shminfo_sz -1
359326943Sdim#define struct_shm_info_sz -1
360326943Sdim#define shmctl_shm_stat -1
361326943Sdim#define shmctl_ipc_info -1
362326943Sdim#define shmctl_shm_info -1
363326943Sdim
364326943Sdimextern int shmctl_ipc_stat;
365326943Sdim
366326943Sdimextern unsigned struct_utmp_sz;
367326943Sdimextern unsigned struct_utmpx_sz;
368326943Sdim
369326943Sdimextern int map_fixed;
370326943Sdim
371326943Sdim// ioctl arguments
372326943Sdimstruct __sanitizer_ifconf {
373326943Sdim  int ifc_len;
374326943Sdim  union {
375326943Sdim    void *ifcu_req;
376326943Sdim  } ifc_ifcu;
377326943Sdim};
378326943Sdim
379326943Sdim// <sys/ioccom.h>
380326943Sdim#define IOC_NRBITS 8
381326943Sdim#define IOC_TYPEBITS 8
382326943Sdim#define IOC_SIZEBITS 12
383326943Sdim#define IOC_DIRBITS 4
384326943Sdim#undef IOC_NONE
385326943Sdim#define IOC_NONE 2U     // IOC_VOID
386326943Sdim#define IOC_READ 4U     // IOC_OUT
387326943Sdim#define IOC_WRITE 8U    // IOC_IN
388326943Sdim
389326943Sdim#define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
390326943Sdim#define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
391326943Sdim#define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
392326943Sdim#define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
393326943Sdim#define IOC_NRSHIFT 0
394326943Sdim#define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
395326943Sdim#define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
396326943Sdim#define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
397326943Sdim
398326943Sdim#define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
399326943Sdim#define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
400326943Sdim#define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)
401326943Sdim
402326943Sdim#if defined(__sparc__)
403326943Sdim// In sparc the 14 bits SIZE field overlaps with the
404326943Sdim// least significant bit of DIR, so either IOC_READ or
405326943Sdim// IOC_WRITE shall be 1 in order to get a non-zero SIZE.
406326943Sdim#define IOC_SIZE(nr) \
407326943Sdim  ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
408326943Sdim#else
409326943Sdim#define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
410326943Sdim#endif
411326943Sdim
412326943Sdimextern unsigned struct_ifreq_sz;
413326943Sdimextern unsigned struct_termios_sz;
414326943Sdimextern unsigned struct_winsize_sz;
415326943Sdim
416326943Sdimextern unsigned struct_sioc_sg_req_sz;
417326943Sdimextern unsigned struct_sioc_vif_req_sz;
418326943Sdim
419326943Sdim// ioctl request identifiers
420326943Sdim
421326943Sdim// A special value to mark ioctls that are not present on the target platform,
422326943Sdim// when it can not be determined without including any system headers.
423326943Sdimextern const unsigned IOCTL_NOT_PRESENT;
424326943Sdim
425326943Sdimextern unsigned IOCTL_FIOASYNC;
426326943Sdimextern unsigned IOCTL_FIOCLEX;
427326943Sdimextern unsigned IOCTL_FIOGETOWN;
428326943Sdimextern unsigned IOCTL_FIONBIO;
429326943Sdimextern unsigned IOCTL_FIONCLEX;
430326943Sdimextern unsigned IOCTL_FIOSETOWN;
431326943Sdimextern unsigned IOCTL_SIOCADDMULTI;
432326943Sdimextern unsigned IOCTL_SIOCATMARK;
433326943Sdimextern unsigned IOCTL_SIOCDELMULTI;
434326943Sdimextern unsigned IOCTL_SIOCGIFADDR;
435326943Sdimextern unsigned IOCTL_SIOCGIFBRDADDR;
436326943Sdimextern unsigned IOCTL_SIOCGIFCONF;
437326943Sdimextern unsigned IOCTL_SIOCGIFDSTADDR;
438326943Sdimextern unsigned IOCTL_SIOCGIFFLAGS;
439326943Sdimextern unsigned IOCTL_SIOCGIFMETRIC;
440326943Sdimextern unsigned IOCTL_SIOCGIFMTU;
441326943Sdimextern unsigned IOCTL_SIOCGIFNETMASK;
442326943Sdimextern unsigned IOCTL_SIOCGPGRP;
443326943Sdimextern unsigned IOCTL_SIOCSIFADDR;
444326943Sdimextern unsigned IOCTL_SIOCSIFBRDADDR;
445326943Sdimextern unsigned IOCTL_SIOCSIFDSTADDR;
446326943Sdimextern unsigned IOCTL_SIOCSIFFLAGS;
447326943Sdimextern unsigned IOCTL_SIOCSIFMETRIC;
448326943Sdimextern unsigned IOCTL_SIOCSIFMTU;
449326943Sdimextern unsigned IOCTL_SIOCSIFNETMASK;
450326943Sdimextern unsigned IOCTL_SIOCSPGRP;
451326943Sdimextern unsigned IOCTL_TIOCEXCL;
452326943Sdimextern unsigned IOCTL_TIOCGETD;
453326943Sdimextern unsigned IOCTL_TIOCGPGRP;
454326943Sdimextern unsigned IOCTL_TIOCGWINSZ;
455326943Sdimextern unsigned IOCTL_TIOCMBIC;
456326943Sdimextern unsigned IOCTL_TIOCMBIS;
457326943Sdimextern unsigned IOCTL_TIOCMGET;
458326943Sdimextern unsigned IOCTL_TIOCMSET;
459326943Sdimextern unsigned IOCTL_TIOCNOTTY;
460326943Sdimextern unsigned IOCTL_TIOCNXCL;
461326943Sdimextern unsigned IOCTL_TIOCOUTQ;
462326943Sdimextern unsigned IOCTL_TIOCPKT;
463326943Sdimextern unsigned IOCTL_TIOCSCTTY;
464326943Sdimextern unsigned IOCTL_TIOCSETD;
465326943Sdimextern unsigned IOCTL_TIOCSPGRP;
466326943Sdimextern unsigned IOCTL_TIOCSTI;
467326943Sdimextern unsigned IOCTL_TIOCSWINSZ;
468326943Sdimextern unsigned IOCTL_MTIOCGET;
469326943Sdimextern unsigned IOCTL_MTIOCTOP;
470326943Sdim
471326943Sdimextern const int si_SEGV_MAPERR;
472326943Sdimextern const int si_SEGV_ACCERR;
473326943Sdim}  // namespace __sanitizer
474326943Sdim
475326943Sdim#define CHECK_TYPE_SIZE(TYPE) \
476326943Sdim  COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
477326943Sdim
478326943Sdim#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
479326943Sdim  COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
480326943Sdim                 sizeof(((CLASS *) NULL)->MEMBER));                \
481326943Sdim  COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) ==          \
482326943Sdim                 offsetof(CLASS, MEMBER))
483326943Sdim
484326943Sdim// For sigaction, which is a function and struct at the same time,
485326943Sdim// and thus requires explicit "struct" in sizeof() expression.
486326943Sdim#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
487326943Sdim  COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
488326943Sdim                 sizeof(((struct CLASS *) NULL)->MEMBER));                \
489326943Sdim  COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) ==          \
490326943Sdim                 offsetof(struct CLASS, MEMBER))
491326943Sdim
492326943Sdim#endif  // SANITIZER_SOLARIS
493326943Sdim
494326943Sdim#endif
495