summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_platform_limits_posix.h
blob: b1901fb63edc436e648d8e6a7cd73bae088bda55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
//===-- sanitizer_platform_limits_posix.h ---------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of Sanitizer common code.
//
// Sizes and layouts of platform-specific POSIX data structures.
//===----------------------------------------------------------------------===//

#ifndef SANITIZER_PLATFORM_LIMITS_POSIX_H
#define SANITIZER_PLATFORM_LIMITS_POSIX_H

#if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC

#include "sanitizer_internal_defs.h"
#include "sanitizer_platform.h"

#if SANITIZER_FREEBSD
// FreeBSD's dlopen() returns a pointer to an Obj_Entry structure that
// incorporates the map structure.
# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) \
    ((link_map*)((handle) == nullptr ? nullptr : ((char*)(handle) + 544)))
// Get sys/_types.h, because that tells us whether 64-bit inodes are
// used in struct dirent below.
#include <sys/_types.h>
#else
# define GET_LINK_MAP_BY_DLOPEN_HANDLE(handle) ((link_map*)(handle))
#endif  // !SANITIZER_FREEBSD

#ifndef __GLIBC_PREREQ
#define __GLIBC_PREREQ(x, y) 0
#endif

namespace __sanitizer {
  extern unsigned struct_utsname_sz;
  extern unsigned struct_stat_sz;
#if !SANITIZER_FREEBSD && !SANITIZER_IOS
  extern unsigned struct_stat64_sz;
#endif
  extern unsigned struct_rusage_sz;
  extern unsigned siginfo_t_sz;
  extern unsigned struct_itimerval_sz;
  extern unsigned pthread_t_sz;
  extern unsigned pthread_mutex_t_sz;
  extern unsigned pthread_cond_t_sz;
  extern unsigned pid_t_sz;
  extern unsigned timeval_sz;
  extern unsigned uid_t_sz;
  extern unsigned gid_t_sz;
  extern unsigned mbstate_t_sz;
  extern unsigned struct_timezone_sz;
  extern unsigned struct_tms_sz;
  extern unsigned struct_itimerspec_sz;
  extern unsigned struct_sigevent_sz;
  extern unsigned struct_sched_param_sz;
  extern unsigned struct_statfs64_sz;

#if !SANITIZER_ANDROID
  extern unsigned struct_statfs_sz;
  extern unsigned struct_sockaddr_sz;
  extern unsigned ucontext_t_sz;
#endif // !SANITIZER_ANDROID

#if SANITIZER_LINUX

#if defined(__x86_64__)
  const unsigned struct_kernel_stat_sz = 144;
  const unsigned struct_kernel_stat64_sz = 0;
#elif defined(__i386__)
  const unsigned struct_kernel_stat_sz = 64;
  const unsigned struct_kernel_stat64_sz = 96;
#elif defined(__arm__)
  const unsigned struct_kernel_stat_sz = 64;
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__aarch64__)
  const unsigned struct_kernel_stat_sz = 128;
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__powerpc__) && !defined(__powerpc64__)
  const unsigned struct_kernel_stat_sz = 72;
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__powerpc64__)
  const unsigned struct_kernel_stat_sz = 144;
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__mips__)
  const unsigned struct_kernel_stat_sz =
                 SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
                                     FIRST_32_SECOND_64(160, 216);
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__s390__) && !defined(__s390x__)
  const unsigned struct_kernel_stat_sz = 64;
  const unsigned struct_kernel_stat64_sz = 104;
#elif defined(__s390x__)
  const unsigned struct_kernel_stat_sz = 144;
  const unsigned struct_kernel_stat64_sz = 0;
#elif defined(__sparc__) && defined(__arch64__)
  const unsigned struct___old_kernel_stat_sz = 0;
  const unsigned struct_kernel_stat_sz = 104;
  const unsigned struct_kernel_stat64_sz = 144;
#elif defined(__sparc__) && !defined(__arch64__)
  const unsigned struct___old_kernel_stat_sz = 0;
  const unsigned struct_kernel_stat_sz = 64;
  const unsigned struct_kernel_stat64_sz = 104;
#endif
  struct __sanitizer_perf_event_attr {
    unsigned type;
    unsigned size;
    // More fields that vary with the kernel version.
  };

  extern unsigned struct_epoll_event_sz;
  extern unsigned struct_sysinfo_sz;
  extern unsigned __user_cap_header_struct_sz;
  extern unsigned __user_cap_data_struct_sz;
  extern unsigned struct_new_utsname_sz;
  extern unsigned struct_old_utsname_sz;
  extern unsigned struct_oldold_utsname_sz;

  const unsigned struct_kexec_segment_sz = 4 * sizeof(unsigned long);
#endif  // SANITIZER_LINUX

#if SANITIZER_LINUX || SANITIZER_FREEBSD

#if defined(__powerpc64__) || defined(__s390__)
  const unsigned struct___old_kernel_stat_sz = 0;
#elif !defined(__sparc__)
  const unsigned struct___old_kernel_stat_sz = 32;
#endif

  extern unsigned struct_rlimit_sz;
  extern unsigned struct_utimbuf_sz;
  extern unsigned struct_timespec_sz;

  struct __sanitizer_iocb {
    u64   aio_data;
    u32   aio_key_or_aio_reserved1; // Simply crazy.
    u32   aio_reserved1_or_aio_key; // Luckily, we don't need these.
    u16   aio_lio_opcode;
    s16   aio_reqprio;
    u32   aio_fildes;
    u64   aio_buf;
    u64   aio_nbytes;
    s64   aio_offset;
    u64   aio_reserved2;
    u64   aio_reserved3;
  };

  struct __sanitizer_io_event {
    u64 data;
    u64 obj;
    u64 res;
    u64 res2;
  };

  const unsigned iocb_cmd_pread = 0;
  const unsigned iocb_cmd_pwrite = 1;
  const unsigned iocb_cmd_preadv = 7;
  const unsigned iocb_cmd_pwritev = 8;

  struct __sanitizer___sysctl_args {
    int *name;
    int nlen;
    void *oldval;
    uptr *oldlenp;
    void *newval;
    uptr newlen;
    unsigned long ___unused[4];
  };

  const unsigned old_sigset_t_sz = sizeof(unsigned long);

  struct __sanitizer_sem_t {
#if SANITIZER_ANDROID && defined(_LP64)
    int data[4];
#elif SANITIZER_ANDROID && !defined(_LP64)
    int data;
#elif SANITIZER_LINUX
    uptr data[4];
#elif SANITIZER_FREEBSD
    u32 data[4];
#endif
  };
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD

#if SANITIZER_ANDROID
  struct __sanitizer_mallinfo {
    uptr v[10];
  };
#endif

#if SANITIZER_LINUX && !SANITIZER_ANDROID
  struct __sanitizer_mallinfo {
    int v[10];
  };

  extern unsigned struct_ustat_sz;
  extern unsigned struct_rlimit64_sz;
  extern unsigned struct_statvfs64_sz;

  struct __sanitizer_ipc_perm {
    int __key;
    int uid;
    int gid;
    int cuid;
    int cgid;
#ifdef __powerpc__
    unsigned mode;
    unsigned __seq;
    u64 __unused1;
    u64 __unused2;
#elif defined(__sparc__)
#if defined(__arch64__)
    unsigned mode;
    unsigned short __pad1;
#else
    unsigned short __pad1;
    unsigned short mode;
    unsigned short __pad2;
#endif
    unsigned short __seq;
    unsigned long long __unused1;
    unsigned long long __unused2;
#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__)
    unsigned int mode;
    unsigned short __seq;
    unsigned short __pad1;
    unsigned long __unused1;
    unsigned long __unused2;
#else
    unsigned short mode;
    unsigned short __pad1;
    unsigned short __seq;
    unsigned short __pad2;
#if defined(__x86_64__) && !defined(_LP64)
    u64 __unused1;
    u64 __unused2;
#else
    unsigned long __unused1;
    unsigned long __unused2;
#endif
#endif
  };

  struct __sanitizer_shmid_ds {
    __sanitizer_ipc_perm shm_perm;
  #if defined(__sparc__)
  #if !defined(__arch64__)
    u32 __pad1;
  #endif
    long shm_atime;
  #if !defined(__arch64__)
    u32 __pad2;
  #endif
    long shm_dtime;
  #if !defined(__arch64__)
    u32 __pad3;
  #endif
    long shm_ctime;
    uptr shm_segsz;
    int shm_cpid;
    int shm_lpid;
    unsigned long shm_nattch;
    unsigned long __glibc_reserved1;
    unsigned long __glibc_reserved2;
  #else
  #ifndef __powerpc__
    uptr shm_segsz;
  #elif !defined(__powerpc64__)
    uptr __unused0;
  #endif
  #if defined(__x86_64__) && !defined(_LP64)
    u64 shm_atime;
    u64 shm_dtime;
    u64 shm_ctime;
  #else
    uptr shm_atime;
  #if !defined(_LP64) && !defined(__mips__)
    uptr __unused1;
  #endif
    uptr shm_dtime;
  #if !defined(_LP64) && !defined(__mips__)
    uptr __unused2;
  #endif
    uptr shm_ctime;
  #if !defined(_LP64) && !defined(__mips__)
    uptr __unused3;
  #endif
  #endif
  #ifdef __powerpc__
    uptr shm_segsz;
  #endif
    int shm_cpid;
    int shm_lpid;
  #if defined(__x86_64__) && !defined(_LP64)
    u64 shm_nattch;
    u64 __unused4;
    u64 __unused5;
  #else
    uptr shm_nattch;
    uptr __unused4;
    uptr __unused5;
  #endif
#endif
  };
#elif SANITIZER_FREEBSD
  struct __sanitizer_ipc_perm {
    unsigned int cuid;
    unsigned int cgid;
    unsigned int uid;
    unsigned int gid;
    unsigned short mode;
    unsigned short seq;
    long key;
  };

  struct __sanitizer_shmid_ds {
    __sanitizer_ipc_perm shm_perm;
    unsigned long shm_segsz;
    unsigned int shm_lpid;
    unsigned int shm_cpid;
    int shm_nattch;
    unsigned long shm_atime;
    unsigned long shm_dtime;
    unsigned long shm_ctime;
  };
#endif

#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
  extern unsigned struct_msqid_ds_sz;
  extern unsigned struct_mq_attr_sz;
  extern unsigned struct_timex_sz;
  extern unsigned struct_statvfs_sz;
#endif  // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID

  struct __sanitizer_iovec {
    void *iov_base;
    uptr iov_len;
  };

#if !SANITIZER_ANDROID
  struct __sanitizer_ifaddrs {
    struct __sanitizer_ifaddrs *ifa_next;
    char *ifa_name;
    unsigned int ifa_flags;
    void *ifa_addr;    // (struct sockaddr *)
    void *ifa_netmask; // (struct sockaddr *)
    // This is a union on Linux.
# ifdef ifa_dstaddr
# undef ifa_dstaddr
# endif
    void *ifa_dstaddr; // (struct sockaddr *)
    void *ifa_data;
  };
#endif  // !SANITIZER_ANDROID

#if SANITIZER_MAC
  typedef unsigned long __sanitizer_pthread_key_t;
#else
  typedef unsigned __sanitizer_pthread_key_t;
#endif

#if SANITIZER_LINUX && !SANITIZER_ANDROID

  struct __sanitizer_XDR {
    int x_op;
    void *x_ops;
    uptr x_public;
    uptr x_private;
    uptr x_base;
    unsigned x_handy;
  };

  const int __sanitizer_XDR_ENCODE = 0;
  const int __sanitizer_XDR_DECODE = 1;
  const int __sanitizer_XDR_FREE = 2;
#endif

  struct __sanitizer_passwd {
    char *pw_name;
    char *pw_passwd;
    int pw_uid;
    int pw_gid;
#if SANITIZER_MAC || SANITIZER_FREEBSD
    long pw_change;
    char *pw_class;
#endif
#if !(SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32))
    char *pw_gecos;
#endif
    char *pw_dir;
    char *pw_shell;
#if SANITIZER_MAC || SANITIZER_FREEBSD
    long pw_expire;
#endif
#if SANITIZER_FREEBSD
    int pw_fields;
#endif
  };

  struct __sanitizer_group {
    char *gr_name;
    char *gr_passwd;
    int gr_gid;
    char **gr_mem;
  };

#if defined(__x86_64__) && !defined(_LP64)
  typedef long long __sanitizer_time_t;
#else
  typedef long __sanitizer_time_t;
#endif

  struct __sanitizer_timeb {
    __sanitizer_time_t time;
    unsigned short millitm;
    short timezone;
    short dstflag;
  };

  struct __sanitizer_ether_addr {
    u8 octet[6];
  };

  struct __sanitizer_tm {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
    long int tm_gmtoff;
    const char *tm_zone;
  };

#if SANITIZER_LINUX
  struct __sanitizer_mntent {
    char *mnt_fsname;
    char *mnt_dir;
    char *mnt_type;
    char *mnt_opts;
    int mnt_freq;
    int mnt_passno;
  };
#endif

#if SANITIZER_MAC || SANITIZER_FREEBSD
  struct __sanitizer_msghdr {
    void *msg_name;
    unsigned msg_namelen;
    struct __sanitizer_iovec *msg_iov;
    unsigned msg_iovlen;
    void *msg_control;
    unsigned msg_controllen;
    int msg_flags;
  };
  struct __sanitizer_cmsghdr {
    unsigned cmsg_len;
    int cmsg_level;
    int cmsg_type;
  };
#else
  struct __sanitizer_msghdr {
    void *msg_name;
    unsigned msg_namelen;
    struct __sanitizer_iovec *msg_iov;
    uptr msg_iovlen;
    void *msg_control;
    uptr msg_controllen;
    int msg_flags;
  };
  struct __sanitizer_cmsghdr {
    uptr cmsg_len;
    int cmsg_level;
    int cmsg_type;
  };
#endif

#if SANITIZER_MAC
  struct __sanitizer_dirent {
    unsigned long long d_ino;
    unsigned long long d_seekoff;
    unsigned short d_reclen;
    // more fields that we don't care about
  };
#elif SANITIZER_FREEBSD
  struct __sanitizer_dirent {
#if defined(__INO64)
    unsigned long long d_fileno;
    unsigned long long d_off;
#else
    unsigned int d_fileno;
#endif
    unsigned short d_reclen;
    // more fields that we don't care about
  };
#elif SANITIZER_ANDROID || defined(__x86_64__)
  struct __sanitizer_dirent {
    unsigned long long d_ino;
    unsigned long long d_off;
    unsigned short d_reclen;
    // more fields that we don't care about
  };
#else
  struct __sanitizer_dirent {
    uptr d_ino;
    uptr d_off;
    unsigned short d_reclen;
    // more fields that we don't care about
  };
#endif

#if SANITIZER_LINUX && !SANITIZER_ANDROID
  struct __sanitizer_dirent64 {
    unsigned long long d_ino;
    unsigned long long d_off;
    unsigned short d_reclen;
    // more fields that we don't care about
  };
#endif

// 'clock_t' is 32 bits wide on x64 FreeBSD
#if SANITIZER_FREEBSD
  typedef int __sanitizer_clock_t;
#elif defined(__x86_64__) && !defined(_LP64)
  typedef long long __sanitizer_clock_t;
#else
  typedef long __sanitizer_clock_t;
#endif

#if SANITIZER_LINUX || SANITIZER_FREEBSD
  typedef int __sanitizer_clockid_t;
#endif

#if SANITIZER_LINUX || SANITIZER_FREEBSD
#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__)\
                   || defined(__mips__)
  typedef unsigned __sanitizer___kernel_uid_t;
  typedef unsigned __sanitizer___kernel_gid_t;
#else
  typedef unsigned short __sanitizer___kernel_uid_t;
  typedef unsigned short __sanitizer___kernel_gid_t;
#endif
#if defined(__x86_64__) && !defined(_LP64)
  typedef long long __sanitizer___kernel_off_t;
#else
  typedef long __sanitizer___kernel_off_t;
#endif

#if defined(__powerpc__) || defined(__mips__)
  typedef unsigned int __sanitizer___kernel_old_uid_t;
  typedef unsigned int __sanitizer___kernel_old_gid_t;
#else
  typedef unsigned short __sanitizer___kernel_old_uid_t;
  typedef unsigned short __sanitizer___kernel_old_gid_t;
#endif

  typedef long long __sanitizer___kernel_loff_t;
  typedef struct {
    unsigned long fds_bits[1024 / (8 * sizeof(long))];
  } __sanitizer___kernel_fd_set;
#endif

  // This thing depends on the platform. We are only interested in the upper
  // limit. Verified with a compiler assert in .cc.
  const int pthread_attr_t_max_sz = 128;
  union __sanitizer_pthread_attr_t {
    char size[pthread_attr_t_max_sz]; // NOLINT
    void *align;
  };

#if SANITIZER_ANDROID
# if SANITIZER_MIPS
  typedef unsigned long __sanitizer_sigset_t[16/sizeof(unsigned long)];
# else
  typedef unsigned long __sanitizer_sigset_t;
# endif
#elif SANITIZER_MAC
  typedef unsigned __sanitizer_sigset_t;
#elif SANITIZER_LINUX
  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_FREEBSD
  struct __sanitizer_sigset_t {
     // uint32_t * 4
     unsigned int __bits[4];
  };
#endif

  struct __sanitizer_siginfo {
    // The size is determined by looking at sizeof of real siginfo_t on linux.
    u64 opaque[128 / sizeof(u64)];
  };

  using __sanitizer_sighandler_ptr = void (*)(int sig);
  using __sanitizer_sigactionhandler_ptr =
      void (*)(int sig, __sanitizer_siginfo *siginfo, void *uctx);

  // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
#if SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 64)
  struct __sanitizer_sigaction {
    unsigned sa_flags;
    union {
      __sanitizer_sigactionhandler_ptr sigaction;
      __sanitizer_sighandler_ptr handler;
    };
    __sanitizer_sigset_t sa_mask;
    void (*sa_restorer)();
  };
#elif SANITIZER_ANDROID && SANITIZER_MIPS32  // check this before WORDSIZE == 32
  struct __sanitizer_sigaction {
    unsigned sa_flags;
    union {
      __sanitizer_sigactionhandler_ptr sigaction;
      __sanitizer_sighandler_ptr handler;
    };
    __sanitizer_sigset_t sa_mask;
  };
#elif SANITIZER_ANDROID && (SANITIZER_WORDSIZE == 32)
  struct __sanitizer_sigaction {
    union {
      __sanitizer_sigactionhandler_ptr sigaction;
      __sanitizer_sighandler_ptr handler;
    };
    __sanitizer_sigset_t sa_mask;
    uptr sa_flags;
    void (*sa_restorer)();
  };
#else // !SANITIZER_ANDROID
  struct __sanitizer_sigaction {
#if defined(__mips__) && !SANITIZER_FREEBSD
    unsigned int sa_flags;
#endif
    union {
      __sanitizer_sigactionhandler_ptr sigaction;
      __sanitizer_sighandler_ptr handler;
    };
#if SANITIZER_FREEBSD
    int sa_flags;
    __sanitizer_sigset_t sa_mask;
#else
#if defined(__s390x__)
    int sa_resv;
#else
    __sanitizer_sigset_t sa_mask;
#endif
#ifndef __mips__
#if defined(__sparc__)
#if __GLIBC_PREREQ (2, 20)
    // On sparc glibc 2.19 and earlier sa_flags was unsigned long.
#if defined(__arch64__)
    // To maintain ABI compatibility on sparc64 when switching to an int,
    // __glibc_reserved0 was added.
    int __glibc_reserved0;
#endif
    int sa_flags;
#else
    unsigned long sa_flags;
#endif
#else
    int sa_flags;
#endif
#endif
#endif
#if SANITIZER_LINUX
    void (*sa_restorer)();
#endif
#if defined(__mips__) && (SANITIZER_WORDSIZE == 32)
    int sa_resv[1];
#endif
#if defined(__s390x__)
    __sanitizer_sigset_t sa_mask;
#endif
  };
#endif // !SANITIZER_ANDROID

#if SANITIZER_FREEBSD
  typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t;
#elif defined(__mips__)
  struct __sanitizer_kernel_sigset_t {
    uptr sig[2];
  };
#else
  struct __sanitizer_kernel_sigset_t {
    u8 sig[8];
  };
#endif

  // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.
#if SANITIZER_MIPS
  struct __sanitizer_kernel_sigaction_t {
    unsigned int sa_flags;
    union {
      void (*handler)(int signo);
      void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
    };
    __sanitizer_kernel_sigset_t sa_mask;
    void (*sa_restorer)(void);
  };
#else
  struct __sanitizer_kernel_sigaction_t {
    union {
      void (*handler)(int signo);
      void (*sigaction)(int signo, __sanitizer_siginfo *info, void *ctx);
    };
    unsigned long sa_flags;
    void (*sa_restorer)(void);
    __sanitizer_kernel_sigset_t sa_mask;
  };
#endif

  extern const uptr sig_ign;
  extern const uptr sig_dfl;
  extern const uptr sig_err;
  extern const uptr sa_siginfo;

#if SANITIZER_LINUX
  extern int e_tabsz;
#endif

  extern int af_inet;
  extern int af_inet6;
  uptr __sanitizer_in_addr_sz(int af);

#if SANITIZER_LINUX || SANITIZER_FREEBSD
  struct __sanitizer_dl_phdr_info {
    uptr dlpi_addr;
    const char *dlpi_name;
    const void *dlpi_phdr;
    short dlpi_phnum;
  };

  extern unsigned struct_ElfW_Phdr_sz;
#endif

  struct __sanitizer_addrinfo {
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
#if SANITIZER_ANDROID || SANITIZER_MAC || SANITIZER_FREEBSD
    unsigned ai_addrlen;
    char *ai_canonname;
    void *ai_addr;
#else // LINUX
    unsigned ai_addrlen;
    void *ai_addr;
    char *ai_canonname;
#endif
    struct __sanitizer_addrinfo *ai_next;
  };

  struct __sanitizer_hostent {
    char *h_name;
    char **h_aliases;
    int h_addrtype;
    int h_length;
    char **h_addr_list;
  };

  struct __sanitizer_pollfd {
    int fd;
    short events;
    short revents;
  };

#if SANITIZER_ANDROID || SANITIZER_MAC || SANITIZER_FREEBSD
  typedef unsigned __sanitizer_nfds_t;
#else
  typedef unsigned long __sanitizer_nfds_t;
#endif

#if !SANITIZER_ANDROID
# if SANITIZER_LINUX
  struct __sanitizer_glob_t {
    uptr gl_pathc;
    char **gl_pathv;
    uptr gl_offs;
    int gl_flags;

    void (*gl_closedir)(void *dirp);
    void *(*gl_readdir)(void *dirp);
    void *(*gl_opendir)(const char *);
    int (*gl_lstat)(const char *, void *);
    int (*gl_stat)(const char *, void *);
  };
# elif SANITIZER_FREEBSD
  struct __sanitizer_glob_t {
    uptr gl_pathc;
    uptr gl_matchc;
    uptr gl_offs;
    int gl_flags;
    char **gl_pathv;
    int (*gl_errfunc)(const char*, int);
    void (*gl_closedir)(void *dirp);
    struct dirent *(*gl_readdir)(void *dirp);
    void *(*gl_opendir)(const char*);
    int (*gl_lstat)(const char*, void* /* struct stat* */);
    int (*gl_stat)(const char*, void* /* struct stat* */);
  };
# endif  // SANITIZER_FREEBSD

# if SANITIZER_LINUX || SANITIZER_FREEBSD
  extern int glob_nomatch;
  extern int glob_altdirfunc;
# endif
#endif  // !SANITIZER_ANDROID

  extern unsigned path_max;

  struct __sanitizer_wordexp_t {
    uptr we_wordc;
    char **we_wordv;
    uptr we_offs;
#if SANITIZER_FREEBSD
    char *we_strings;
    uptr we_nbytes;
#endif
  };

#if SANITIZER_LINUX && !SANITIZER_ANDROID
  struct __sanitizer_FILE {
    int _flags;
    char *_IO_read_ptr;
    char *_IO_read_end;
    char *_IO_read_base;
    char *_IO_write_base;
    char *_IO_write_ptr;
    char *_IO_write_end;
    char *_IO_buf_base;
    char *_IO_buf_end;
    char *_IO_save_base;
    char *_IO_backup_base;
    char *_IO_save_end;
    void *_markers;
    __sanitizer_FILE *_chain;
    int _fileno;
  };
# define SANITIZER_HAS_STRUCT_FILE 1
#else
  typedef void __sanitizer_FILE;
# define SANITIZER_HAS_STRUCT_FILE 0
#endif

#if SANITIZER_LINUX && !SANITIZER_ANDROID && \
  (defined(__i386) || defined(__x86_64) || defined(__mips64) || \
    defined(__powerpc64__) || defined(__aarch64__) || defined(__arm__) || \
    defined(__s390__))
  extern unsigned struct_user_regs_struct_sz;
  extern unsigned struct_user_fpregs_struct_sz;
  extern unsigned struct_user_fpxregs_struct_sz;
  extern unsigned struct_user_vfpregs_struct_sz;

  extern int ptrace_peektext;
  extern int ptrace_peekdata;
  extern int ptrace_peekuser;
  extern int ptrace_getregs;
  extern int ptrace_setregs;
  extern int ptrace_getfpregs;
  extern int ptrace_setfpregs;
  extern int ptrace_getfpxregs;
  extern int ptrace_setfpxregs;
  extern int ptrace_getvfpregs;
  extern int ptrace_setvfpregs;
  extern int ptrace_getsiginfo;
  extern int ptrace_setsiginfo;
  extern int ptrace_getregset;
  extern int ptrace_setregset;
  extern int ptrace_geteventmsg;
#endif

#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
  extern unsigned struct_shminfo_sz;
  extern unsigned struct_shm_info_sz;
  extern int shmctl_ipc_stat;
  extern int shmctl_ipc_info;
  extern int shmctl_shm_info;
  extern int shmctl_shm_stat;
#endif

#if !SANITIZER_MAC && !SANITIZER_FREEBSD
  extern unsigned struct_utmp_sz;
#endif
#if !SANITIZER_ANDROID
  extern unsigned struct_utmpx_sz;
#endif

  extern int map_fixed;

  // ioctl arguments
  struct __sanitizer_ifconf {
    int ifc_len;
    union {
      void *ifcu_req;
    } ifc_ifcu;
#if SANITIZER_MAC
  } __attribute__((packed));
#else
  };
#endif

#if SANITIZER_LINUX && !SANITIZER_ANDROID
struct __sanitizer__obstack_chunk {
  char *limit;
  struct __sanitizer__obstack_chunk *prev;
};

struct __sanitizer_obstack {
  long chunk_size;
  struct __sanitizer__obstack_chunk *chunk;
  char *object_base;
  char *next_free;
  uptr more_fields[7];
};

typedef uptr (*__sanitizer_cookie_io_read)(void *cookie, char *buf, uptr size);
typedef uptr (*__sanitizer_cookie_io_write)(void *cookie, const char *buf,
                                            uptr size);
typedef int (*__sanitizer_cookie_io_seek)(void *cookie, u64 *offset,
                                          int whence);
typedef int (*__sanitizer_cookie_io_close)(void *cookie);

struct __sanitizer_cookie_io_functions_t {
  __sanitizer_cookie_io_read read;
  __sanitizer_cookie_io_write write;
  __sanitizer_cookie_io_seek seek;
  __sanitizer_cookie_io_close close;
};
#endif

#define IOC_NRBITS 8
#define IOC_TYPEBITS 8
#if defined(__powerpc__) || defined(__powerpc64__) || defined(__mips__) || \
    defined(__sparc__)
#define IOC_SIZEBITS 13
#define IOC_DIRBITS 3
#define IOC_NONE 1U
#define IOC_WRITE 4U
#define IOC_READ 2U
#else
#define IOC_SIZEBITS 14
#define IOC_DIRBITS 2
#define IOC_NONE 0U
#define IOC_WRITE 1U
#define IOC_READ 2U
#endif
#define IOC_NRMASK ((1 << IOC_NRBITS) - 1)
#define IOC_TYPEMASK ((1 << IOC_TYPEBITS) - 1)
#define IOC_SIZEMASK ((1 << IOC_SIZEBITS) - 1)
#if defined(IOC_DIRMASK)
#undef IOC_DIRMASK
#endif
#define IOC_DIRMASK ((1 << IOC_DIRBITS) - 1)
#define IOC_NRSHIFT 0
#define IOC_TYPESHIFT (IOC_NRSHIFT + IOC_NRBITS)
#define IOC_SIZESHIFT (IOC_TYPESHIFT + IOC_TYPEBITS)
#define IOC_DIRSHIFT (IOC_SIZESHIFT + IOC_SIZEBITS)
#define EVIOC_EV_MAX 0x1f
#define EVIOC_ABS_MAX 0x3f

#define IOC_DIR(nr) (((nr) >> IOC_DIRSHIFT) & IOC_DIRMASK)
#define IOC_TYPE(nr) (((nr) >> IOC_TYPESHIFT) & IOC_TYPEMASK)
#define IOC_NR(nr) (((nr) >> IOC_NRSHIFT) & IOC_NRMASK)

#if defined(__sparc__)
// In sparc the 14 bits SIZE field overlaps with the
// least significant bit of DIR, so either IOC_READ or
// IOC_WRITE shall be 1 in order to get a non-zero SIZE.
#define IOC_SIZE(nr) \
  ((((((nr) >> 29) & 0x7) & (4U | 2U)) == 0) ? 0 : (((nr) >> 16) & 0x3fff))
#else
#define IOC_SIZE(nr) (((nr) >> IOC_SIZESHIFT) & IOC_SIZEMASK)
#endif

  extern unsigned struct_ifreq_sz;
  extern unsigned struct_termios_sz;
  extern unsigned struct_winsize_sz;

#if SANITIZER_LINUX
  extern unsigned struct_arpreq_sz;
  extern unsigned struct_cdrom_msf_sz;
  extern unsigned struct_cdrom_multisession_sz;
  extern unsigned struct_cdrom_read_audio_sz;
  extern unsigned struct_cdrom_subchnl_sz;
  extern unsigned struct_cdrom_ti_sz;
  extern unsigned struct_cdrom_tocentry_sz;
  extern unsigned struct_cdrom_tochdr_sz;
  extern unsigned struct_cdrom_volctrl_sz;
  extern unsigned struct_ff_effect_sz;
  extern unsigned struct_floppy_drive_params_sz;
  extern unsigned struct_floppy_drive_struct_sz;
  extern unsigned struct_floppy_fdc_state_sz;
  extern unsigned struct_floppy_max_errors_sz;
  extern unsigned struct_floppy_raw_cmd_sz;
  extern unsigned struct_floppy_struct_sz;
  extern unsigned struct_floppy_write_errors_sz;
  extern unsigned struct_format_descr_sz;
  extern unsigned struct_hd_driveid_sz;
  extern unsigned struct_hd_geometry_sz;
  extern unsigned struct_input_absinfo_sz;
  extern unsigned struct_input_id_sz;
  extern unsigned struct_mtpos_sz;
  extern unsigned struct_termio_sz;
  extern unsigned struct_vt_consize_sz;
  extern unsigned struct_vt_sizes_sz;
  extern unsigned struct_vt_stat_sz;
#endif  // SANITIZER_LINUX

#if SANITIZER_LINUX || SANITIZER_FREEBSD
  extern unsigned struct_copr_buffer_sz;
  extern unsigned struct_copr_debug_buf_sz;
  extern unsigned struct_copr_msg_sz;
  extern unsigned struct_midi_info_sz;
  extern unsigned struct_mtget_sz;
  extern unsigned struct_mtop_sz;
  extern unsigned struct_rtentry_sz;
  extern unsigned struct_sbi_instrument_sz;
  extern unsigned struct_seq_event_rec_sz;
  extern unsigned struct_synth_info_sz;
  extern unsigned struct_vt_mode_sz;
#endif // SANITIZER_LINUX || SANITIZER_FREEBSD

#if SANITIZER_LINUX && !SANITIZER_ANDROID
  extern unsigned struct_ax25_parms_struct_sz;
  extern unsigned struct_cyclades_monitor_sz;
  extern unsigned struct_input_keymap_entry_sz;
  extern unsigned struct_ipx_config_data_sz;
  extern unsigned struct_kbdiacrs_sz;
  extern unsigned struct_kbentry_sz;
  extern unsigned struct_kbkeycode_sz;
  extern unsigned struct_kbsentry_sz;
  extern unsigned struct_mtconfiginfo_sz;
  extern unsigned struct_nr_parms_struct_sz;
  extern unsigned struct_scc_modem_sz;
  extern unsigned struct_scc_stat_sz;
  extern unsigned struct_serial_multiport_struct_sz;
  extern unsigned struct_serial_struct_sz;
  extern unsigned struct_sockaddr_ax25_sz;
  extern unsigned struct_unimapdesc_sz;
  extern unsigned struct_unimapinit_sz;
#endif  // SANITIZER_LINUX && !SANITIZER_ANDROID

#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
  extern unsigned struct_audio_buf_info_sz;
  extern unsigned struct_ppp_stats_sz;
#endif  // (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID

#if !SANITIZER_ANDROID && !SANITIZER_MAC
  extern unsigned struct_sioc_sg_req_sz;
  extern unsigned struct_sioc_vif_req_sz;
#endif

  // ioctl request identifiers

  // A special value to mark ioctls that are not present on the target platform,
  // when it can not be determined without including any system headers.
  extern const unsigned IOCTL_NOT_PRESENT;

  extern unsigned IOCTL_FIOASYNC;
  extern unsigned IOCTL_FIOCLEX;
  extern unsigned IOCTL_FIOGETOWN;
  extern unsigned IOCTL_FIONBIO;
  extern unsigned IOCTL_FIONCLEX;
  extern unsigned IOCTL_FIOSETOWN;
  extern unsigned IOCTL_SIOCADDMULTI;
  extern unsigned IOCTL_SIOCATMARK;
  extern unsigned IOCTL_SIOCDELMULTI;
  extern unsigned IOCTL_SIOCGIFADDR;
  extern unsigned IOCTL_SIOCGIFBRDADDR;
  extern unsigned IOCTL_SIOCGIFCONF;
  extern unsigned IOCTL_SIOCGIFDSTADDR;
  extern unsigned IOCTL_SIOCGIFFLAGS;
  extern unsigned IOCTL_SIOCGIFMETRIC;
  extern unsigned IOCTL_SIOCGIFMTU;
  extern unsigned IOCTL_SIOCGIFNETMASK;
  extern unsigned IOCTL_SIOCGPGRP;
  extern unsigned IOCTL_SIOCSIFADDR;
  extern unsigned IOCTL_SIOCSIFBRDADDR;
  extern unsigned IOCTL_SIOCSIFDSTADDR;
  extern unsigned IOCTL_SIOCSIFFLAGS;
  extern unsigned IOCTL_SIOCSIFMETRIC;
  extern unsigned IOCTL_SIOCSIFMTU;
  extern unsigned IOCTL_SIOCSIFNETMASK;
  extern unsigned IOCTL_SIOCSPGRP;
  extern unsigned IOCTL_TIOCCONS;
  extern unsigned IOCTL_TIOCEXCL;
  extern unsigned IOCTL_TIOCGETD;
  extern unsigned IOCTL_TIOCGPGRP;
  extern unsigned IOCTL_TIOCGWINSZ;
  extern unsigned IOCTL_TIOCMBIC;
  extern unsigned IOCTL_TIOCMBIS;
  extern unsigned IOCTL_TIOCMGET;
  extern unsigned IOCTL_TIOCMSET;
  extern unsigned IOCTL_TIOCNOTTY;
  extern unsigned IOCTL_TIOCNXCL;
  extern unsigned IOCTL_TIOCOUTQ;
  extern unsigned IOCTL_TIOCPKT;
  extern unsigned IOCTL_TIOCSCTTY;
  extern unsigned IOCTL_TIOCSETD;
  extern unsigned IOCTL_TIOCSPGRP;
  extern unsigned IOCTL_TIOCSTI;
  extern unsigned IOCTL_TIOCSWINSZ;
#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
  extern unsigned IOCTL_SIOCGETSGCNT;
  extern unsigned IOCTL_SIOCGETVIFCNT;
#endif
#if SANITIZER_LINUX
  extern unsigned IOCTL_EVIOCGABS;
  extern unsigned IOCTL_EVIOCGBIT;
  extern unsigned IOCTL_EVIOCGEFFECTS;
  extern unsigned IOCTL_EVIOCGID;
  extern unsigned IOCTL_EVIOCGKEY;
  extern unsigned IOCTL_EVIOCGKEYCODE;
  extern unsigned IOCTL_EVIOCGLED;
  extern unsigned IOCTL_EVIOCGNAME;
  extern unsigned IOCTL_EVIOCGPHYS;
  extern unsigned IOCTL_EVIOCGRAB;
  extern unsigned IOCTL_EVIOCGREP;
  extern unsigned IOCTL_EVIOCGSND;
  extern unsigned IOCTL_EVIOCGSW;
  extern unsigned IOCTL_EVIOCGUNIQ;
  extern unsigned IOCTL_EVIOCGVERSION;
  extern unsigned IOCTL_EVIOCRMFF;
  extern unsigned IOCTL_EVIOCSABS;
  extern unsigned IOCTL_EVIOCSFF;
  extern unsigned IOCTL_EVIOCSKEYCODE;
  extern unsigned IOCTL_EVIOCSREP;
  extern unsigned IOCTL_BLKFLSBUF;
  extern unsigned IOCTL_BLKGETSIZE;
  extern unsigned IOCTL_BLKRAGET;
  extern unsigned IOCTL_BLKRASET;
  extern unsigned IOCTL_BLKROGET;
  extern unsigned IOCTL_BLKROSET;
  extern unsigned IOCTL_BLKRRPART;
  extern unsigned IOCTL_CDROMAUDIOBUFSIZ;
  extern unsigned IOCTL_CDROMEJECT;
  extern unsigned IOCTL_CDROMEJECT_SW;
  extern unsigned IOCTL_CDROMMULTISESSION;
  extern unsigned IOCTL_CDROMPAUSE;
  extern unsigned IOCTL_CDROMPLAYMSF;
  extern unsigned IOCTL_CDROMPLAYTRKIND;
  extern unsigned IOCTL_CDROMREADAUDIO;
  extern unsigned IOCTL_CDROMREADCOOKED;
  extern unsigned IOCTL_CDROMREADMODE1;
  extern unsigned IOCTL_CDROMREADMODE2;
  extern unsigned IOCTL_CDROMREADRAW;
  extern unsigned IOCTL_CDROMREADTOCENTRY;
  extern unsigned IOCTL_CDROMREADTOCHDR;
  extern unsigned IOCTL_CDROMRESET;
  extern unsigned IOCTL_CDROMRESUME;
  extern unsigned IOCTL_CDROMSEEK;
  extern unsigned IOCTL_CDROMSTART;
  extern unsigned IOCTL_CDROMSTOP;
  extern unsigned IOCTL_CDROMSUBCHNL;
  extern unsigned IOCTL_CDROMVOLCTRL;
  extern unsigned IOCTL_CDROMVOLREAD;
  extern unsigned IOCTL_CDROM_GET_UPC;
  extern unsigned IOCTL_FDCLRPRM;
  extern unsigned IOCTL_FDDEFPRM;
  extern unsigned IOCTL_FDFLUSH;
  extern unsigned IOCTL_FDFMTBEG;
  extern unsigned IOCTL_FDFMTEND;
  extern unsigned IOCTL_FDFMTTRK;
  extern unsigned IOCTL_FDGETDRVPRM;
  extern unsigned IOCTL_FDGETDRVSTAT;
  extern unsigned IOCTL_FDGETDRVTYP;
  extern unsigned IOCTL_FDGETFDCSTAT;
  extern unsigned IOCTL_FDGETMAXERRS;
  extern unsigned IOCTL_FDGETPRM;
  extern unsigned IOCTL_FDMSGOFF;
  extern unsigned IOCTL_FDMSGON;
  extern unsigned IOCTL_FDPOLLDRVSTAT;
  extern unsigned IOCTL_FDRAWCMD;
  extern unsigned IOCTL_FDRESET;
  extern unsigned IOCTL_FDSETDRVPRM;
  extern unsigned IOCTL_FDSETEMSGTRESH;
  extern unsigned IOCTL_FDSETMAXERRS;
  extern unsigned IOCTL_FDSETPRM;
  extern unsigned IOCTL_FDTWADDLE;
  extern unsigned IOCTL_FDWERRORCLR;
  extern unsigned IOCTL_FDWERRORGET;
  extern unsigned IOCTL_HDIO_DRIVE_CMD;
  extern unsigned IOCTL_HDIO_GETGEO;
  extern unsigned IOCTL_HDIO_GET_32BIT;
  extern unsigned IOCTL_HDIO_GET_DMA;
  extern unsigned IOCTL_HDIO_GET_IDENTITY;
  extern unsigned IOCTL_HDIO_GET_KEEPSETTINGS;
  extern unsigned IOCTL_HDIO_GET_MULTCOUNT;
  extern unsigned IOCTL_HDIO_GET_NOWERR;
  extern unsigned IOCTL_HDIO_GET_UNMASKINTR;
  extern unsigned IOCTL_HDIO_SET_32BIT;
  extern unsigned IOCTL_HDIO_SET_DMA;
  extern unsigned IOCTL_HDIO_SET_KEEPSETTINGS;
  extern unsigned IOCTL_HDIO_SET_MULTCOUNT;
  extern unsigned IOCTL_HDIO_SET_NOWERR;
  extern unsigned IOCTL_HDIO_SET_UNMASKINTR;
  extern unsigned IOCTL_MTIOCPOS;
  extern unsigned IOCTL_PPPIOCGASYNCMAP;
  extern unsigned IOCTL_PPPIOCGDEBUG;
  extern unsigned IOCTL_PPPIOCGFLAGS;
  extern unsigned IOCTL_PPPIOCGUNIT;
  extern unsigned IOCTL_PPPIOCGXASYNCMAP;
  extern unsigned IOCTL_PPPIOCSASYNCMAP;
  extern unsigned IOCTL_PPPIOCSDEBUG;
  extern unsigned IOCTL_PPPIOCSFLAGS;
  extern unsigned IOCTL_PPPIOCSMAXCID;
  extern unsigned IOCTL_PPPIOCSMRU;
  extern unsigned IOCTL_PPPIOCSXASYNCMAP;
  extern unsigned IOCTL_SIOCDARP;
  extern unsigned IOCTL_SIOCDRARP;
  extern unsigned IOCTL_SIOCGARP;
  extern unsigned IOCTL_SIOCGIFENCAP;
  extern unsigned IOCTL_SIOCGIFHWADDR;
  extern unsigned IOCTL_SIOCGIFMAP;
  extern unsigned IOCTL_SIOCGIFMEM;
  extern unsigned IOCTL_SIOCGIFNAME;
  extern unsigned IOCTL_SIOCGIFSLAVE;
  extern unsigned IOCTL_SIOCGRARP;
  extern unsigned IOCTL_SIOCGSTAMP;
  extern unsigned IOCTL_SIOCSARP;
  extern unsigned IOCTL_SIOCSIFENCAP;
  extern unsigned IOCTL_SIOCSIFHWADDR;
  extern unsigned IOCTL_SIOCSIFLINK;
  extern unsigned IOCTL_SIOCSIFMAP;
  extern unsigned IOCTL_SIOCSIFMEM;
  extern unsigned IOCTL_SIOCSIFSLAVE;
  extern unsigned IOCTL_SIOCSRARP;
  extern unsigned IOCTL_SNDCTL_COPR_HALT;
  extern unsigned IOCTL_SNDCTL_COPR_LOAD;
  extern unsigned IOCTL_SNDCTL_COPR_RCODE;
  extern unsigned IOCTL_SNDCTL_COPR_RCVMSG;
  extern unsigned IOCTL_SNDCTL_COPR_RDATA;
  extern unsigned IOCTL_SNDCTL_COPR_RESET;
  extern unsigned IOCTL_SNDCTL_COPR_RUN;
  extern unsigned IOCTL_SNDCTL_COPR_SENDMSG;
  extern unsigned IOCTL_SNDCTL_COPR_WCODE;
  extern unsigned IOCTL_SNDCTL_COPR_WDATA;
  extern unsigned IOCTL_TCFLSH;
  extern unsigned IOCTL_TCGETA;
  extern unsigned IOCTL_TCGETS;
  extern unsigned IOCTL_TCSBRK;
  extern unsigned IOCTL_TCSBRKP;
  extern unsigned IOCTL_TCSETA;
  extern unsigned IOCTL_TCSETAF;
  extern unsigned IOCTL_TCSETAW;
  extern unsigned IOCTL_TCSETS;
  extern unsigned IOCTL_TCSETSF;
  extern unsigned IOCTL_TCSETSW;
  extern unsigned IOCTL_TCXONC;
  extern unsigned IOCTL_TIOCGLCKTRMIOS;
  extern unsigned IOCTL_TIOCGSOFTCAR;
  extern unsigned IOCTL_TIOCINQ;
  extern unsigned IOCTL_TIOCLINUX;
  extern unsigned IOCTL_TIOCSERCONFIG;
  extern unsigned IOCTL_TIOCSERGETLSR;
  extern unsigned IOCTL_TIOCSERGWILD;
  extern unsigned IOCTL_TIOCSERSWILD;
  extern unsigned IOCTL_TIOCSLCKTRMIOS;
  extern unsigned IOCTL_TIOCSSOFTCAR;
  extern unsigned IOCTL_VT_DISALLOCATE;
  extern unsigned IOCTL_VT_GETSTATE;
  extern unsigned IOCTL_VT_RESIZE;
  extern unsigned IOCTL_VT_RESIZEX;
  extern unsigned IOCTL_VT_SENDSIG;
#endif  // SANITIZER_LINUX
#if SANITIZER_LINUX || SANITIZER_FREEBSD
  extern unsigned IOCTL_MTIOCGET;
  extern unsigned IOCTL_MTIOCTOP;
  extern unsigned IOCTL_SIOCADDRT;
  extern unsigned IOCTL_SIOCDELRT;
  extern unsigned IOCTL_SNDCTL_DSP_GETBLKSIZE;
  extern unsigned IOCTL_SNDCTL_DSP_GETFMTS;
  extern unsigned IOCTL_SNDCTL_DSP_NONBLOCK;
  extern unsigned IOCTL_SNDCTL_DSP_POST;
  extern unsigned IOCTL_SNDCTL_DSP_RESET;
  extern unsigned IOCTL_SNDCTL_DSP_SETFMT;
  extern unsigned IOCTL_SNDCTL_DSP_SETFRAGMENT;
  extern unsigned IOCTL_SNDCTL_DSP_SPEED;
  extern unsigned IOCTL_SNDCTL_DSP_STEREO;
  extern unsigned IOCTL_SNDCTL_DSP_SUBDIVIDE;
  extern unsigned IOCTL_SNDCTL_DSP_SYNC;
  extern unsigned IOCTL_SNDCTL_FM_4OP_ENABLE;
  extern unsigned IOCTL_SNDCTL_FM_LOAD_INSTR;
  extern unsigned IOCTL_SNDCTL_MIDI_INFO;
  extern unsigned IOCTL_SNDCTL_MIDI_PRETIME;
  extern unsigned IOCTL_SNDCTL_SEQ_CTRLRATE;
  extern unsigned IOCTL_SNDCTL_SEQ_GETINCOUNT;
  extern unsigned IOCTL_SNDCTL_SEQ_GETOUTCOUNT;
  extern unsigned IOCTL_SNDCTL_SEQ_NRMIDIS;
  extern unsigned IOCTL_SNDCTL_SEQ_NRSYNTHS;
  extern unsigned IOCTL_SNDCTL_SEQ_OUTOFBAND;
  extern unsigned IOCTL_SNDCTL_SEQ_PANIC;
  extern unsigned IOCTL_SNDCTL_SEQ_PERCMODE;
  extern unsigned IOCTL_SNDCTL_SEQ_RESET;
  extern unsigned IOCTL_SNDCTL_SEQ_RESETSAMPLES;
  extern unsigned IOCTL_SNDCTL_SEQ_SYNC;
  extern unsigned IOCTL_SNDCTL_SEQ_TESTMIDI;
  extern unsigned IOCTL_SNDCTL_SEQ_THRESHOLD;
  extern unsigned IOCTL_SNDCTL_SYNTH_INFO;
  extern unsigned IOCTL_SNDCTL_SYNTH_MEMAVL;
  extern unsigned IOCTL_SNDCTL_TMR_CONTINUE;
  extern unsigned IOCTL_SNDCTL_TMR_METRONOME;
  extern unsigned IOCTL_SNDCTL_TMR_SELECT;
  extern unsigned IOCTL_SNDCTL_TMR_SOURCE;
  extern unsigned IOCTL_SNDCTL_TMR_START;
  extern unsigned IOCTL_SNDCTL_TMR_STOP;
  extern unsigned IOCTL_SNDCTL_TMR_TEMPO;
  extern unsigned IOCTL_SNDCTL_TMR_TIMEBASE;
  extern unsigned IOCTL_SOUND_MIXER_READ_ALTPCM;
  extern unsigned IOCTL_SOUND_MIXER_READ_BASS;
  extern unsigned IOCTL_SOUND_MIXER_READ_CAPS;
  extern unsigned IOCTL_SOUND_MIXER_READ_CD;
  extern unsigned IOCTL_SOUND_MIXER_READ_DEVMASK;
  extern unsigned IOCTL_SOUND_MIXER_READ_ENHANCE;
  extern unsigned IOCTL_SOUND_MIXER_READ_IGAIN;
  extern unsigned IOCTL_SOUND_MIXER_READ_IMIX;
  extern unsigned IOCTL_SOUND_MIXER_READ_LINE1;
  extern unsigned IOCTL_SOUND_MIXER_READ_LINE2;
  extern unsigned IOCTL_SOUND_MIXER_READ_LINE3;
  extern unsigned IOCTL_SOUND_MIXER_READ_LINE;
  extern unsigned IOCTL_SOUND_MIXER_READ_LOUD;
  extern unsigned IOCTL_SOUND_MIXER_READ_MIC;
  extern unsigned IOCTL_SOUND_MIXER_READ_MUTE;
  extern unsigned IOCTL_SOUND_MIXER_READ_OGAIN;
  extern unsigned IOCTL_SOUND_MIXER_READ_PCM;
  extern unsigned IOCTL_SOUND_MIXER_READ_RECLEV;
  extern unsigned IOCTL_SOUND_MIXER_READ_RECMASK;
  extern unsigned IOCTL_SOUND_MIXER_READ_RECSRC;
  extern unsigned IOCTL_SOUND_MIXER_READ_SPEAKER;
  extern unsigned IOCTL_SOUND_MIXER_READ_STEREODEVS;
  extern unsigned IOCTL_SOUND_MIXER_READ_SYNTH;
  extern unsigned IOCTL_SOUND_MIXER_READ_TREBLE;
  extern unsigned IOCTL_SOUND_MIXER_READ_VOLUME;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_ALTPCM;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_BASS;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_CD;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_ENHANCE;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_IGAIN;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_IMIX;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE1;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE2;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE3;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_LINE;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_LOUD;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_MIC;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_MUTE;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_OGAIN;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_PCM;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_RECLEV;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_RECSRC;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_SPEAKER;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_SYNTH;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_TREBLE;
  extern unsigned IOCTL_SOUND_MIXER_WRITE_VOLUME;
  extern unsigned IOCTL_SOUND_PCM_READ_BITS;
  extern unsigned IOCTL_SOUND_PCM_READ_CHANNELS;
  extern unsigned IOCTL_SOUND_PCM_READ_FILTER;
  extern unsigned IOCTL_SOUND_PCM_READ_RATE;
  extern unsigned IOCTL_SOUND_PCM_WRITE_CHANNELS;
  extern unsigned IOCTL_SOUND_PCM_WRITE_FILTER;
  extern unsigned IOCTL_VT_ACTIVATE;
  extern unsigned IOCTL_VT_GETMODE;
  extern unsigned IOCTL_VT_OPENQRY;
  extern unsigned IOCTL_VT_RELDISP;
  extern unsigned IOCTL_VT_SETMODE;
  extern unsigned IOCTL_VT_WAITACTIVE;
#endif  // SANITIZER_LINUX || SANITIZER_FREEBSD

#if SANITIZER_LINUX && !SANITIZER_ANDROID
  extern unsigned IOCTL_CYGETDEFTHRESH;
  extern unsigned IOCTL_CYGETDEFTIMEOUT;
  extern unsigned IOCTL_CYGETMON;
  extern unsigned IOCTL_CYGETTHRESH;
  extern unsigned IOCTL_CYGETTIMEOUT;
  extern unsigned IOCTL_CYSETDEFTHRESH;
  extern unsigned IOCTL_CYSETDEFTIMEOUT;
  extern unsigned IOCTL_CYSETTHRESH;
  extern unsigned IOCTL_CYSETTIMEOUT;
  extern unsigned IOCTL_EQL_EMANCIPATE;
  extern unsigned IOCTL_EQL_ENSLAVE;
  extern unsigned IOCTL_EQL_GETMASTRCFG;
  extern unsigned IOCTL_EQL_GETSLAVECFG;
  extern unsigned IOCTL_EQL_SETMASTRCFG;
  extern unsigned IOCTL_EQL_SETSLAVECFG;
  extern unsigned IOCTL_EVIOCGKEYCODE_V2;
  extern unsigned IOCTL_EVIOCGPROP;
  extern unsigned IOCTL_EVIOCSKEYCODE_V2;
  extern unsigned IOCTL_FS_IOC_GETFLAGS;
  extern unsigned IOCTL_FS_IOC_GETVERSION;
  extern unsigned IOCTL_FS_IOC_SETFLAGS;
  extern unsigned IOCTL_FS_IOC_SETVERSION;
  extern unsigned IOCTL_GIO_CMAP;
  extern unsigned IOCTL_GIO_FONT;
  extern unsigned IOCTL_GIO_UNIMAP;
  extern unsigned IOCTL_GIO_UNISCRNMAP;
  extern unsigned IOCTL_KDADDIO;
  extern unsigned IOCTL_KDDELIO;
  extern unsigned IOCTL_KDGETKEYCODE;
  extern unsigned IOCTL_KDGKBDIACR;
  extern unsigned IOCTL_KDGKBENT;
  extern unsigned IOCTL_KDGKBLED;
  extern unsigned IOCTL_KDGKBMETA;
  extern unsigned IOCTL_KDGKBSENT;
  extern unsigned IOCTL_KDMAPDISP;
  extern unsigned IOCTL_KDSETKEYCODE;
  extern unsigned IOCTL_KDSIGACCEPT;
  extern unsigned IOCTL_KDSKBDIACR;
  extern unsigned IOCTL_KDSKBENT;
  extern unsigned IOCTL_KDSKBLED;
  extern unsigned IOCTL_KDSKBMETA;
  extern unsigned IOCTL_KDSKBSENT;
  extern unsigned IOCTL_KDUNMAPDISP;
  extern unsigned IOCTL_LPABORT;
  extern unsigned IOCTL_LPABORTOPEN;
  extern unsigned IOCTL_LPCAREFUL;
  extern unsigned IOCTL_LPCHAR;
  extern unsigned IOCTL_LPGETIRQ;
  extern unsigned IOCTL_LPGETSTATUS;
  extern unsigned IOCTL_LPRESET;
  extern unsigned IOCTL_LPSETIRQ;
  extern unsigned IOCTL_LPTIME;
  extern unsigned IOCTL_LPWAIT;
  extern unsigned IOCTL_MTIOCGETCONFIG;
  extern unsigned IOCTL_MTIOCSETCONFIG;
  extern unsigned IOCTL_PIO_CMAP;
  extern unsigned IOCTL_PIO_FONT;
  extern unsigned IOCTL_PIO_UNIMAP;
  extern unsigned IOCTL_PIO_UNIMAPCLR;
  extern unsigned IOCTL_PIO_UNISCRNMAP;
  extern unsigned IOCTL_SCSI_IOCTL_GET_IDLUN;
  extern unsigned IOCTL_SCSI_IOCTL_PROBE_HOST;
  extern unsigned IOCTL_SCSI_IOCTL_TAGGED_DISABLE;
  extern unsigned IOCTL_SCSI_IOCTL_TAGGED_ENABLE;
  extern unsigned IOCTL_SIOCAIPXITFCRT;
  extern unsigned IOCTL_SIOCAIPXPRISLT;
  extern unsigned IOCTL_SIOCAX25ADDUID;
  extern unsigned IOCTL_SIOCAX25DELUID;
  extern unsigned IOCTL_SIOCAX25GETPARMS;
  extern unsigned IOCTL_SIOCAX25GETUID;
  extern unsigned IOCTL_SIOCAX25NOUID;
  extern unsigned IOCTL_SIOCAX25SETPARMS;
  extern unsigned IOCTL_SIOCDEVPLIP;
  extern unsigned IOCTL_SIOCIPXCFGDATA;
  extern unsigned IOCTL_SIOCNRDECOBS;
  extern unsigned IOCTL_SIOCNRGETPARMS;
  extern unsigned IOCTL_SIOCNRRTCTL;
  extern unsigned IOCTL_SIOCNRSETPARMS;
  extern unsigned IOCTL_SNDCTL_DSP_GETISPACE;
  extern unsigned IOCTL_SNDCTL_DSP_GETOSPACE;
  extern unsigned IOCTL_TIOCGSERIAL;
  extern unsigned IOCTL_TIOCSERGETMULTI;
  extern unsigned IOCTL_TIOCSERSETMULTI;
  extern unsigned IOCTL_TIOCSSERIAL;
#endif  // SANITIZER_LINUX && !SANITIZER_ANDROID

#if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID
  extern unsigned IOCTL_GIO_SCRNMAP;
  extern unsigned IOCTL_KDDISABIO;
  extern unsigned IOCTL_KDENABIO;
  extern unsigned IOCTL_KDGETLED;
  extern unsigned IOCTL_KDGETMODE;
  extern unsigned IOCTL_KDGKBMODE;
  extern unsigned IOCTL_KDGKBTYPE;
  extern unsigned IOCTL_KDMKTONE;
  extern unsigned IOCTL_KDSETLED;
  extern unsigned IOCTL_KDSETMODE;
  extern unsigned IOCTL_KDSKBMODE;
  extern unsigned IOCTL_KIOCSOUND;
  extern unsigned IOCTL_PIO_SCRNMAP;
#endif

  extern const int si_SEGV_MAPERR;
  extern const int si_SEGV_ACCERR;
}  // namespace __sanitizer

#define CHECK_TYPE_SIZE(TYPE) \
  COMPILER_CHECK(sizeof(__sanitizer_##TYPE) == sizeof(TYPE))

#define CHECK_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
  COMPILER_CHECK(sizeof(((__sanitizer_##CLASS *) NULL)->MEMBER) == \
                 sizeof(((CLASS *) NULL)->MEMBER));                \
  COMPILER_CHECK(offsetof(__sanitizer_##CLASS, MEMBER) ==          \
                 offsetof(CLASS, MEMBER))

// For sigaction, which is a function and struct at the same time,
// and thus requires explicit "struct" in sizeof() expression.
#define CHECK_STRUCT_SIZE_AND_OFFSET(CLASS, MEMBER)                       \
  COMPILER_CHECK(sizeof(((struct __sanitizer_##CLASS *) NULL)->MEMBER) == \
                 sizeof(((struct CLASS *) NULL)->MEMBER));                \
  COMPILER_CHECK(offsetof(struct __sanitizer_##CLASS, MEMBER) ==          \
                 offsetof(struct CLASS, MEMBER))

#define SIGACTION_SYMNAME sigaction

#endif  // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC

#endif