]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_openbsd.h
Merge llvm, clang, compiler-rt, libc++, lld, and lldb release_80 branch
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / sanitizer_common / sanitizer_platform_limits_openbsd.h
1 //===-- sanitizer_platform_limits_openbsd.h -------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of Sanitizer common code.
11 //
12 // Sizes and layouts of platform-specific OpenBSD data structures.
13 //===----------------------------------------------------------------------===//
14
15 #ifndef SANITIZER_PLATFORM_LIMITS_OPENBSD_H
16 #define SANITIZER_PLATFORM_LIMITS_OPENBSD_H
17
18 #if SANITIZER_OPENBSD
19
20 #include "sanitizer_internal_defs.h"
21 #include "sanitizer_platform.h"
22
23 #define _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, shift) \
24   ((link_map *)((handle) == nullptr ? nullptr : ((char *)(handle) + (shift))))
25
26 #if defined(__x86_64__)
27 #define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \
28   _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, 312)
29 #elif defined(__i386__)
30 #define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \
31   _GET_LINK_MAP_BY_DLOPEN_HANDLE(handle, 164)
32 #endif
33
34 #define RLIMIT_AS RLIMIT_DATA
35
36 namespace __sanitizer {
37 extern unsigned struct_utsname_sz;
38 extern unsigned struct_stat_sz;
39 extern unsigned struct_rusage_sz;
40 extern unsigned siginfo_t_sz;
41 extern unsigned struct_itimerval_sz;
42 extern unsigned pthread_t_sz;
43 extern unsigned pthread_mutex_t_sz;
44 extern unsigned pthread_cond_t_sz;
45 extern unsigned pid_t_sz;
46 extern unsigned timeval_sz;
47 extern unsigned uid_t_sz;
48 extern unsigned gid_t_sz;
49 extern unsigned mbstate_t_sz;
50 extern unsigned struct_timezone_sz;
51 extern unsigned struct_tms_sz;
52 extern unsigned struct_itimerspec_sz;
53 extern unsigned struct_sigevent_sz;
54 extern unsigned struct_statfs_sz;
55 extern unsigned struct_sockaddr_sz;
56
57 extern unsigned struct_rlimit_sz;
58 extern unsigned struct_utimbuf_sz;
59 extern unsigned struct_timespec_sz;
60
61 struct __sanitizer_iocb {
62   u64 aio_offset;
63   uptr aio_buf;
64   long aio_nbytes;
65   u32 aio_fildes;
66   u32 aio_lio_opcode;
67   long aio_reqprio;
68 #if SANITIZER_WORDSIZE == 64
69   u8 aio_sigevent[32];
70 #else
71   u8 aio_sigevent[20];
72 #endif
73   u32 _state;
74   u32 _errno;
75   long _retval;
76 };
77
78 struct __sanitizer___sysctl_args {
79   int *name;
80   int nlen;
81   void *oldval;
82   uptr *oldlenp;
83   void *newval;
84   uptr newlen;
85 };
86
87 struct __sanitizer_sem_t {
88   uptr data[5];
89 };
90
91 struct __sanitizer_ipc_perm {
92   u32 cuid;
93   u32 cgid;
94   u32 uid;
95   u32 gid;
96   u32 mode;
97   unsigned short seq;
98   long key;
99 };
100
101 struct __sanitizer_shmid_ds {
102   __sanitizer_ipc_perm shm_perm;
103   int shm_segsz;
104   u32 shm_lpid;
105   u32 shm_cpid;
106   short shm_nattch;
107   u64 shm_atime;
108   long __shm_atimensec;
109   u64 shm_dtime;
110   long __shm_dtimensec;
111   u64 shm_ctime;
112   long __shm_ctimensec;
113   void *_shm_internal;
114 };
115
116 extern unsigned struct_msqid_ds_sz;
117 extern unsigned struct_mq_attr_sz;
118 extern unsigned struct_timex_sz;
119 extern unsigned struct_statvfs_sz;
120
121 struct __sanitizer_iovec {
122   void *iov_base;
123   uptr iov_len;
124 };
125
126 struct __sanitizer_ifaddrs {
127   struct __sanitizer_ifaddrs *ifa_next;
128   char *ifa_name;
129   unsigned int ifa_flags;
130   struct __sanitizer_sockaddr *ifa_addr;     // (struct sockaddr *)
131   struct __sanitizer_sockaddr *ifa_netmask;  // (struct sockaddr *)
132   struct __sanitizer_sockaddr *ifa_dstaddr;  // (struct sockaddr *)
133   void *ifa_data;
134 };
135
136 typedef unsigned __sanitizer_pthread_key_t;
137
138 typedef long long __sanitizer_time_t;
139 typedef int __sanitizer_suseconds_t;
140
141 struct __sanitizer_timeval {
142   __sanitizer_time_t tv_sec;
143   __sanitizer_suseconds_t tv_usec;
144 };
145
146 struct __sanitizer_itimerval {
147   struct __sanitizer_timeval it_interval;
148   struct __sanitizer_timeval it_value;
149 };
150
151 struct __sanitizer_passwd {
152   char *pw_name;
153   char *pw_passwd;
154   int pw_uid;
155   int pw_gid;
156   __sanitizer_time_t pw_change;
157   char *pw_class;
158   char *pw_gecos;
159   char *pw_dir;
160   char *pw_shell;
161   __sanitizer_time_t pw_expire;
162 };
163
164 struct __sanitizer_group {
165   char *gr_name;
166   char *gr_passwd;
167   int gr_gid;
168   char **gr_mem;
169 };
170
171 struct __sanitizer_ether_addr {
172   u8 octet[6];
173 };
174
175 struct __sanitizer_tm {
176   int tm_sec;
177   int tm_min;
178   int tm_hour;
179   int tm_mday;
180   int tm_mon;
181   int tm_year;
182   int tm_wday;
183   int tm_yday;
184   int tm_isdst;
185   long int tm_gmtoff;
186   const char *tm_zone;
187 };
188
189 struct __sanitizer_msghdr {
190   void *msg_name;
191   unsigned msg_namelen;
192   struct __sanitizer_iovec *msg_iov;
193   unsigned msg_iovlen;
194   void *msg_control;
195   unsigned msg_controllen;
196   int msg_flags;
197 };
198 struct __sanitizer_cmsghdr {
199   unsigned cmsg_len;
200   int cmsg_level;
201   int cmsg_type;
202 };
203
204 struct __sanitizer_dirent {
205   u64 d_fileno;
206   u64 d_off;
207   u16 d_reclen;
208 };
209
210 typedef u64 __sanitizer_clock_t;
211 typedef u32 __sanitizer_clockid_t;
212
213 typedef u32 __sanitizer___kernel_uid_t;
214 typedef u32 __sanitizer___kernel_gid_t;
215 typedef u64 __sanitizer___kernel_off_t;
216 typedef struct {
217   u32 fds_bits[8];
218 } __sanitizer___kernel_fd_set;
219
220 typedef struct {
221   unsigned int pta_magic;
222   int pta_flags;
223   void *pta_private;
224 } __sanitizer_pthread_attr_t;
225
226 typedef unsigned int __sanitizer_sigset_t;
227
228 struct __sanitizer_siginfo {
229   // The size is determined by looking at sizeof of real siginfo_t on linux.
230   u64 opaque[128 / sizeof(u64)];
231 };
232
233 using __sanitizer_sighandler_ptr = void (*)(int sig);
234 using __sanitizer_sigactionhandler_ptr = void (*)(int sig,
235                                                   __sanitizer_siginfo *siginfo,
236                                                   void *uctx);
237
238 struct __sanitizer_sigaction {
239   union {
240     __sanitizer_sighandler_ptr handler;
241     __sanitizer_sigactionhandler_ptr sigaction;
242   };
243   __sanitizer_sigset_t sa_mask;
244   int sa_flags;
245 };
246
247 typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t;
248
249 struct __sanitizer_kernel_sigaction_t {
250   union {
251     void (*handler)(int signo);
252     void (*sigaction)(int signo, void *info, void *ctx);
253   };
254   unsigned long sa_flags;
255   void (*sa_restorer)(void);
256   __sanitizer_kernel_sigset_t sa_mask;
257 };
258
259 extern const uptr sig_ign;
260 extern const uptr sig_dfl;
261 extern const uptr sig_err;
262 extern const uptr sa_siginfo;
263
264 extern int af_inet;
265 extern int af_inet6;
266 uptr __sanitizer_in_addr_sz(int af);
267
268 struct __sanitizer_dl_phdr_info {
269 #if SANITIZER_WORDSIZE == 64
270   u64 dlpi_addr;
271 #else
272   u32 dlpi_addr;
273 #endif
274   const char *dlpi_name;
275   const void *dlpi_phdr;
276 #if SANITIZER_WORDSIZE == 64
277   u32 dlpi_phnum;
278 #else
279   u16 dlpi_phnum;
280 #endif
281 };
282
283 extern unsigned struct_ElfW_Phdr_sz;
284
285 struct __sanitizer_addrinfo {
286   int ai_flags;
287   int ai_family;
288   int ai_socktype;
289   int ai_protocol;
290   unsigned ai_addrlen;
291   struct __sanitizer_sockaddr *ai_addr;
292   char *ai_canonname;
293   struct __sanitizer_addrinfo *ai_next;
294 };
295
296 struct __sanitizer_hostent {
297   char *h_name;
298   char **h_aliases;
299   int h_addrtype;
300   int h_length;
301   char **h_addr_list;
302 };
303
304 struct __sanitizer_pollfd {
305   int fd;
306   short events;
307   short revents;
308 };
309
310 typedef unsigned __sanitizer_nfds_t;
311
312 struct __sanitizer_glob_t {
313   int gl_pathc;
314   int gl_matchc;
315   int gl_offs;
316   int gl_flags;
317   char **gl_pathv;
318   void **gl_statv;
319   int (*gl_errfunc)(const char *, int);
320   void (*gl_closedir)(void *dirp);
321   struct dirent *(*gl_readdir)(void *dirp);
322   void *(*gl_opendir)(const char *);
323   int (*gl_lstat)(const char *, void * /* struct stat* */);
324   int (*gl_stat)(const char *, void * /* struct stat* */);
325 };
326
327 extern int glob_nomatch;
328 extern int glob_altdirfunc;
329
330 extern unsigned path_max;
331
332 typedef char __sanitizer_FILE;
333 #define SANITIZER_HAS_STRUCT_FILE 0
334
335 extern int shmctl_ipc_stat;
336
337 // This simplifies generic code
338 #define struct_shminfo_sz -1
339 #define struct_shm_info_sz -1
340 #define shmctl_shm_stat -1
341 #define shmctl_ipc_info -1
342 #define shmctl_shm_info -1
343
344 extern unsigned struct_utmp_sz;
345 extern unsigned struct_utmpx_sz;
346
347 extern int map_fixed;
348
349 // ioctl arguments
350 struct __sanitizer_ifconf {
351   int ifc_len;
352   union {
353     void *ifcu_req;
354   } ifc_ifcu;
355 };
356
357 extern const int si_SEGV_MAPERR;
358 extern const int si_SEGV_ACCERR;
359 }  // namespace __sanitizer
360
361 #define CHECK_TYPE_SIZE(TYPE) \
362   COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))
363
364 #define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER)                      \
365   COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *)NULL)->MEMBER) == \
366                  sizeof(((CLASS *)NULL)->MEMBER));                \
367   COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) ==         \
368                  offsetof(CLASS, MEMBER))
369
370 // For sigaction, which is a function and struct at the same time,
371 // and thus requires explicit "struct" in sizeof() expression.
372 #define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER)                      \
373   COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *)NULL)->MEMBER) == \
374                  sizeof(((struct CLASS *)NULL)->MEMBER));                \
375   COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) ==         \
376                  offsetof(struct CLASS, MEMBER))
377
378 #define SIGACTION_SYMNAME __sigaction14
379
380 #endif  // SANITIZER_OPENBSD
381
382 #endif