summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-26 14:38:23 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-26 14:38:23 +0200
commited499fab5b562fd2a44efbf57c9bf11d959a86ab (patch)
treefb6884b960b6b22996a803334254c8e76e073bb8
parentPrepare copyiniov() for FreeBSD update (diff)
downloadrtems-libbsd-ed499fab5b562fd2a44efbf57c9bf11d959a86ab.tar.bz2
More robust linker sets
See also: https://gcc.gnu.org/ml/gcc/2016-09/msg00114.html
-rw-r--r--freebsd/sys/sys/linker_set.h32
1 files changed, 24 insertions, 8 deletions
diff --git a/freebsd/sys/sys/linker_set.h b/freebsd/sys/sys/linker_set.h
index 1d64e117..874d3f44 100644
--- a/freebsd/sys/sys/linker_set.h
+++ b/freebsd/sys/sys/linker_set.h
@@ -33,6 +33,9 @@
#ifndef _SYS_CDEFS_H_
#error this file needs sys/cdefs.h as a prerequisite
#endif
+#ifdef __rtems__
+#include <sys/_types.h>
+#endif /* __rtems__ */
/*
* The following macros are used to declare global sets of objects, which
@@ -52,17 +55,17 @@
__section("set_" #set) __used = &sym
#else /* __rtems__ */
#define RTEMS_BSD_DEFINE_SET(set, type) \
- type volatile const __CONCAT(_bsd__start_set_,set)[0] \
+ type const __CONCAT(_bsd__start_set_,set)[0] \
__section(".rtemsroset.bsd." __STRING(set) ".begin") __used; \
- type volatile const __CONCAT(_bsd__stop_set_,set)[0] \
+ type const __CONCAT(_bsd__stop_set_,set)[0] \
__section(".rtemsroset.bsd." __STRING(set) ".end") __used
#define RTEMS_BSD_DECLARE_SET(set, type) \
- extern type volatile const __CONCAT(_bsd__start_set_,set)[0]; \
- extern type volatile const __CONCAT(_bsd__stop_set_,set)[0]
+ extern type const __CONCAT(_bsd__start_set_,set)[0]; \
+ extern type const __CONCAT(_bsd__stop_set_,set)[0]
#define RTEMS_BSD_DEFINE_SET_ITEM(set, sym, type) \
- static type volatile const __set_##set##_sym_##sym \
+ static type const __set_##set##_sym_##sym \
__section(".rtemsroset.bsd." __STRING(set) ".content") __used
#define __MAKE_SET(set, sym) \
@@ -75,11 +78,11 @@
__section(".rtemsrwset.bsd." __STRING(set) ".end") __used
#define RTEMS_BSD_DECLARE_RWSET(set, type) \
- extern type volatile __CONCAT(_bsd__start_set_,set)[0]; \
- extern type volatile __CONCAT(_bsd__stop_set_,set)[0]
+ extern type __CONCAT(_bsd__start_set_,set)[0]; \
+ extern type __CONCAT(_bsd__stop_set_,set)[0]
#define RTEMS_BSD_DEFINE_RWSET_ITEM(set, sym, type) \
- static type volatile __set_##set##_sym_##sym \
+ static type __set_##set##_sym_##sym \
__section(".rtemsrwset.bsd." __STRING(set) ".content") __used
#define __MAKE_RWSET(set, sym) \
@@ -136,8 +139,21 @@
* 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])