[rtems-libbsd commit] linker: Enforce set alignment requirements

Joel Sherrill joel at rtems.org
Wed Mar 10 14:58:05 UTC 2021


Module:    rtems-libbsd
Branch:    6-freebsd-12
Commit:    3abebabf1dfde30cc257ce9be884c6bd4fa1779c
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=3abebabf1dfde30cc257ce9be884c6bd4fa1779c

Author:    Kinsey Moore <kinsey.moore at oarcorp.com>
Date:      Thu Feb 25 12:41:05 2021 -0600

linker: Enforce set alignment requirements

According to commentary on GCC bug
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99143, the alignment
behavior of linker sections on which RTEMS has relied was never
guaranteed to be consistent across platforms and any alignment
requirements for linker sections needs to be enforced explicitly.
This adds those explicit alignment requirements.

---

 freebsd/sys/sys/linker_set.h | 51 ++++++++++++++++++++++++++++++++------------
 1 file changed, 37 insertions(+), 14 deletions(-)

diff --git a/freebsd/sys/sys/linker_set.h b/freebsd/sys/sys/linker_set.h
index e10be24..baa5ae4 100755
--- a/freebsd/sys/sys/linker_set.h
+++ b/freebsd/sys/sys/linker_set.h
@@ -68,39 +68,62 @@
 	__used = &(sym)
 #define __MAKE_SET(set, sym)	__MAKE_SET_QV(set, sym, __MAKE_SET_CONST)
 #else /* __rtems__ */
+
+#if __cplusplus >= 201103L
+  #define RTEMS_BSD_ALIGNOF( _type_name ) alignof( _type_name )
+#elif __STDC_VERSION__ >= 201112L
+  #define RTEMS_BSD_ALIGNOF( _type_name ) _Alignof( _type_name )
+#else
+  #define RTEMS_BSD_ALIGNOF( _type_name ) sizeof( _type_name )
+#endif
+
+#define RTEMS_BSD_SET_ALIGN( type )	\
+	__attribute__(( __aligned__( RTEMS_BSD_ALIGNOF( type ) ) ))
+
 #define RTEMS_BSD_DEFINE_SET(set, type)					\
-	type const __CONCAT(_bsd__start_set_,set)[0]		\
+	RTEMS_BSD_SET_ALIGN( type ) type				\
+	const __CONCAT(_bsd__start_set_,set)[0]				\
 	__section(".rtemsroset.bsd." __STRING(set) ".begin") __used;	\
-	type const __CONCAT(_bsd__stop_set_,set)[0]		\
+	RTEMS_BSD_SET_ALIGN( type ) 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]
+	extern RTEMS_BSD_SET_ALIGN( type ) type				\
+	const __CONCAT(_bsd__start_set_,set)[0];			\
+	extern RTEMS_BSD_SET_ALIGN( type ) 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.1") __used
+	static RTEMS_BSD_SET_ALIGN( type ) type				\
+	const __set_##set##_sym_##sym					\
+	__section(".rtemsroset.bsd." __STRING(set) ".content.1") __used
 
-#define RTEMS_BSD_DEFINE_SET_ITEM_ORDERED(set, sym, order, type)     \
-	static type const __set_##set##_sym_##sym     \
-       __section(".rtemsroset.bsd." __STRING(set) ".content.0."  RTEMS_XSTRING( order )) __used
+#define RTEMS_BSD_DEFINE_SET_ITEM_ORDERED(set, sym, order, type)	\
+	static RTEMS_BSD_SET_ALIGN( type ) type				\
+	const __set_##set##_sym_##sym     				\
+	__section(".rtemsroset.bsd." __STRING(set) ".content.0."  RTEMS_XSTRING( order )) __used
 
 #define __MAKE_SET(set, sym)						\
 	RTEMS_BSD_DEFINE_SET_ITEM(set, sym, const void *) = &sym
 
 #define RTEMS_BSD_DEFINE_RWSET(set, type)				\
-	type __CONCAT(_bsd__start_set_,set)[0]				\
+	RTEMS_BSD_SET_ALIGN( type ) type				\
+	__CONCAT(_bsd__start_set_,set)[0]				\
 	__section(".rtemsrwset.bsd." __STRING(set) ".begin") __used;	\
-	type __CONCAT(_bsd__stop_set_,set)[0]				\
+	RTEMS_BSD_SET_ALIGN( type ) 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]
+	extern RTEMS_BSD_SET_ALIGN( type ) type				\
+	__CONCAT(_bsd__start_set_,set)[0];				\
+	extern RTEMS_BSD_SET_ALIGN( type ) type				\
+	__CONCAT(_bsd__stop_set_,set)[0]
 
 #define RTEMS_BSD_DEFINE_RWSET_ITEM(set, sym, type)			\
-	static type __set_##set##_sym_##sym 				\
+	static RTEMS_BSD_SET_ALIGN( type ) type				\
+	__set_##set##_sym_##sym 					\
 	__section(".rtemsrwset.bsd." __STRING(set) ".content") __used
 
 #define __MAKE_RWSET(set, sym)						\



More information about the vc mailing list