LCOV - code coverage report
Current view: top level - zephyr/linker - iterable_sections.h Hit Total Coverage
Test: new.info Lines: 6 7 85.7 %
Date: 2024-12-22 00:14:23

          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_ */

Generated by: LCOV version 1.14