diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-09-16 07:13:58 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-12-08 09:25:22 +0100 |
commit | b618d8cfc54f84d4ed03dc7b7fa510c872e6128a (patch) | |
tree | 324b769a7866c0ac2ce8f5208861e5207834d9a4 /cpukit | |
parent | 9736283857a54008d1dcf63c8c892942e35824a6 (diff) |
Add RTEMS linker sets
Update #2408.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/score/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/score/include/rtems/linkersets.h | 96 | ||||
-rw-r--r-- | cpukit/score/preinstall.am | 4 |
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 |