diff --git a/arch/common/CMakeLists.txt b/arch/common/CMakeLists.txt
index ca0062a317f..aa9ddec353d 100644
--- a/arch/common/CMakeLists.txt
+++ b/arch/common/CMakeLists.txt
@@ -25,12 +25,12 @@ zephyr_linker_sources_ifdef(CONFIG_GEN_ISR_TABLES
)
if(CONFIG_GEN_ISR_TABLES)
- zephyr_linker_section(NAME .intList VMA IDT_LIST LMA IDT_LIST NOINPUT PASS 1)
+ zephyr_linker_section(NAME .intList VMA IDT_LIST LMA IDT_LIST NOINPUT PASS NOT LINKER_ZEPHYR_FINAL)
zephyr_linker_section_configure(SECTION .intList KEEP INPUT ".irq_info" FIRST)
zephyr_linker_section_configure(SECTION .intList KEEP INPUT ".intList")
- zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".irq_info" PASS 2)
- zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".intList" PASS 2)
+ zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".irq_info" PASS LINKER_ZEPHYR_FINAL)
+ zephyr_linker_section_configure(SECTION /DISCARD/ KEEP INPUT ".intList" PASS LINKER_ZEPHYR_FINAL)
endif()
zephyr_linker_sources_ifdef(CONFIG_ARCH_HAS_RAMFUNC_SUPPORT
diff --git a/cmake/extensions.cmake b/cmake/extensions.cmake
index 264884dd9b6..40b8b44fbc4 100644
--- a/cmake/extensions.cmake
+++ b/cmake/extensions.cmake
@@ -3256,7 +3256,7 @@ endfunction()
# [ADDRESS
] [ALIGN ]
# [SUBALIGN ] [FLAGS ]
# [HIDDEN] [NOINPUT] [NOINIT]
-# [PASS [...]
+# [PASS [NOT] ]
# )
#
# Zephyr linker output section.
@@ -3311,11 +3311,14 @@ endfunction()
# NOINPUT : No default input sections will be defined, to setup input
# sections for section , the corresponding
# `zephyr_linker_section_configure()` must be used.
-# PASS [ ..] : Linker pass iteration where this section should be active.
+# PASS [NOT] : Linker pass iteration where this section should be active.
# Default a section will be present during all linker passes
-# But in cases a section shall only be present at a specific
+# but in cases a section shall only be present at a specific
# pass, this argument can be used. For example to only have
-# this section present on the first linker pass, use `PASS 1`.
+# this section present on the `TEST` linker pass, use `PASS TEST`.
+# It is possible to negate , such as `PASS NOT `.
+# For example, `PASS NOT TEST` means the call is effective
+# on all but the `TEST` linker pass iteration.
#
# Note: VMA and LMA are mutual exclusive with GROUP
#
@@ -3353,6 +3356,17 @@ function(zephyr_linker_section)
endif()
endif()
+ if(DEFINED SECTION_PASS)
+ list(LENGTH SECTION_PASS pass_length)
+ if(${pass_length} GREATER 1)
+ list(GET SECTION_PASS 0 pass_elem_0)
+ if((NOT (${pass_elem_0} STREQUAL "NOT")) OR (${pass_length} GREATER 2))
+ message(FATAL_ERROR "zephyr_linker_section(PASS takes maximum "
+ "a single argument of the form: '' or 'NOT '.")
+ endif()
+ endif()
+ endif()
+
set(SECTION)
zephyr_linker_arg_val_list(SECTION "${single_args}")
zephyr_linker_arg_val_list(SECTION "${options}")
@@ -3513,7 +3527,7 @@ endfunction()
# Usage:
# zephyr_linker_section_configure(SECTION [ALIGN ]
-# [PASS ] [PRIO ] [SORT ]
+# [PASS [NOT] ] [PRIO ] [SORT ]
# [ANY] [FIRST] [KEEP]
# )
#
@@ -3542,18 +3556,20 @@ endfunction()
# you may use `PRIO 50`, `PRIO 20` and so on.
# To ensure an input section is at the end, it is advised
# to use `PRIO 200` and above.
-# PASS : The call should only be considered for linker pass number .
-# For example, `PASS 1` means the call is only effective
-# on first linker pass iteration. `PASS 2` on second iteration,
-# and so on.
+# PASS [NOT] : The call should only be considered for linker pass where
+# is defined. It is possible to negate , such
+# as `PASS NOT .
+# For example, `PASS TEST` means the call is only effective
+# on the `TEST` linker pass iteration. `PASS NOT TEST` on
+# all iterations the are not `TEST`.
# FLAGS : Special section flags such as "+RO", +XO, "+ZI".
# ANY : ANY section flag in scatter file.
# The FLAGS and ANY arguments only has effect for scatter files.
#
function(zephyr_linker_section_configure)
set(options "ANY;FIRST;KEEP")
- set(single_args "ALIGN;OFFSET;PASS;PRIO;SECTION;SORT")
- set(multi_args "FLAGS;INPUT;SYMBOLS")
+ set(single_args "ALIGN;OFFSET;PRIO;SECTION;SORT")
+ set(multi_args "FLAGS;INPUT;PASS;SYMBOLS")
cmake_parse_arguments(SECTION "${options}" "${single_args}" "${multi_args}" ${ARGN})
if(SECTION_UNPARSED_ARGUMENTS)
@@ -3568,6 +3584,17 @@ function(zephyr_linker_section_configure)
endif()
endif()
+ if(DEFINED SECTION_PASS)
+ list(LENGTH SECTION_PASS pass_length)
+ if(${pass_length} GREATER 1)
+ list(GET SECTION_PASS 0 pass_elem_0)
+ if((NOT (${pass_elem_0} STREQUAL "NOT")) OR (${pass_length} GREATER 2))
+ message(FATAL_ERROR "zephyr_linker_section_configure(PASS takes maximum "
+ "a single argument of the form: '' or 'NOT '.")
+ endif()
+ endif()
+ endif()
+
set(SECTION)
zephyr_linker_arg_val_list(SECTION "${single_args}")
zephyr_linker_arg_val_list(SECTION "${options}")
diff --git a/cmake/linker/armlink/target.cmake b/cmake/linker/armlink/target.cmake
index 359d3e7454b..d263e424aac 100644
--- a/cmake/linker/armlink/target.cmake
+++ b/cmake/linker/armlink/target.cmake
@@ -31,10 +31,7 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
set(STEERING_FILE_ARG)
set(STEERING_C_ARG)
- if("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_PREBUILT")
- set(PASS 1)
- elseif("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_FINAL")
- set(PASS 2)
+ if("LINKER_ZEPHYR_FINAL" IN_LIST "${linker_pass_define}")
set(STEERING_FILE ${CMAKE_CURRENT_BINARY_DIR}/armlink_symbol_steering.steer)
set(STEERING_C ${CMAKE_CURRENT_BINARY_DIR}/armlink_symbol_steering.c)
set(STEERING_FILE_ARG "-DSTEERING_FILE=${STEERING_FILE}")
@@ -46,7 +43,7 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
${STEERING_FILE}
${STEERING_C}
COMMAND ${CMAKE_COMMAND}
- -DPASS=${PASS}
+ -DPASS="${linker_pass_define}"
-DMEMORY_REGIONS="$"
-DGROUPS="$"
-DSECTIONS="$"
@@ -58,7 +55,7 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
-P ${ZEPHYR_BASE}/cmake/linker/armlink/scatter_script.cmake
)
- if("${PASS}" EQUAL 2)
+ if("LINKER_ZEPHYR_FINAL" IN_LIST "${linker_pass_define}")
add_library(armlink_steering OBJECT ${STEERING_C})
target_link_libraries(armlink_steering PRIVATE zephyr_interface)
endif()
diff --git a/cmake/linker/ld/target.cmake b/cmake/linker/ld/target.cmake
index ce2a4388fc1..f29d4e6be78 100644
--- a/cmake/linker/ld/target.cmake
+++ b/cmake/linker/ld/target.cmake
@@ -32,16 +32,10 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
set(extra_dependencies ${ARGN})
if(CONFIG_CMAKE_LINKER_GENERATOR)
- if("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_PREBUILT")
- set(PASS 1)
- elseif("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_FINAL")
- set(PASS 2)
- endif()
-
add_custom_command(
OUTPUT ${linker_script_gen}
COMMAND ${CMAKE_COMMAND}
- -DPASS=${PASS}
+ -DPASS="${linker_pass_define}"
-DFORMAT="$"
-DENTRY="$"
-DMEMORY_REGIONS="$"
diff --git a/cmake/linker/linker_script_common.cmake b/cmake/linker/linker_script_common.cmake
index fef3ad1e144..71811842ba2 100644
--- a/cmake/linker/linker_script_common.cmake
+++ b/cmake/linker/linker_script_common.cmake
@@ -100,9 +100,11 @@ function(create_section)
cmake_parse_arguments(SECTION "" "${single_args}" "${multi_args}" ${ARGN})
- if(DEFINED SECTION_PASS AND NOT "${PASS}" IN_LIST SECTION_PASS)
- # This section is not active in this pass, ignore.
- return()
+ if(DEFINED SECTION_PASS)
+ if(NOT (${SECTION_PASS} IN_LIST PASS))
+ # This section is not active in this pass, ignore.
+ return()
+ endif()
endif()
set_property(GLOBAL PROPERTY SECTION_${SECTION_NAME} TRUE)
@@ -128,8 +130,8 @@ function(create_section)
set_property(GLOBAL PROPERTY SYMBOL_TABLE___${name_clean}_end ${name_clean})
set(INDEX 100)
- set(settings_single "ALIGN;ANY;FIRST;KEEP;OFFSET;PASS;PRIO;SECTION;SORT")
- set(settings_multi "FLAGS;INPUT;SYMBOLS")
+ set(settings_single "ALIGN;ANY;FIRST;KEEP;OFFSET;PRIO;SECTION;SORT")
+ set(settings_multi "FLAGS;INPUT;PASS;SYMBOLS")
foreach(settings ${SECTION_SETTINGS})
if("${settings}" MATCHES "^{(.*)}$")
cmake_parse_arguments(SETTINGS "" "${settings_single}" "${settings_multi}" ${CMAKE_MATCH_1})
@@ -138,9 +140,11 @@ function(create_section)
continue()
endif()
- if(DEFINED SETTINGS_PASS AND NOT "${PASS}" IN_LIST SETTINGS_PASS)
- # This section setting is not active in this pass, ignore.
- continue()
+ if(DEFINED SETTINGS_PASS)
+ if(NOT (${SETTINGS_PASS} IN_LIST PASS))
+ # This section setting is not active in this pass, ignore.
+ continue()
+ endif()
endif()
if(DEFINED SETTINGS_PRIO)
diff --git a/cmake/linker_script/common/common-rom.cmake b/cmake/linker_script/common/common-rom.cmake
index 6f873e5d6d0..5d7f36ea86b 100644
--- a/cmake/linker_script/common/common-rom.cmake
+++ b/cmake/linker_script/common/common-rom.cmake
@@ -179,5 +179,5 @@ zephyr_linker_section(NAME zephyr_dbg_info KVMA RAM_REGION GROUP RODATA_REGION N
zephyr_linker_section_configure(SECTION zephyr_dbg_info INPUT ".zephyr_dbg_info" KEEP)
zephyr_linker_section(NAME device_handles KVMA RAM_REGION GROUP RODATA_REGION NOINPUT ${XIP_ALIGN_WITH_INPUT} ENDALIGN 16)
-zephyr_linker_section_configure(SECTION device_handles INPUT .__device_handles_pass1* KEEP SORT NAME PASS 1)
-zephyr_linker_section_configure(SECTION device_handles INPUT .__device_handles_pass2* KEEP SORT NAME PASS 2)
+zephyr_linker_section_configure(SECTION device_handles INPUT .__device_handles_pass1* KEEP SORT NAME PASS LINKER_ZEPHYR_PREBUILT)
+zephyr_linker_section_configure(SECTION device_handles INPUT .__device_handles_pass2* KEEP SORT NAME PASS NOT LINKER_ZEPHYR_PREBUILT)