|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member) __seg_gs *) \
- offsetof (struct pthread, member)); \
+ ((__typeof (*descr) __seg_gs *)0)->member; \
})
#define THREAD_GETMEM_VOLATILE(descr, member) \
|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(volatile __typeof (descr->member) __seg_gs *) \
- offsetof (struct pthread, member)); \
+ ((volatile __typeof (*descr) __seg_gs *)0)->member; \
})
/* Same as THREAD_GETMEM, but the member offset can be non-constant. */
|| sizeof (descr->member[0]) == 4 \
|| sizeof (descr->member[0]) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member[0]) __seg_gs *) \
- offsetof (struct pthread, member[idx])); \
+ ((__typeof (*descr) __seg_gs *)0)->member[idx]; \
})
/* Set member of the thread descriptor directly. */
|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member) __seg_gs *) \
- offsetof (struct pthread, member) = (value)); \
+ ((__typeof (*descr) __seg_gs *)0)->member = (value); \
})
/* Same as THREAD_SETMEM, but the member offset can be non-constant. */
|| sizeof (descr->member[0]) == 4 \
|| sizeof (descr->member[0]) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member[0]) __seg_gs *) \
- offsetof (struct pthread, member[idx]) = (value)); \
+ ((__typeof (*descr) __seg_gs *)0)->member[idx] = (value); \
})
/* Return the thread descriptor for the current thread. */
# define THREAD_SELF \
- (*(struct pthread *__seg_gs *) offsetof (struct pthread, header.self))
+ (*(struct pthread *__seg_gs *)&((struct pthread __seg_gs *)0)->header.self)
/* Magic for libthread_db to know how to do THREAD_SELF. */
# define DB_THREAD_SELF \
{ int __res; \
asm volatile ("xchgl %1, %0" \
: "=r" (__res) \
- : "m" (*(int __seg_gs *) \
- offsetof (struct pthread, header.gscope_flag)), \
+ : "m" (((struct pthread __seg_gs *)0)->header.gscope_flag), \
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member) __seg_fs *) \
- offsetof (struct pthread, member)); \
+ ((__typeof (*descr) __seg_fs *)0)->member; \
})
#define THREAD_GETMEM_VOLATILE(descr, member) \
|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(volatile __typeof (descr->member) __seg_fs *) \
- offsetof (struct pthread, member)); \
+ ((volatile __typeof (*descr) __seg_fs *)0)->member; \
})
/* Same as THREAD_GETMEM, but the member offset can be non-constant. */
|| sizeof (descr->member[0]) == 4 \
|| sizeof (descr->member[0]) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member[0]) __seg_fs *) \
- offsetof (struct pthread, member[idx])); \
+ ((__typeof (*descr) __seg_fs *)0)->member[idx]; \
})
/* Set member of the thread descriptor directly. */
|| sizeof (descr->member) == 4 \
|| sizeof (descr->member) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member) __seg_fs *) \
- offsetof (struct pthread, member) = (value)); \
+ ((__typeof (*descr) __seg_fs *)0)->member = (value); \
})
/* Same as THREAD_SETMEM, but the member offset can be non-constant. */
|| sizeof (descr->member[0]) == 4 \
|| sizeof (descr->member[0]) == 8, \
"size of per-thread data"); \
- (*(__typeof (descr->member[0]) __seg_fs *) \
- offsetof (struct pthread, member[idx]) = (value)); \
+ ((__typeof (*descr) __seg_fs *)0)->member[idx] = (value); \
})
/* Return the thread descriptor for the current thread. */
# define THREAD_SELF \
- (*(struct pthread *__seg_fs *) offsetof (struct pthread, header.self))
+ (*(struct pthread *__seg_fs *)&((struct pthread __seg_fs *)0)->header.self)
/* Magic for libthread_db to know how to do THREAD_SELF. */
# define DB_THREAD_SELF_INCLUDE <sys/reg.h> /* For the FS constant. */
{ int __res; \
asm volatile ("xchgl %1, %0" \
: "=r" (__res) \
- : "m" (*(int __seg_fs *) \
- offsetof (struct pthread, header.gscope_flag)), \
+ : "m" (((struct pthread __seg_fs *)0)->header.gscope_flag), \
"0" (THREAD_GSCOPE_FLAG_UNUSED)); \
if (__res == THREAD_GSCOPE_FLAG_WAIT) \
lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \