summaryrefslogtreecommitdiff
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-09-16 07:13:58 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-12-08 09:25:22 +0100
commitb618d8cfc54f84d4ed03dc7b7fa510c872e6128a (patch)
tree324b769a7866c0ac2ce8f5208861e5207834d9a4 /cpukit
parent9736283857a54008d1dcf63c8c892942e35824a6 (diff)
Add RTEMS linker sets
Update #2408.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/score/Makefile.am1
-rw-r--r--cpukit/score/include/rtems/linkersets.h96
-rw-r--r--cpukit/score/preinstall.am4
3 files changed, 101 insertions, 0 deletions
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index fb93b98096..c90f4a2404 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -17,6 +17,7 @@ include_sys_HEADERS += include/sys/timex.h
include_rtemsdir = $(includedir)/rtems
include_rtems_HEADERS =
+include_rtems_HEADERS += include/rtems/linkersets.h
include_rtems_HEADERS += include/rtems/system.h
include_rtems_HEADERS += include/rtems/seterr.h
diff --git a/cpukit/score/include/rtems/linkersets.h b/cpukit/score/include/rtems/linkersets.h
new file mode 100644
index 0000000000..e40be6679d
--- /dev/null
+++ b/cpukit/score/include/rtems/linkersets.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_LINKERSET_H
+#define _RTEMS_LINKERSET_H
+
+#include <rtems/score/basedefs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define RTEMS_LINKER_SET_BEGIN( set ) \
+ _Linker_set_##set##_begin
+
+#define RTEMS_LINKER_SET_END( set ) \
+ _Linker_set_##set##_end
+
+#define RTEMS_LINKER_SET_SIZE( set ) \
+ ( (size_t) ( _Linker_set_##set##_end - _Linker_set_##set##_begin ) )
+
+#define RTEMS_LINKER_ROSET_DECLARE( set, type ) \
+ extern type volatile const RTEMS_LINKER_SET_BEGIN( set )[0]; \
+ extern type volatile const RTEMS_LINKER_SET_END( set )[0]
+
+#define RTEMS_LINKER_ROSET( set, type ) \
+ type volatile const RTEMS_LINKER_SET_BEGIN( set )[0] \
+ RTEMS_SECTION( ".rtemsroset." #set ".begin" ) RTEMS_USED; \
+ type volatile const RTEMS_LINKER_SET_END( set )[0] \
+ RTEMS_SECTION( ".rtemsroset." #set ".end" ) RTEMS_USED
+
+#define RTEMS_LINKER_ROSET_ITEM_DECLARE( set, type, item ) \
+ extern type volatile const _Linker_set_##set##_##item
+
+#define RTEMS_LINKER_ROSET_ITEM_REFERENCE( set, type, item ) \
+ static type volatile const * const _Set_reference_##set##_##item \
+ RTEMS_SECTION( ".rtemsroset.reference" ) RTEMS_USED = \
+ &_Linker_set_##set##_##item
+
+#define RTEMS_LINKER_ROSET_ITEM_ORDERED( set, type, item, order ) \
+ type volatile const _Linker_set_##set##_##item \
+ RTEMS_SECTION( ".rtemsroset." #set ".content.0." RTEMS_XSTRING( order ) ) \
+ RTEMS_USED
+
+#define RTEMS_LINKER_ROSET_ITEM( set, type, item ) \
+ type volatile const _Linker_set_##set##_##item \
+ RTEMS_SECTION( ".rtemsroset." #set ".content.1" ) RTEMS_USED
+
+#define RTEMS_LINKER_RWSET_DECLARE( set, type ) \
+ extern type volatile RTEMS_LINKER_SET_BEGIN( set )[0]; \
+ extern type volatile RTEMS_LINKER_SET_END( set )[0]
+
+#define RTEMS_LINKER_RWSET( set, type ) \
+ type volatile RTEMS_LINKER_SET_BEGIN( set )[0] \
+ RTEMS_SECTION( ".rtemsrwset." #set ".begin" ) RTEMS_USED; \
+ type volatile RTEMS_LINKER_SET_END( set )[0] \
+ RTEMS_SECTION( ".rtemsrwset." #set ".end" ) RTEMS_USED
+
+#define RTEMS_LINKER_RWSET_ITEM_DECLARE( set, type, item ) \
+ extern type volatile _Linker_set_##set##_##item
+
+/*
+ * The .rtemsroset is here not a typo. We must ensure that the references are
+ * not a victim of the garbage collection of the linker. Thus, we place them
+ * in a dedicated area of the RTEMS read-only linker set section.
+ */
+#define RTEMS_LINKER_RWSET_ITEM_REFERENCE( set, type, item ) \
+ static type volatile * const _Set_reference_##set##_##item \
+ RTEMS_SECTION( ".rtemsroset.reference" ) RTEMS_USED = \
+ &_Linker_set_##set##_##item
+
+#define RTEMS_LINKER_RWSET_ITEM_ORDERED( set, type, item, order ) \
+ type volatile _Linker_set_##set##_##item \
+ RTEMS_SECTION( ".rtemsrwset." #set ".content.0." RTEMS_XSTRING( order ) ) \
+ RTEMS_USED
+
+#define RTEMS_LINKER_RWSET_ITEM( set, type, item ) \
+ type volatile _Linker_set_##set##_##item \
+ RTEMS_SECTION( ".rtemsrwset." #set ".content.1" ) RTEMS_USED
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_LINKERSET_H */
diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
index 4b96109774..4a45e8787a 100644
--- a/cpukit/score/preinstall.am
+++ b/cpukit/score/preinstall.am
@@ -43,6 +43,10 @@ $(PROJECT_INCLUDE)/rtems/$(dirstamp):
@: > $(PROJECT_INCLUDE)/rtems/$(dirstamp)
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+$(PROJECT_INCLUDE)/rtems/linkersets.h: include/rtems/linkersets.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/linkersets.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/linkersets.h
+
$(PROJECT_INCLUDE)/rtems/system.h: include/rtems/system.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/system.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/system.h