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

          Line data    Source code
       1           1 : /*
       2             :  * Copyright (c) 2013-2014, Wind River Systems, Inc.
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : /**
       8             :  * @file
       9             :  * @brief GCC toolchain linker defs
      10             :  *
      11             :  * This header file defines the necessary macros used by the linker script for
      12             :  * use with the GCC linker.
      13             :  */
      14             : 
      15             : #ifndef ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_
      16             : #define ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_
      17             : 
      18             : #include <zephyr/kernel/mm.h>
      19             : 
      20             : #if defined(CONFIG_ARM)
      21             :         #if defined(CONFIG_BIG_ENDIAN)
      22             :                 #define OUTPUT_FORMAT_ "elf32-bigarm"
      23             :         #else
      24             :                 #define OUTPUT_FORMAT_ "elf32-littlearm"
      25             :         #endif
      26             :         OUTPUT_FORMAT(OUTPUT_FORMAT_)
      27             : #elif defined(CONFIG_ARM64)
      28             :         OUTPUT_FORMAT("elf64-littleaarch64")
      29             : #elif defined(CONFIG_ARC)
      30             :         #if defined(CONFIG_ISA_ARCV3) && defined(CONFIG_64BIT)
      31             :                 OUTPUT_FORMAT("elf64-littlearc64")
      32             :         #elif defined(CONFIG_ISA_ARCV3) && !defined(CONFIG_64BIT)
      33             :                 OUTPUT_FORMAT("elf32-littlearc64")
      34             :         #else
      35             :                 OUTPUT_FORMAT("elf32-littlearc", "elf32-bigarc", "elf32-littlearc")
      36             :         #endif
      37             : #elif defined(CONFIG_X86)
      38             :         #if defined(CONFIG_X86_64)
      39             :                 OUTPUT_FORMAT("elf64-x86-64")
      40             :                 OUTPUT_ARCH("i386:x86-64")
      41             :         #else
      42             :                 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
      43             :                 OUTPUT_ARCH("i386")
      44             :         #endif
      45             : #elif defined(CONFIG_NIOS2)
      46             :         OUTPUT_FORMAT("elf32-littlenios2", "elf32-bignios2", "elf32-littlenios2")
      47             : #elif defined(CONFIG_RISCV)
      48             :         OUTPUT_ARCH("riscv")
      49             : #ifdef CONFIG_64BIT
      50             :         OUTPUT_FORMAT("elf64-littleriscv")
      51             : #else
      52             :         OUTPUT_FORMAT("elf32-littleriscv")
      53             : #endif
      54             : #elif defined(CONFIG_XTENSA)
      55             :         /* Not needed */
      56             : #elif defined(CONFIG_MIPS)
      57             :         OUTPUT_ARCH("mips")
      58             : #elif defined(CONFIG_ARCH_POSIX)
      59             :         /* Not needed */
      60             : #elif defined(CONFIG_SPARC)
      61             :         OUTPUT_FORMAT("elf32-sparc")
      62             : #else
      63             :         #error Arch not supported.
      64             : #endif
      65             : 
      66             : /*
      67             :  * The GROUP_START() and GROUP_END() macros are used to define a group
      68             :  * of sections located in one memory area, such as RAM, ROM, etc.
      69             :  * The <where> parameter is the name of the memory area.
      70             :  */
      71           0 : #define GROUP_START(where)
      72           0 : #define GROUP_END(where)
      73             : 
      74             : /**
      75             :  * @def GROUP_LINK_IN
      76             :  *
      77             :  * Route memory to a specified memory area
      78             :  *
      79             :  * The GROUP_LINK_IN() macro is located at the end of the section
      80             :  * description and tells the linker that this section is located in
      81             :  * the memory area specified by 'where' argument.
      82             :  *
      83             :  * This macro is intentionally undefined for CONFIG_MMU systems when
      84             :  * CONFIG_KERNEL_VM_BASE is not the same as CONFIG_SRAM_BASE_ADDRESS,
      85             :  * as both the LMA and VMA destinations must be known for all sections
      86             :  * as this corresponds to physical vs. virtual location.
      87             :  *
      88             :  * @param where Destination memory area
      89             :  */
      90             : #if defined(CONFIG_ARCH_POSIX)
      91             : #define GROUP_LINK_IN(where)
      92             : #elif !defined(K_MEM_IS_VM_KERNEL)
      93           1 : #define GROUP_LINK_IN(where) > where
      94             : #endif
      95             : 
      96             : /**
      97             :  * @def GROUP_ROM_LINK_IN
      98             :  *
      99             :  * Route memory for a read-only section
     100             :  *
     101             :  * The GROUP_ROM_LINK_IN() macro is located at the end of the section
     102             :  * description and tells the linker that this a read-only section
     103             :  * that is physically placed at the 'lregion` argument.
     104             :  *
     105             :  * If CONFIG_XIP is active, the 'lregion' area is flash memory.
     106             :  *
     107             :  * If CONFIG_MMU is active, the vregion argument will be used to
     108             :  * determine where this is located in the virtual memory map, otherwise
     109             :  * it is ignored.
     110             :  *
     111             :  * @param vregion Output VMA (only used if CONFIG_MMU where LMA != VMA)
     112             :  * @param lregion Output LMA
     113             :  */
     114             : #if defined(CONFIG_ARCH_POSIX)
     115             : #define GROUP_ROM_LINK_IN(vregion, lregion)
     116             : #elif defined(K_MEM_IS_VM_KERNEL)
     117             : #define GROUP_ROM_LINK_IN(vregion, lregion) > vregion AT > lregion
     118             : #else
     119           1 : #define GROUP_ROM_LINK_IN(vregion, lregion) > lregion
     120             : #endif
     121             : 
     122             : /**
     123             :  * @def GROUP_DATA_LINK_IN
     124             :  *
     125             :  * Route memory for read-write sections that are loaded.
     126             :  *
     127             :  * Used for initialized data sections that on XIP platforms must be copied at
     128             :  * startup.
     129             :  *
     130             :  * @param vregion Output VMA
     131             :  * @param lregion Output LMA (only used if CONFIG_MMU if VMA != LMA,
     132             :  *                or CONFIG_XIP)
     133             :  */
     134             : #if defined(CONFIG_ARCH_POSIX)
     135             : #define GROUP_DATA_LINK_IN(vregion, lregion)
     136             : #elif defined(CONFIG_XIP) || defined(K_MEM_IS_VM_KERNEL)
     137             : #define GROUP_DATA_LINK_IN(vregion, lregion) > vregion AT > lregion
     138             : #else
     139           1 : #define GROUP_DATA_LINK_IN(vregion, lregion) > vregion
     140             : #endif
     141             : 
     142             : /**
     143             :  * @def GROUP_NOLOAD_LINK_IN
     144             :  *
     145             :  * Route memory for read-write sections that are NOT loaded; typically this
     146             :  * is only used for 'BSS' and 'noinit'.
     147             :  *
     148             :  * @param vregion Output VMA
     149             :  * @param lregion Output LMA (only used if CONFIG_MMU if VMA != LMA,
     150             :  *                corresponds to physical location)
     151             :  */
     152             : #if defined(CONFIG_ARCH_POSIX)
     153             : #define GROUP_NOLOAD_LINK_IN(vregion, lregion)
     154             : #elif defined(K_MEM_IS_VM_KERNEL)
     155             : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion AT > lregion
     156             : #elif defined(CONFIG_XIP)
     157             : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion AT > vregion
     158             : #else
     159           1 : #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion
     160             : #endif
     161             : 
     162             : /**
     163             :  * @def SECTION_PROLOGUE
     164             :  *
     165             :  * The SECTION_PROLOGUE() macro is used to define the beginning of a section.
     166             :  *
     167             :  * On MMU systems where VMA != LMA there is an implicit ALIGN_WITH_INPUT
     168             :  * specified.
     169             :  *
     170             :  * @param name Name of the output section
     171             :  * @param options Section options, such as (NOLOAD), or left blank
     172             :  * @param align Alignment directives, such as SUBALIGN(). ALIGN() itself is
     173             :  *              not allowed. May be blank.
     174             :  */
     175             : #ifdef K_MEM_IS_VM_KERNEL
     176             : /* If we have a virtual memory map we need ALIGN_WITH_INPUT in all sections */
     177             : #define SECTION_PROLOGUE(name, options, align) \
     178             :         name options : ALIGN_WITH_INPUT align
     179             : #else
     180           1 : #define SECTION_PROLOGUE(name, options, align) \
     181             :         name options : align
     182             : #endif
     183             : 
     184             : /**
     185             :  * @def SECTION_DATA_PROLOGUE
     186             :  *
     187             :  * Same as for SECTION_PROLOGUE(), except that this one must be used
     188             :  * for data sections which on XIP platforms will have differing
     189             :  * virtual and load addresses (i.e. they'll be copied into RAM at
     190             :  * program startup).  Such a section must also use
     191             :  * GROUP_DATA_LINK_IN to specify the correct output load address.
     192             :  *
     193             :  * This is equivalent to SECTION_PROLOGUE() on non-XIP systems.
     194             :  * On XIP systems there is an implicit ALIGN_WITH_INPUT specified.
     195             :  *
     196             :  * @param name Name of the output section
     197             :  * @param options Section options, or left blank
     198             :  * @param align Alignment directives, such as SUBALIGN(). ALIGN() itself is
     199             :  *              not allowed. May be blank.
     200             :  */
     201             : #if defined(CONFIG_XIP)
     202             : #define SECTION_DATA_PROLOGUE(name, options, align) \
     203             :         name options : ALIGN_WITH_INPUT
     204             : #else
     205           1 : #define SECTION_DATA_PROLOGUE(name, options, align) \
     206             :         SECTION_PROLOGUE(name, options, align)
     207             : #endif
     208             : 
     209           0 : #define COMMON_SYMBOLS *(COMMON)
     210             : 
     211             : #endif /* ZEPHYR_INCLUDE_LINKER_LINKER_TOOL_GCC_H_ */

Generated by: LCOV version 1.14