[rtems-libbsd commit] Generalize linker sets

Sebastian Huber sebh at rtems.org
Wed Oct 8 12:57:37 UTC 2014


Module:    rtems-libbsd
Branch:    master
Commit:    9cea6da7806c9b096f44b9180e170a42381318e8
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=9cea6da7806c9b096f44b9180e170a42381318e8

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Oct  1 13:19:35 2014 +0200

Generalize linker sets

Add ability to create linker sets for items with an arbitrary type.

---

 freebsd/sys/sys/linker_set.h    |   40 +++++++++++++++++++++++++-------------
 rtemsbsd/rtems/rtems-bsd-init.c |    6 ++--
 2 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/freebsd/sys/sys/linker_set.h b/freebsd/sys/sys/linker_set.h
index 4795781..35baa89 100644
--- a/freebsd/sys/sys/linker_set.h
+++ b/freebsd/sys/sys/linker_set.h
@@ -51,25 +51,39 @@
 	static void const * const __set_##set##_sym_##sym 		\
 	__section("set_" #set) __used = &sym
 #else /* __rtems__ */
-#define RTEMS_BSD_DEFINE_SET(set, ptype)				\
-	ptype * const __CONCAT(_bsd__start_set_,set)[0]			\
+#define RTEMS_BSD_DEFINE_SET(set, type)				\
+	type const __CONCAT(_bsd__start_set_,set)[0]			\
 	__section(".rtemsroset.bsd." __STRING(set) ".begin") __used;		\
-	ptype * 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 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 const __set_##set##_sym_##sym 			\
+	__section(".rtemsroset.bsd." __STRING(set) ".content") __used
+
 #define __MAKE_SET(set, sym)						\
-	static const void * const __set_##set##_sym_##sym 		\
-	__section(".rtemsroset.bsd." __STRING(set) ".content") __used = &sym
+	RTEMS_BSD_DEFINE_SET_ITEM(set, sym, const void *) = &sym
 
-#define RTEMS_BSD_DEFINE_RWSET(set, ptype)				\
-	ptype *__CONCAT(_bsd__start_set_,set)[0]			\
+#define RTEMS_BSD_DEFINE_RWSET(set, type)				\
+	type __CONCAT(_bsd__start_set_,set)[0]			\
 	__section(".rtemsrwset.bsd." __STRING(set) ".begin") __used;		\
-	ptype *__CONCAT(_bsd__stop_set_,set)[0]				\
+	type __CONCAT(_bsd__stop_set_,set)[0]				\
 	__section(".rtemsrwset.bsd." __STRING(set) ".end") __used
 
+#define RTEMS_BSD_DECLARE_RWSET(set, type)				\
+	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 __set_##set##_sym_##sym 				\
+	__section(".rtemsrwset.bsd." __STRING(set) ".content") __used
+
 #define __MAKE_RWSET(set, sym)						\
-	static const void * __set_##set##_sym_##sym 			\
-	__section(".rtemsrwset.bsd." __STRING(set) ".content") __used = &sym
+	RTEMS_BSD_DEFINE_RWSET_ITEM(set, sym, const void *) = &sym
 #endif /* __rtems__ */
 #else /* !__GNUCLIKE___SECTION */
 #ifndef lint
@@ -104,12 +118,10 @@
 	(&__CONCAT(__stop_set_,set))
 #else /* __rtems__ */
 #define SET_DECLARE(set, ptype)						\
-	extern ptype * const __CONCAT(_bsd__start_set_,set)[];		\
-	extern ptype * const __CONCAT(_bsd__stop_set_,set)[]
+	RTEMS_BSD_DECLARE_SET(set, ptype *)
 
 #define RWSET_DECLARE(set, ptype)					\
-	extern ptype *__CONCAT(_bsd__start_set_,set)[];			\
-	extern ptype *__CONCAT(_bsd__stop_set_,set)[]
+	RTEMS_BSD_DECLARE_RWSET(set, ptype *)
 
 #define SET_BEGIN(set)							\
 	(__CONCAT(_bsd__start_set_,set))
diff --git a/rtemsbsd/rtems/rtems-bsd-init.c b/rtemsbsd/rtems/rtems-bsd-init.c
index 62bfd3a..c9271fd 100644
--- a/rtemsbsd/rtems/rtems-bsd-init.c
+++ b/rtemsbsd/rtems/rtems-bsd-init.c
@@ -58,10 +58,10 @@ SYSINIT_REFERENCE(linker_kernel);
 SYSINIT_MODULE_REFERENCE(rootbus);
 SYSINIT_DRIVER_REFERENCE(nexus, root);
 
-RTEMS_BSD_DEFINE_SET(modmetadata_set, struct mod_metadata);
-RTEMS_BSD_DEFINE_SET(sysctl_set, struct sysctl_oid);
+RTEMS_BSD_DEFINE_SET(modmetadata_set, struct mod_metadata *);
+RTEMS_BSD_DEFINE_SET(sysctl_set, struct sysctl_oid *);
 
-RTEMS_BSD_DEFINE_RWSET(sysinit_set, struct sysinit);
+RTEMS_BSD_DEFINE_RWSET(sysinit_set, struct sysinit *);
 
 /* In FreeBSD this is a local function */
 void mi_startup(void);



More information about the vc mailing list