diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-09 08:15:22 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-09 09:13:48 +0100 |
commit | 617dc0f5a1f1c682d4ae1b5ffbd8892d0a76f664 (patch) | |
tree | 71b0456bee440d94893e282257a2172f48cc0f00 /freebsd | |
parent | rtems-bsd-mutex: Update due to API changes (diff) | |
download | rtems-libbsd-617dc0f5a1f1c682d4ae1b5ffbd8892d0a76f664.tar.bz2 |
Really robust linker sets
The previous attempt to fix this issue failed.
See also:
https://gcc.gnu.org/ml/gcc/2016-09/msg00114.htm
Diffstat (limited to 'freebsd')
-rw-r--r-- | freebsd/sys/sys/linker_set.h | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/freebsd/sys/sys/linker_set.h b/freebsd/sys/sys/linker_set.h index 874d3f44..4dedcd91 100644 --- a/freebsd/sys/sys/linker_set.h +++ b/freebsd/sys/sys/linker_set.h @@ -126,10 +126,19 @@ #define RWSET_DECLARE(set, ptype) \ RTEMS_BSD_DECLARE_RWSET(set, ptype *) +static __inline void * +_linker_set_obfuscate(const void *marker) +{ + + /* Obfuscate the variable, so that the compiler cannot optimize */ + __asm__("" : "+r" (marker)); + return (__DECONST(void *, marker)); +} + #define SET_BEGIN(set) \ - (__CONCAT(_bsd__start_set_,set)) + _linker_set_obfuscate(__CONCAT(_bsd__start_set_,set)) #define SET_LIMIT(set) \ - (__CONCAT(_bsd__stop_set_,set)) + _linker_set_obfuscate(__CONCAT(_bsd__stop_set_,set)) #endif /* __rtems__ */ /* @@ -139,21 +148,8 @@ * containing those addresses. Thus is must be declared as "type **pvar", * and the address of each set item is obtained inside the loop by "*pvar". */ -#ifndef __rtems__ #define SET_FOREACH(pvar, set) \ for (pvar = SET_BEGIN(set); pvar < SET_LIMIT(set); pvar++) -#else /* __rtems__ */ -static __inline void * -_set_next(__uintptr_t pvar, __size_t s) -{ - - __asm__("" : "+r" (pvar)); - return (void *)(pvar + s); -} -#define SET_FOREACH(pvar, set) \ - for (pvar = SET_BEGIN(set); pvar < SET_LIMIT(set); \ - pvar = _set_next((__uintptr_t)pvar, sizeof(*pvar))) -#endif /* __rtems__ */ #define SET_ITEM(set, i) \ ((SET_BEGIN(set))[i]) |