1# Copyright (c) 2025 IAR Systems AB
2#
3# SPDX-License-Identifier: Apache-2.0
4
5set_property(TARGET linker PROPERTY devices_start_symbol "_device_list_start")
6find_program(CMAKE_LINKER
7  NAMES ${CROSS_COMPILE}${IAR_LINKER}
8  PATHS ${TOOLCHAIN_HOME}
9  PATH_SUFFIXES bin
10  NO_DEFAULT_PATH
11)
12
13if(CONFIG_IAR_DATA_INIT)
14  zephyr_linker_section(NAME .iar.init_table KVMA RAM_REGION GROUP RODATA_REGION)
15endif()
16
17add_custom_target(${IAR_LINKER})
18set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED)
19set(IAR_LIB_USED)
20function(toolchain_ld_force_undefined_symbols "")
21#  foreach(symbol ${ARGN})
22#    zephyr_link_libraries(--place_holder=${symbol})
23#  endforeach()
24endfunction()
25
26# NOTE: ${linker_script_gen} will be produced at build-time; not at configure-time
27macro(configure_linker_script linker_script_gen linker_pass_define)
28  set(extra_dependencies ${ARGN})
29  set(STEERING_FILE "${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen}.xcl")
30  set(STEERING_FILE_ARG "-DSTEERING_FILE=${STEERING_FILE}")
31  set(cmake_linker_script_settings
32      ${PROJECT_BINARY_DIR}/include/generated/ld_script_settings_${linker_pass_define}.cmake
33  )
34  if("${linker_pass_define}" STREQUAL "LINKER_ZEPHYR_PREBUILT")
35    set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "--diag_suppress=Lt056")
36  else()
37    set(ILINK_THUMB_CALLS_WARNING_SUPPRESSED "")
38  endif()
39  if(CONFIG_IAR_LIBC OR CONFIG_IAR_LIBCPP)
40    set(IAR_LIB_USED "-DIAR_LIBC=1")
41  else()
42    set(IAR_LIB_USED "")
43  endif()
44  zephyr_linker_generate_linker_settings_file(${cmake_linker_script_settings})
45
46  add_custom_command(
47    OUTPUT ${linker_script_gen}
48           ${STEERING_FILE}
49    DEPENDS
50           ${extra_dependencies}
51           ${cmake_linker_script_settings}
52           ${DEVICE_API_LD_TARGET}
53    COMMAND ${CMAKE_COMMAND}
54      -C ${cmake_linker_script_settings}
55      -DPASS="${linker_pass_define}"
56      ${STEERING_FILE_ARG}
57      -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/${linker_script_gen}
58      ${IAR_LIB_USED}
59      -P ${ZEPHYR_BASE}/cmake/linker/iar/config_file_script.cmake
60  )
61
62endmacro()
63
64function(toolchain_ld_link_elf)
65  cmake_parse_arguments(
66    TOOLCHAIN_LD_LINK_ELF                                     # prefix of output variables
67    ""                                                        # list of names of the boolean arguments
68    "TARGET_ELF;OUTPUT_MAP;LINKER_SCRIPT"                     # list of names of scalar arguments
69    "LIBRARIES_PRE_SCRIPT;LIBRARIES_POST_SCRIPT;DEPENDENCIES" # list of names of list arguments
70    ${ARGN}                                                   # input args to parse
71  )
72
73  set(whole_libs)
74  foreach(lib ${WHOLE_ARCHIVE_LIBS})
75	  list(APPEND whole_libs --whole_archive ${lib})
76  endforeach()
77
78  set(ILINK_SEMIHOSTING)
79  set(ILINK_BUFFERED_WRITE)
80  if(${CONFIG_IAR_SEMIHOSTING})
81    set(ILINK_SEMIHOSTING "--semihosting")
82  endif()
83  if(${CONFIG_IAR_BUFFERED_WRITE})
84    set(ILINK_BUFFERED_WRITE "--redirect __write=__write_buffered")
85  endif()
86
87  set(ILINK_XCL "-f ${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}.xcl")
88
89  set(ILINK_TLS_LIBRARY)
90  if(${CONFIG_THREAD_LOCAL_STORAGE})
91    set(ILINK_TLS_LIBRARY "--threaded_lib=manual")
92  endif()
93
94  set(ILINK_TZONE_LIBRARY)
95  # if(${CONFIG_IAR_LIBC})
96  #   set(ILINK_TZONE_LIBRARY "--timezone_lib")
97  # endif()
98
99  target_link_libraries(
100    ${TOOLCHAIN_LD_LINK_ELF_TARGET_ELF}
101    ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_PRE_SCRIPT}
102    --config=${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}
103    ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_POST_SCRIPT}
104    --map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}
105    --log_file=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}.log
106
107    ${whole_libs}
108    ${NO_WHOLE_ARCHIVE_LIBS}
109    $<TARGET_OBJECTS:${OFFSETS_LIB}>
110    --entry=$<TARGET_PROPERTY:linker,ENTRY>
111
112    ${ILINK_SEMIHOSTING}
113    ${ILINK_BUFFERED_WRITE}
114    ${ILINK_TLS_LIBRARY}
115    ${ILINK_TZONE_LIBRARY}
116    ${ILINK_THUMB_CALLS_WARNING_SUPPRESSED}
117    # Do not remove symbols
118    #--no_remove
119    ${ILINK_XCL}
120
121    ${TOOLCHAIN_LIBS_OBJECTS}
122
123    ${TOOLCHAIN_LD_LINK_ELF_DEPENDENCIES}
124  )
125endfunction(toolchain_ld_link_elf)
126
127include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake)
128include(${ZEPHYR_BASE}/cmake/linker/ld/target_configure.cmake)
129