Line data Source code
1 0 : /* 2 : * Copyright (C) 2020, Intel Corporation 3 : * Copyright (C) 2023, Nordic Semiconductor ASA 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef INCLUDE_ZEPHYR_LINKER_ITERABLE_SECTIONS_H_ 8 : #define INCLUDE_ZEPHYR_LINKER_ITERABLE_SECTIONS_H_ 9 : 10 : /** 11 : * @addtogroup iterable_section_apis 12 : * @{ 13 : */ 14 : 15 : #define Z_LINK_ITERABLE(struct_type) \ 16 : _CONCAT(_##struct_type, _list_start) = .; \ 17 : KEEP(*(SORT_BY_NAME(._##struct_type.static.*))); \ 18 : _CONCAT(_##struct_type, _list_end) = . 19 : 20 : #define Z_LINK_ITERABLE_NUMERIC(struct_type) \ 21 : _CONCAT(_##struct_type, _list_start) = .; \ 22 : KEEP(*(SORT(._##struct_type.static.*_?_*))); \ 23 : KEEP(*(SORT(._##struct_type.static.*_??_*))); \ 24 : _CONCAT(_##struct_type, _list_end) = . 25 : 26 : #define Z_LINK_ITERABLE_ALIGNED(struct_type, align) \ 27 : . = ALIGN(align); \ 28 : Z_LINK_ITERABLE(struct_type); 29 : 30 : #define Z_LINK_ITERABLE_GC_ALLOWED(struct_type) \ 31 : _CONCAT(_##struct_type, _list_start) = .; \ 32 : *(SORT_BY_NAME(._##struct_type.static.*)); \ 33 : _CONCAT(_##struct_type, _list_end) = . 34 : 35 : #define Z_LINK_ITERABLE_SUBALIGN CONFIG_LINKER_ITERABLE_SUBALIGN 36 : 37 : /** 38 : * @brief Define a read-only iterable section output. 39 : * 40 : * @details 41 : * Define an output section which will set up an iterable area 42 : * of equally-sized data structures. For use with STRUCT_SECTION_ITERABLE(). 43 : * Input sections will be sorted by name, per ld's SORT_BY_NAME. 44 : * 45 : * This macro should be used for read-only data. 46 : * 47 : * Note that this keeps the symbols in the image even though 48 : * they are not being directly referenced. Use this when symbols 49 : * are indirectly referenced by iterating through the section. 50 : */ 51 1 : #define ITERABLE_SECTION_ROM(struct_type, subalign) \ 52 : SECTION_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \ 53 : { \ 54 : Z_LINK_ITERABLE(struct_type); \ 55 : } GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) 56 : 57 : /** 58 : * @brief Define a read-only iterable section output, sorted numerically. 59 : * 60 : * This version of ITERABLE_SECTION_ROM() sorts the entries numerically, that 61 : * is, `SECNAME_10` will come after `SECNAME_2`. `_` separator is required, and 62 : * up to 2 numeric digits are handled (0-99). 63 : * 64 : * @see ITERABLE_SECTION_ROM() 65 : */ 66 1 : #define ITERABLE_SECTION_ROM_NUMERIC(struct_type, subalign) \ 67 : SECTION_PROLOGUE(struct_type##_area, EMPTY, SUBALIGN(subalign)) \ 68 : { \ 69 : Z_LINK_ITERABLE_NUMERIC(struct_type); \ 70 : } GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) 71 : 72 : /** 73 : * @brief Define a garbage collectable read-only iterable section output. 74 : * 75 : * @details 76 : * Define an output section which will set up an iterable area 77 : * of equally-sized data structures. For use with STRUCT_SECTION_ITERABLE(). 78 : * Input sections will be sorted by name, per ld's SORT_BY_NAME. 79 : * 80 : * This macro should be used for read-only data. 81 : * 82 : * Note that the symbols within the section can be garbage collected. 83 : */ 84 1 : #define ITERABLE_SECTION_ROM_GC_ALLOWED(struct_type, subalign) \ 85 : SECTION_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \ 86 : { \ 87 : Z_LINK_ITERABLE_GC_ALLOWED(struct_type); \ 88 : } GROUP_LINK_IN(ROMABLE_REGION) 89 : 90 : /** 91 : * @brief Define a read-write iterable section output. 92 : * 93 : * @details 94 : * Define an output section which will set up an iterable area 95 : * of equally-sized data structures. For use with STRUCT_SECTION_ITERABLE(). 96 : * Input sections will be sorted by name, per ld's SORT_BY_NAME. 97 : * 98 : * This macro should be used for read-write data that is modified at runtime. 99 : * 100 : * Note that this keeps the symbols in the image even though 101 : * they are not being directly referenced. Use this when symbols 102 : * are indirectly referenced by iterating through the section. 103 : */ 104 1 : #define ITERABLE_SECTION_RAM(struct_type, subalign) \ 105 : SECTION_DATA_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \ 106 : { \ 107 : Z_LINK_ITERABLE(struct_type); \ 108 : } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) 109 : 110 : /** 111 : * @brief Define a read-write iterable section output, sorted numerically. 112 : * 113 : * This version of ITERABLE_SECTION_RAM() sorts the entries numerically, that 114 : * is, `SECNAME10` will come after `SECNAME2`. Up to 2 numeric digits are 115 : * handled (0-99). 116 : * 117 : * @see ITERABLE_SECTION_RAM() 118 : */ 119 1 : #define ITERABLE_SECTION_RAM_NUMERIC(struct_type, subalign) \ 120 : SECTION_PROLOGUE(struct_type##_area, EMPTY, SUBALIGN(subalign)) \ 121 : { \ 122 : Z_LINK_ITERABLE_NUMERIC(struct_type); \ 123 : } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) 124 : 125 : /** 126 : * @brief Define a garbage collectable read-write iterable section output. 127 : * 128 : * @details 129 : * Define an output section which will set up an iterable area 130 : * of equally-sized data structures. For use with STRUCT_SECTION_ITERABLE(). 131 : * Input sections will be sorted by name, per ld's SORT_BY_NAME. 132 : * 133 : * This macro should be used for read-write data that is modified at runtime. 134 : * 135 : * Note that the symbols within the section can be garbage collected. 136 : */ 137 1 : #define ITERABLE_SECTION_RAM_GC_ALLOWED(struct_type, subalign) \ 138 : SECTION_DATA_PROLOGUE(struct_type##_area,,SUBALIGN(subalign)) \ 139 : { \ 140 : Z_LINK_ITERABLE_GC_ALLOWED(struct_type); \ 141 : } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) 142 : 143 : /** 144 : * @} 145 : */ /* end of struct_section_apis */ 146 : 147 : #endif /* INCLUDE_ZEPHYR_LINKER_ITERABLE_SECTIONS_H_ */