Skip to content

Commit 7c8af37

Browse files
Add generic core support and prepare for E2E testing (#2355)
This PR adds updates to XC toolchain file and generic linker script template, which are required for XC32 toolchain E2E tests mentioned [here](Open-CMSIS-Pack/cmsis-toolbox#498)
1 parent d84a1c3 commit 7c8af37

File tree

2 files changed

+216
-46
lines changed

2 files changed

+216
-46
lines changed

tools/buildmgr/cbuildgen/config/XC.5.0.0.cmake

Lines changed: 151 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,70 +31,162 @@ function(cbuild_set_option_flags lang option value flags)
3131
list(FIND ${option}_VALUES "${value}" _index)
3232
if (${_index} GREATER -1)
3333
list(GET ${option}_${lang}_FLAGS ${_index} flag)
34-
if(NOT flag STREQUAL "")
35-
string(STRIP "${flag} ${${flags}}" ${flags})
36-
set(${flags} "${${flags}}" PARENT_SCOPE)
37-
endif()
34+
set(${flags} "${flag} ${${flags}}" PARENT_SCOPE)
3835
elseif(NOT value STREQUAL "")
3936
string(TOLOWER "${option}" _option)
4037
message(FATAL_ERROR "unknown '${_option}' value '${value}' !")
4138
endif()
4239
endfunction()
4340

4441
function(cbuild_set_options_flags lang optimize debug warnings language flags)
45-
set(tmp "")
42+
set(tmp)
4643
cbuild_set_option_flags(${lang} OPTIMIZE "${optimize}" tmp)
4744
cbuild_set_option_flags(${lang} DEBUG "${debug}" tmp)
4845
cbuild_set_option_flags(${lang} WARNINGS "${warnings}" tmp)
49-
if(lang STREQUAL "CC" OR lang STREQUAL "CXX")
50-
cbuild_set_option_flags(${lang} LANGUAGE "${language}" tmp)
51-
endif()
52-
set(${flags} "${tmp}" PARENT_SCOPE)
46+
cbuild_set_option_flags(${lang} LANGUAGE "${language}" tmp)
47+
set(${flags} "${tmp} ${${flags}}" PARENT_SCOPE)
5348
endfunction()
5449

55-
set(MDFP "")
56-
file(GLOB_RECURSE ALL_DIRS LIST_DIRECTORIES true "${DPACK_DIR}/*")
57-
foreach(DIR_PATH ${ALL_DIRS})
58-
if(IS_DIRECTORY "${DIR_PATH}")
59-
get_filename_component(CURRENT_DIR_NAME "${DIR_PATH}" NAME)
60-
if(CURRENT_DIR_NAME STREQUAL DNAME AND EXISTS "${DIR_PATH}/specs-${DNAME}")
61-
set(MDFP "${DIR_PATH}/../../")
62-
break()
63-
endif()
50+
function(cbuild_set_defines lang defines)
51+
set(TMP_DEFINES)
52+
foreach(DEFINE ${${defines}})
53+
string(REPLACE "\"" "\\\"" ENTRY ${DEFINE})
54+
string(REGEX REPLACE "=.*" "" KEY ${ENTRY})
55+
if (KEY STREQUAL ENTRY)
56+
set(VALUE "1")
57+
else()
58+
string(REGEX REPLACE ".*=" "" VALUE ${ENTRY})
6459
endif()
65-
endforeach()
60+
if(${lang} STREQUAL "AS_LEG")
61+
string(APPEND TMP_DEFINES "--defsym ${KEY}=${VALUE} ")
62+
elseif(${lang} STREQUAL "AS_GNU")
63+
string(APPEND TMP_DEFINES "-Wa,-defsym,\"${KEY}=${VALUE}\" ")
64+
else()
65+
string(APPEND TMP_DEFINES "-D${ENTRY} ")
66+
endif()
67+
endforeach()
68+
set(${defines} ${TMP_DEFINES} PARENT_SCOPE)
69+
endfunction()
70+
71+
# XC32 Processor/DFP flags
72+
if(DPACK MATCHES "Microchip")
73+
set(MDFP "")
74+
file(GLOB_RECURSE ALL_DIRS LIST_DIRECTORIES true "${DPACK_DIR}/*")
75+
foreach(DIR_PATH ${ALL_DIRS})
76+
if(IS_DIRECTORY "${DIR_PATH}" AND DIR_PATH MATCHES "xc32/")
77+
get_filename_component(CURRENT_DIR_NAME "${DIR_PATH}" NAME)
78+
if(CURRENT_DIR_NAME STREQUAL DNAME AND EXISTS "${DIR_PATH}/specs-${DNAME}")
79+
set(MDFP "${DIR_PATH}/../../")
80+
break()
81+
endif()
82+
endif()
83+
endforeach()
84+
85+
if(NOT DEFINED MDFP OR MDFP STREQUAL "")
86+
message(FATAL_ERROR " Error: Could not determine the DFP path for -mdfp option!!")
87+
endif()
88+
set(XC32_COMMON_FLAGS "-mprocessor=${DNAME} -mdfp=${MDFP}")
89+
else()
90+
set(XC_MODE "-mthumb")
91+
if(CPU MATCHES "ARM9")
92+
set(HAS_FPU_HARDWARE FALSE)
93+
set(XC_MODE "-marm")
94+
elseif(CPU MATCHES "Cortex-M0")
95+
if(CPU MATCHES "Cortex-M0+")
96+
set(CPU "Cortex-M0plus")
97+
endif()
98+
set(HAS_FPU_HARDWARE FALSE)
99+
elseif(CPU STREQUAL "Cortex-M3")
100+
set(HAS_FPU_HARDWARE FALSE)
101+
elseif(CPU MATCHES "Cortex-M4|Cortex-M7")
102+
set(HAS_FPU_HARDWARE TRUE)
103+
elseif(CPU MATCHES "Cortex-M23")
104+
set(HAS_FPU_HARDWARE FALSE)
105+
elseif(CPU MATCHES "Cortex-M33")
106+
set(HAS_FPU_HARDWARE TRUE)
107+
elseif(CPU MATCHES "Cortex-A")
108+
set(HAS_FPU_HARDWARE TRUE)
109+
set(XC_MODE "-marm")
110+
else()
111+
message(FATAL_ERROR "Error: CPU not supported by XC32!!")
112+
endif()
113+
114+
if(FPU STREQUAL "NOT_FPU" OR NOT FPU OR NOT HAS_FPU_HARDWARE)
115+
set(XC_MABI "soft")
116+
else()
117+
set(XC_MABI "hard")
118+
endif()
119+
120+
set(XC32_COMMON_FLAGS "-forceArch=pic32c ${XC_MODE} -mcpu=${CPU} -mfloat-abi=${XC_MABI}")
66121

67-
if(NOT DEFINED MDFP OR MDFP STREQUAL "")
68-
message(FATAL_ERROR " Error: Could not determine the DFP path for -mdfp option!!")
69122
endif()
70123

71124
set(OPTIMIZE_VALUES "debug" "none" "balanced" "size" "speed")
72125
set(OPTIMIZE_CC_FLAGS "-Og" "-O0" "-O2" "-Os" "-O1")
73126
set(OPTIMIZE_CXX_FLAGS ${OPTIMIZE_CC_FLAGS})
74127
set(OPTIMIZE_LD_FLAGS ${OPTIMIZE_CC_FLAGS})
75128
set(OPTIMIZE_ASM_FLAGS ${OPTIMIZE_CC_FLAGS})
129+
set(OPTIMIZE_AS_GNU_FLAGS ${OPTIMIZE_CC_FLAGS})
76130

77131
set(DEBUG_VALUES "on" "off")
78132
set(DEBUG_CC_FLAGS "-g" "")
79133
set(DEBUG_CXX_FLAGS       "-g"    "")
80134
set(DEBUG_LD_FLAGS        "-g"    "")
81135
set(DEBUG_ASM_FLAGS       "-g"    "")
136+
set(DEBUG_AS_GNU_FLAGS "-g"    "")
82137

83138
set(WARNINGS_VALUES "on" "off" "all")
84139
set(WARNINGS_CC_FLAGS "-Wall" "-w" "-Wall -Wextra")
85140
set(WARNINGS_CXX_FLAGS "-Wall" "-w" "-Wall -Wextra")
86141
set(WARNINGS_ASM_FLAGS "-Wall" "-w" "-Wall -Wextra")
142+
set(WARNINGS_AS_GNU_FLAGS "-Wall" "-w" "-Wall -Wextra")
87143
set(WARNINGS_LD_FLAGS "" "" "")
88144

89145
set(LANGUAGE_VALUES "c90" "gnu90" "c99" "gnu99" "c11" "gnu11" "" "" "c++98" "gnu++98" "c++03" "gnu++03" "c++11" "gnu++11" "c++14" "gnu++14" "c++17" "gnu++17" "" "" "" "" )
90146
set(LANGUAGE_CC_FLAGS "-std=c90" "-std=gnu90" "-std=c99" "-std=gnu99" "-std=c11" "-std=gnu11" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" )
91147
set(LANGUAGE_CXX_FLAGS "" "" "" "" "" "" "" "" "-std=c++98" "-std=gnu++98" "-std=c++03" "-std=gnu++03" "-std=c++11" "-std=gnu++11" "-std=c++14" "-std=gnu++14" "-std=c++17" "-std=gnu++17" "" "" "" "" )
92148

93-
# XC32 Processor/DFP flags
94-
set(XC32_COMMON_FLAGS "-mprocessor=${DNAME} -mdfp=${MDFP}")
149+
# Assembler
95150

96-
set(CPP_FLAGS "-E -P ${XC32_COMMON_FLAGS} -xc")
151+
set(AS_LEG_CPU ${XC32_COMMON_FLAGS})
152+
set(AS_GNU_CPU ${XC32_COMMON_FLAGS})
153+
set(ASM_CPU ${XC32_COMMON_FLAGS})
154+
155+
set(AS_LEG_FLAGS)
156+
set(AS_GNU_FLAGS "-c")
157+
set(ASM_FLAGS "-c")
158+
159+
set(AS_LEG_DEFINES ${DEFINES})
160+
cbuild_set_defines(AS_LEG AS_LEG_DEFINES)
161+
set(AS_GNU_DEFINES ${DEFINES})
162+
cbuild_set_defines(AS_GNU AS_GNU_DEFINES)
163+
set(ASM_DEFINES ${DEFINES})
164+
cbuild_set_defines(ASM ASM_DEFINES)
165+
166+
set(AS_LEG_OPTIONS_FLAGS)
167+
cbuild_set_options_flags(AS_LEG "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" AS_LEG_OPTIONS_FLAGS)
168+
set(AS_GNU_OPTIONS_FLAGS)
169+
cbuild_set_options_flags(AS_GNU "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" AS_GNU_OPTIONS_FLAGS)
170+
set(ASM_OPTIONS_FLAGS)
171+
cbuild_set_options_flags(ASM "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" ASM_OPTIONS_FLAGS)
172+
173+
if(BYTE_ORDER STREQUAL "Little-endian")
174+
set(ASM_BYTE_ORDER "-mlittle-endian")
175+
elseif(BYTE_ORDER STREQUAL "Big-endian")
176+
set(ASM_BYTE_ORDER "-mbig-endian")
177+
endif()
178+
set(AS_LEG_BYTE_ORDER "${ASM_BYTE_ORDER}")
179+
set(AS_GNU_BYTE_ORDER "${ASM_BYTE_ORDER}")
180+
181+
#C Pre-Processor
182+
183+
if(SECURE STREQUAL "Secure" OR SECURE STREQUAL "Secure-only")
184+
set(CC_SECURE "-mcmse")
185+
endif()
186+
187+
set(CPP_FLAGS "-E -P ${XC32_COMMON_FLAGS} -xc ${CC_SECURE}")
97188
set(CPP_DEFINES ${LD_SCRIPT_PP_DEFINES})
189+
cbuild_set_defines(CC CPP_DEFINES)
98190
if(DEFINED LD_REGIONS AND NOT LD_REGIONS STREQUAL "")
99191
set(CPP_INCLUDES "-include \"${LD_REGIONS}\"")
100192
endif()
@@ -103,40 +195,60 @@ separate_arguments(CPP_ARGS_LD_SCRIPT NATIVE_COMMAND ${CPP_ARGS_LD_SCRIPT})
103195

104196
# C Compiler
105197

106-
set(CC_OPTIONS_FLAGS "")
198+
set(CC_CPU "${XC32_COMMON_FLAGS}")
199+
set(CC_DEFINES ${ASM_DEFINES})
200+
set(CC_BYTE_ORDER ${ASM_BYTE_ORDER})
201+
set(CC_FLAGS)
202+
set(CC_OPTIONS_FLAGS)
203+
set(CC_LTO "-flto")
204+
set(_PI "-include ")
205+
set(_ISYS "-isystem ")
107206
cbuild_set_options_flags(CC "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "${LANGUAGE_CC}" CC_OPTIONS_FLAGS)
108-
set(CMAKE_C_FLAGS "${XC32_COMMON_FLAGS} ${CC_OPTIONS_FLAGS}")
109207

208+
if(BRANCHPROT STREQUAL "NO_BRANCHPROT")
209+
set(CC_BRANCHPROT "-mbranch-protection=none")
210+
elseif(BRANCHPROT STREQUAL "BTI")
211+
set(CC_BRANCHPROT "-mbranch-protection=bti")
212+
elseif(BRANCHPROT STREQUAL "BTI_SIGNRET")
213+
set(CC_BRANCHPROT "-mbranch-protection=bti+pac-ret")
214+
endif()
110215

111216
# C++ Compiler
112217

113-
set(CXX_OPTIONS_FLAGS "")
218+
set(CXX_CPU "${CC_CPU}")
219+
set(CXX_DEFINES "${CC_DEFINES}")
220+
set(CXX_BYTE_ORDER "${CC_BYTE_ORDER}")
221+
set(CXX_FLAGS "${CC_FLAGS}")
222+
set(CXX_OPTIONS_FLAGS)
223+
set(CXX_LTO "${CC_LTO}")
224+
set(CXX_SECURE "${CC_SECURE}")
225+
set(CXX_BRANCHPROT "${CC_BRANCHPROT}")
114226
cbuild_set_options_flags(CXX "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "${LANGUAGE_CXX}" CXX_OPTIONS_FLAGS)
115-
set(CMAKE_CXX_FLAGS "${XC32_COMMON_FLAGS} ${CXX_OPTIONS_FLAGS}")
116-
117-
# Assembler
118-
119-
set(ASM_OPTIONS_FLAGS "")
120-
cbuild_set_options_flags(ASM "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" ASM_OPTIONS_FLAGS)
121-
set(CMAKE_ASM_FLAGS "${XC32_COMMON_FLAGS} ${ASM_OPTIONS_FLAGS}")
122227

123228
# Linker
124229

125-
set(LD_OPTIONS_FLAGS "")
230+
set(LD_CPU ${XC32_COMMON_FLAGS})
231+
set(_LS "-T ")
232+
set(LD_FLAGS)
233+
set(LD_OPTIONS_FLAGS)
126234
cbuild_set_options_flags(LD "${OPTIMIZE}" "${DEBUG}" "${WARNINGS}" "" LD_OPTIONS_FLAGS)
127-
set(CMAKE_EXE_LINKER_FLAGS "${XC32_COMMON_FLAGS} ${LD_OPTIONS_FLAGS} -T")
128235

129236
# ELF to HEX conversion
130-
set(ELF2HEX -O ihex "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>.elf" "${OUT_DIR}/${HEX_FILE}")
237+
set (ELF2HEX -O ihex "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>$<TARGET_PROPERTY:${TARGET},SUFFIX>" "${OUT_DIR}/${HEX_FILE}")
131238

132239
# ELF to BIN conversion
133-
set(ELF2BIN -O binary "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>.elf" "${OUT_DIR}/${BIN_FILE}")
240+
set (ELF2BIN -O binary "${OUT_DIR}/$<TARGET_PROPERTY:${TARGET},OUTPUT_NAME>$<TARGET_PROPERTY:${TARGET},SUFFIX>" "${OUT_DIR}/${BIN_FILE}")
134241

135242
# Set CMake variables for toolchain initialization
243+
set(CMAKE_C_FLAGS_INIT "${CC_CPU}")
244+
set(CMAKE_CXX_FLAGS_INIT "${CXX_CPU}")
136245
set(CMAKE_SYSTEM_NAME Generic)
137246
set(CMAKE_CROSSCOMPILING TRUE)
138247
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
139-
set(CMAKE_ASM_COMPILER "${AS}")
248+
set(CMAKE_ASM_COMPILER "${CC}")
249+
set(CMAKE_AS_LEG_COMPILER "${AS}")
250+
set(CMAKE_AS_GNU_COMPILER "${CC}")
140251
set(CMAKE_C_COMPILER "${CC}")
141252
set(CMAKE_CXX_COMPILER "${CXX}")
142253
set(CMAKE_OBJCOPY "${OC}")
254+
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMakeASM")

tools/projmgr/templates/xc_linker_script.ld.src

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ SEARCH_DIR(.)
2828
#define __XC32_RESET_HANDLER_NAME Reset_Handler
2929
#endif /* __XC32_RESET_HANDLER_NAME */
3030

31+
_start = __XC32_RESET_HANDLER_NAME;
3132
ENTRY(__XC32_RESET_HANDLER_NAME)
3233

3334
/* ----------------------------------------------------------------------------
@@ -59,21 +60,23 @@ SECTIONS
5960
{
6061
. = ALIGN(4);
6162
_sfixed = .;
63+
__Vectors = .;
6264
KEEP(*(.vectors .vectors.* .vectors_default .vectors_default.*))
6365
KEEP(*(.isr_vector))
6466
KEEP(*(.reset*))
6567
KEEP(*(.after_vectors))
68+
. = ALIGN(4);
6669
} > VECTOR_REGION
6770

6871
.text :
6972
{
7073
. = ALIGN(4);
74+
*(.text .text.*)
7175
*(.glue_7t) *(.glue_7)
7276
*(.gnu.linkonce.r.*)
7377
*(.ARM.extab* .gnu.linkonce.armextab.*)
7478

75-
/* Support C constructors, and C destructors in both user code
76-
and the C library. This also provides support for C++ code. */
79+
7780
. = ALIGN(4);
7881
KEEP(*(.init))
7982
. = ALIGN(4);
@@ -108,33 +111,88 @@ SECTIONS
108111
KEEP (*crtend.o(.dtors))
109112

110113
. = ALIGN(4);
111-
_efixed = .; /* End of text section */
114+
_efixed = .;
112115
} > CODE_REGION
113116

114-
PROVIDE_HIDDEN (__exidx_start = .);
115117
.ARM.exidx :
116118
{
119+
PROVIDE_HIDDEN (__exidx_start = .);
117120
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
121+
PROVIDE_HIDDEN (__exidx_end = .);
118122
} > CODE_REGION
119-
PROVIDE_HIDDEN (__exidx_end = .);
120123

121-
. = ALIGN(4);
122-
_etext = .;
124+
.copy.table :
125+
{
126+
. = ALIGN(4);
127+
__copy_table_start__ = .;
128+
LONG (__data_load__)
129+
LONG (__data_start__)
130+
LONG (__data_end__ - __data_start__)
131+
__copy_table_end__ = .;
132+
} > CODE_REGION
133+
134+
.zero.table :
135+
{
136+
. = ALIGN(4);
137+
__zero_table_start__ = .;
138+
LONG (__bss_start__)
139+
LONG (__bss_end__ - __bss_start__)
140+
__zero_table_end__ = .;
141+
} > CODE_REGION
142+
143+
144+
__data_load__ = LOADADDR(.data);
145+
146+
.data :
147+
{
148+
. = ALIGN(4);
149+
__data_start__ = .;
150+
_sdata = .;
151+
*(.data .data.*)
152+
. = ALIGN(4);
153+
__data_end__ = .;
154+
_edata = .;
155+
} > DATA_REGION AT > CODE_REGION
123156

124157
.bss (NOLOAD) :
125158
{
126159
. = ALIGN(4);
127160
__bss_start__ = .;
161+
__bss_start = .;
128162
_sbss = . ;
129163
_szero = .;
164+
*(.bss .bss.*)
130165
*(COMMON)
131166
. = ALIGN(4);
132167
__bss_end__ = .;
168+
__bss_end = .;
133169
_ebss = . ;
134170
_ezero = .;
135171
} > DATA_REGION
136172

173+
.heap (NOLOAD) :
174+
{
175+
. = ALIGN(8);
176+
__end__ = .;
177+
PROVIDE(end = .);
178+
. = . + 0x400;
179+
__HeapLimit = .;
180+
} > DATA_REGION
181+
182+
.stack (NOLOAD) :
183+
{
184+
. = ALIGN(8);
185+
. = . + 0x800;
186+
} > DATA_REGION
187+
188+
__StackTop = ORIGIN(ram) + LENGTH(ram);
189+
__StackLimit = __StackTop - 0x1000;
190+
191+
__STACK_LIMIT = __StackLimit;
192+
PROVIDE(__stack = __StackTop);
193+
137194
. = ALIGN(4);
138195
_end = . ;
139196
_ram_end_ = ORIGIN(ram) + LENGTH(ram) -1 ;
140197
}
198+

0 commit comments

Comments
 (0)