mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-09 00:02:17 +03:00
9b2921bea1
for time64 support on 32-bit archs, the kernel interfaces use a timespec layout padded to match the representation of a pair of 64-bit values, which requires endian-specific padding. use of an ordinary, non-bitfield, named member for the padding is undesirable because, on big endian archs, it would alter the interpretation of traditional (non-designated) initializers of the form {s,ns}, initializing the padding instead of the tv_nsec member. unnamed bitfield members solve this problem by not taking part in initialization, and were the expected solution when the kernel interfaces were designed. however, they also have further advantages which we take advantage of here: positioning of the padding could be controlled by having a preprocessor conditional with separate definitions of struct timespec for little and big endian, but whether padding should appear at all is a function of whether time_t is larger than long. this condition is not something the preprocessor can determine unless we were to define a new macro specifically for that purpose. by using unnamed bitfield members instead of ordinary named members, we can arrange for the size of the padding to collapse to zero when it should not be present, just by using sizeof(time_t) and sizeof(long) in the bitfield width expression, which can be any integer constant expression.
91 lines
3.3 KiB
C
91 lines
3.3 KiB
C
#define __LITTLE_ENDIAN 1234
|
|
#define __BIG_ENDIAN 4321
|
|
|
|
TYPEDEF unsigned _Addr size_t;
|
|
TYPEDEF unsigned _Addr uintptr_t;
|
|
TYPEDEF _Addr ptrdiff_t;
|
|
TYPEDEF _Addr ssize_t;
|
|
TYPEDEF _Addr intptr_t;
|
|
TYPEDEF _Addr regoff_t;
|
|
TYPEDEF _Reg register_t;
|
|
|
|
TYPEDEF signed char int8_t;
|
|
TYPEDEF signed short int16_t;
|
|
TYPEDEF signed int int32_t;
|
|
TYPEDEF signed _Int64 int64_t;
|
|
TYPEDEF signed _Int64 intmax_t;
|
|
TYPEDEF unsigned char uint8_t;
|
|
TYPEDEF unsigned short uint16_t;
|
|
TYPEDEF unsigned int uint32_t;
|
|
TYPEDEF unsigned _Int64 uint64_t;
|
|
TYPEDEF unsigned _Int64 u_int64_t;
|
|
TYPEDEF unsigned _Int64 uintmax_t;
|
|
|
|
TYPEDEF unsigned mode_t;
|
|
TYPEDEF unsigned _Reg nlink_t;
|
|
TYPEDEF _Int64 off_t;
|
|
TYPEDEF unsigned _Int64 ino_t;
|
|
TYPEDEF unsigned _Int64 dev_t;
|
|
TYPEDEF long blksize_t;
|
|
TYPEDEF _Int64 blkcnt_t;
|
|
TYPEDEF unsigned _Int64 fsblkcnt_t;
|
|
TYPEDEF unsigned _Int64 fsfilcnt_t;
|
|
|
|
TYPEDEF unsigned wint_t;
|
|
TYPEDEF unsigned long wctype_t;
|
|
|
|
TYPEDEF void * timer_t;
|
|
TYPEDEF int clockid_t;
|
|
TYPEDEF long clock_t;
|
|
STRUCT timeval { time_t tv_sec; suseconds_t tv_usec; };
|
|
STRUCT timespec { time_t tv_sec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER==4321); long tv_nsec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER!=4321); };
|
|
|
|
TYPEDEF int pid_t;
|
|
TYPEDEF unsigned id_t;
|
|
TYPEDEF unsigned uid_t;
|
|
TYPEDEF unsigned gid_t;
|
|
TYPEDEF int key_t;
|
|
TYPEDEF unsigned useconds_t;
|
|
|
|
#ifdef __cplusplus
|
|
TYPEDEF unsigned long pthread_t;
|
|
#else
|
|
TYPEDEF struct __pthread * pthread_t;
|
|
#endif
|
|
TYPEDEF int pthread_once_t;
|
|
TYPEDEF unsigned pthread_key_t;
|
|
TYPEDEF int pthread_spinlock_t;
|
|
TYPEDEF struct { unsigned __attr; } pthread_mutexattr_t;
|
|
TYPEDEF struct { unsigned __attr; } pthread_condattr_t;
|
|
TYPEDEF struct { unsigned __attr; } pthread_barrierattr_t;
|
|
TYPEDEF struct { unsigned __attr[2]; } pthread_rwlockattr_t;
|
|
|
|
STRUCT _IO_FILE { char __x; };
|
|
TYPEDEF struct _IO_FILE FILE;
|
|
|
|
TYPEDEF __builtin_va_list va_list;
|
|
TYPEDEF __builtin_va_list __isoc_va_list;
|
|
|
|
TYPEDEF struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t;
|
|
|
|
TYPEDEF struct __locale_struct * locale_t;
|
|
|
|
TYPEDEF struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
|
|
|
|
STRUCT iovec { void *iov_base; size_t iov_len; };
|
|
|
|
TYPEDEF unsigned socklen_t;
|
|
TYPEDEF unsigned short sa_family_t;
|
|
|
|
TYPEDEF struct { union { int __i[sizeof(long)==8?14:9]; volatile int __vi[sizeof(long)==8?14:9]; unsigned long __s[sizeof(long)==8?7:9]; } __u; } pthread_attr_t;
|
|
TYPEDEF struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } pthread_mutex_t;
|
|
TYPEDEF struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } mtx_t;
|
|
TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } pthread_cond_t;
|
|
TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } cnd_t;
|
|
TYPEDEF struct { union { int __i[sizeof(long)==8?14:8]; volatile int __vi[sizeof(long)==8?14:8]; void *__p[sizeof(long)==8?7:8]; } __u; } pthread_rwlock_t;
|
|
TYPEDEF struct { union { int __i[sizeof(long)==8?8:5]; volatile int __vi[sizeof(long)==8?8:5]; void *__p[sizeof(long)==8?4:5]; } __u; } pthread_barrier_t;
|
|
|
|
#undef _Addr
|
|
#undef _Int64
|
|
#undef _Reg
|