From 8846674e542a1aa125c32afd5919f998caed9028 Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Mon, 1 May 2023 19:10:15 +0300 Subject: [PATCH 1/6] tools: Upgrade Clang toolchain to 'esp-16.0.0-20230516' --- CMakeLists.txt | 2 ++ components/efuse/esp32h2/esp_efuse_utility.c | 6 +++- tools/tools.json | 38 ++++++++++---------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5869c4c1e4..2839426aaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,6 +115,8 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang") list(APPEND compile_options "-Wno-c2x-extensions") # warning on xMPU_SETTINGS for esp32s2 has size 0 for C and 1 for C++ list(APPEND compile_options "-Wno-extern-c-compat") + # warning: implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1 + list(APPEND compile_options "-Wno-single-bit-bitfield-constant-conversion") endif() # More warnings may exist in unit tests and example projects. diff --git a/components/efuse/esp32h2/esp_efuse_utility.c b/components/efuse/esp32h2/esp_efuse_utility.c index f5357e6193..124e623390 100644 --- a/components/efuse/esp32h2/esp_efuse_utility.c +++ b/components/efuse/esp32h2/esp_efuse_utility.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -116,7 +116,9 @@ esp_err_t esp_efuse_utility_burn_chip(void) uint8_t block_rs[12]; efuse_hal_rs_calculate((void *)range_write_addr_blocks[num_block].start, block_rs); #pragma GCC diagnostic push +#if !__clang__ #pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif #pragma GCC diagnostic ignored "-Warray-bounds" memcpy((void *)EFUSE_PGM_CHECK_VALUE0_REG, block_rs, sizeof(block_rs)); #pragma GCC diagnostic pop @@ -162,7 +164,9 @@ esp_err_t esp_efuse_utility_burn_chip(void) if (!correct_written_data || coding_error_occurred) { ESP_LOGW(TAG, "BLOCK%d: next retry to fix an error [%d/3]...", num_block, repeat_burn_op); #pragma GCC diagnostic push +#if !__clang__ #pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif #pragma GCC diagnostic ignored "-Warray-bounds" memcpy((void *)EFUSE_PGM_DATA0_REG, (void *)backup_write_data, sizeof(backup_write_data)); #pragma GCC diagnostic pop diff --git a/tools/tools.json b/tools/tools.json index eed1c8e554..2983a4c093 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -401,36 +401,36 @@ "versions": [ { "linux-amd64": { - "sha256": "839e5adfa7f44982e8a2d828680f6e4aa435dcd3d1df765e02f015b04286056f", - "size": 209731340, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-linux-amd64.tar.xz" + "sha256": "3dbd8dd290913a93e8941da8a451ecd49f9798cc2d74bb9b63ef5cf5c4fee37f", + "size": 215176120, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-linux-amd64.tar.xz" }, "linux-arm64": { - "sha256": "614c44ab7305d65dde54a884c5614516777038027dc61bcc125d02171c248c53", - "size": 220076792, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-linux-arm64.tar.xz" + "sha256": "4b115af6ddd04a9bffc1908fc05837998ee71d450891d741c446186f2aa9b961", + "size": 222261932, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-linux-arm64.tar.xz" }, "linux-armhf": { - "sha256": "158076696e4fc608e6e2b54bf739223b78949e0492ad4aa5119632ebfbea0499", - "size": 209791724, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-linux-armhf.tar.xz" + "sha256": "935082bb0704420c5ca42b35038bba8702135348a50cac454ae2fb55af0b4c32", + "size": 214888520, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-linux-armhf.tar.xz" }, "macos": { - "sha256": "46f0f0368b5aa8d7e81558796c3acd67d943c9071b9619f2b487136c8e59c97c", - "size": 177703432, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-macos.tar.xz" + "sha256": "d9824acafd3e7b1d17ace084243b82a95bbdcb149a26b085bba487ab3d3716d7", + "size": 182440672, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-macos.tar.xz" }, "macos-arm64": { - "sha256": "dc5a99186f9f532a5076d6900828310e4673cf01e8071a3d041456e8aab2cc4a", - "size": 167630856, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-macos-arm64.tar.xz" + "sha256": "ed5621396dc3e48413e14e8b6caed8e2993e7f2ab5fca1410081f40c940a1060", + "size": 171912324, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-macos-arm64.tar.xz" }, - "name": "15.0.0-23786128ae", + "name": "16.0.1-fe4f10a809", "status": "recommended", "win64": { - "sha256": "87c9b2c2b8837535f102ae3fd5789defecbffa80b317f86055f3e9d6292aaa05", - "size": 241235020, - "url": "https://github.com/espressif/llvm-project/releases/download/esp-15.0.0-20221201/llvm-esp-15.0.0-20221201-win64.tar.xz" + "sha256": "598c8241c8bf10fd1be8bd21845307cfc404e127041b4ba4e828350a88692883", + "size": 243979484, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-16.0.0-20230516/llvm-esp-16.0.0-20230516-win64.tar.xz" } } ] From e9345bcced94dd69ad57fbdbb252066c67906fff Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Wed, 23 Nov 2022 15:00:11 +0300 Subject: [PATCH 2/6] build: Adds support for Clangs's toolchain compiler-rt --- CMakeLists.txt | 5 +++ Kconfig | 33 +++++++++++++++++++ .../subproject/main/ld/esp32/bootloader.ld | 2 ++ .../subproject/main/ld/esp32c2/bootloader.ld | 2 ++ .../subproject/main/ld/esp32c3/bootloader.ld | 2 ++ .../subproject/main/ld/esp32c6/bootloader.ld | 2 ++ .../subproject/main/ld/esp32h2/bootloader.ld | 2 ++ .../subproject/main/ld/esp32s2/bootloader.ld | 2 ++ .../subproject/main/ld/esp32s3/bootloader.ld | 2 ++ components/cxx/CMakeLists.txt | 4 +-- components/newlib/CMakeLists.txt | 2 +- components/newlib/system_libs.lf | 9 +++++ tools/ci/check_ldgen_mapping_exceptions.txt | 1 + tools/cmake/build.cmake | 2 ++ tools/cmake/kconfig.cmake | 4 +++ tools/kconfig_new/config.env.in | 1 + .../sdkconfig.ci.clang_libclang_rt | 1 + .../sdkconfig.ci.clang_libgcc | 1 + 18 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libclang_rt create mode 100644 tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libgcc diff --git a/CMakeLists.txt b/CMakeLists.txt index 2839426aaa..25fb2e4176 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,6 +224,11 @@ endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") list(APPEND compile_options "-fno-use-cxa-atexit") + if(CONFIG_COMPILER_RT_LIB_GCCLIB) + list(APPEND link_options "-rtlib=libgcc") + elseif(CONFIG_COMPILER_RT_LIB_CLANGRT) + list(APPEND link_options "-rtlib=compiler-rt") + endif() endif() # For the transition period from 32-bit time_t to 64-bit time_t, diff --git a/Kconfig b/Kconfig index 8cf51af062..bb58b7db36 100644 --- a/Kconfig +++ b/Kconfig @@ -19,6 +19,18 @@ mainmenu "Espressif IoT Development Framework Configuration" bool default y if "$(IDF_CI_BUILD)" = "y" || "$(IDF_CI_BUILD)" = 1 + config IDF_TOOLCHAIN + # This option records the IDF target when sdkconfig is generated the first time. + # It is not updated if environment variable $IDF_TOOLCHAIN changes later, and + # the build system is responsible for detecting the mismatch between + # CONFIG_IDF_TOOLCHAIN and $IDF_TOOLCHAIN. + string + default "$IDF_TOOLCHAIN" + + config IDF_TOOLCHAIN_CLANG + bool + default "y" if IDF_TOOLCHAIN="clang" + config IDF_TARGET_ARCH_RISCV bool default "n" @@ -493,6 +505,27 @@ mainmenu "Espressif IoT Development Framework Configuration" If enabled, RTL files will be produced during compilation. These files can be used by other tools, for example to calculate call graphs. + choice COMPILER_RT_LIB + prompt "Compiler runtime library" + default COMPILER_RT_LIB_CLANGRT if IDF_TOOLCHAIN_CLANG + default COMPILER_RT_LIB_GCCLIB + help + Select runtime library to be used by compiler. + - GCC toolchain supports libgcc only. + - Clang allows to choose between libgcc or libclang_rt. + + config COMPILER_RT_LIB_GCCLIB + bool "libgcc" + config COMPILER_RT_LIB_CLANGRT + depends on IDF_TOOLCHAIN_CLANG + bool "libclang_rt" + endchoice + + config COMPILER_RT_LIB_NAME + string + default "clang_rt.builtins" if COMPILER_RT_LIB_CLANGRT + default "gcc" if COMPILER_RT_LIB_GCCLIB + endmenu # Compiler Options menu "Component config" diff --git a/components/bootloader/subproject/main/ld/esp32/bootloader.ld b/components/bootloader/subproject/main/ld/esp32/bootloader.ld index 380ecc1163..5814b3e3cb 100644 --- a/components/bootloader/subproject/main/ld/esp32/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32/bootloader.ld @@ -42,7 +42,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32c2/bootloader.ld b/components/bootloader/subproject/main/ld/esp32c2/bootloader.ld index 84e73b844b..a7cd540696 100644 --- a/components/bootloader/subproject/main/ld/esp32c2/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32c2/bootloader.ld @@ -63,7 +63,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld b/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld index 712ef254db..a444e680a7 100644 --- a/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld @@ -63,7 +63,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32c6/bootloader.ld b/components/bootloader/subproject/main/ld/esp32c6/bootloader.ld index d15b5f4803..9dd672ab95 100644 --- a/components/bootloader/subproject/main/ld/esp32c6/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32c6/bootloader.ld @@ -60,7 +60,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32h2/bootloader.ld b/components/bootloader/subproject/main/ld/esp32h2/bootloader.ld index bb9ba7967d..c8aff3f55b 100644 --- a/components/bootloader/subproject/main/ld/esp32h2/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32h2/bootloader.ld @@ -61,7 +61,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32s2/bootloader.ld b/components/bootloader/subproject/main/ld/esp32s2/bootloader.ld index 5f0c65b3a6..188096f529 100644 --- a/components/bootloader/subproject/main/ld/esp32s2/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32s2/bootloader.ld @@ -29,7 +29,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld b/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld index ecca26afc7..ceea917321 100644 --- a/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +++ b/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld @@ -64,7 +64,9 @@ SECTIONS *(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) *(.iram1 .iram1.*) /* catch stray IRAM_ATTR */ *liblog.a:(.literal .text .literal.* .text.*) + /* we use either libgcc or compiler-rt, so put similar entries for them here */ *libgcc.a:(.literal .text .literal.* .text.*) + *libclang_rt.builtins.a:(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_clock_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_common_loader.*(.literal .text .literal.* .text.*) *libbootloader_support.a:bootloader_flash.*(.literal .text .literal.* .text.*) diff --git a/components/cxx/CMakeLists.txt b/components/cxx/CMakeLists.txt index 5b277689ae..6841da161a 100644 --- a/components/cxx/CMakeLists.txt +++ b/components/cxx/CMakeLists.txt @@ -43,7 +43,7 @@ endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") # libstdc++ depends on C library, so it should appear later in link order. # Otherwise we get undefined references for esp-clang toolchain. - target_link_libraries(${COMPONENT_LIB} PUBLIC stdc++ c gcc) + target_link_libraries(${COMPONENT_LIB} PUBLIC stdc++ c ${CONFIG_COMPILER_RT_LIB_NAME}) else() target_link_libraries(${COMPONENT_LIB} PUBLIC stdc++ gcc) endif() @@ -63,7 +63,7 @@ else() endif() target_link_libraries(${COMPONENT_LIB} PUBLIC stdcpp_pthread) add_library(libgcc_cxx INTERFACE) -target_link_libraries(libgcc_cxx INTERFACE gcc $) +target_link_libraries(libgcc_cxx INTERFACE ${CONFIG_COMPILER_RT_LIB_NAME} $) target_link_libraries(${COMPONENT_LIB} PUBLIC libgcc_cxx) if(NOT CONFIG_COMPILER_CXX_EXCEPTIONS) diff --git a/components/newlib/CMakeLists.txt b/components/newlib/CMakeLists.txt index 0cbce719ef..9e1cd22582 100644 --- a/components/newlib/CMakeLists.txt +++ b/components/newlib/CMakeLists.txt @@ -36,7 +36,7 @@ idf_component_register(SRCS "${srcs}" # Toolchain libraries require code defined in this component idf_component_get_property(newlib newlib COMPONENT_LIB) -target_link_libraries(${COMPONENT_LIB} INTERFACE c m gcc "$") +target_link_libraries(${COMPONENT_LIB} INTERFACE c m ${CONFIG_COMPILER_RT_LIB_NAME} "$") set_source_files_properties(heap.c PROPERTIES COMPILE_FLAGS -fno-builtin) diff --git a/components/newlib/system_libs.lf b/components/newlib/system_libs.lf index 7480a12697..9c22bbfd47 100644 --- a/components/newlib/system_libs.lf +++ b/components/newlib/system_libs.lf @@ -7,6 +7,15 @@ entries: if IDF_TARGET_ARCH_RISCV: save-restore (noflash) +[mapping:clang_rt_builtins] +archive: libclang_rt.builtins.a +entries: + if IDF_TARGET_ESP32 = n: + _divsf3 (noflash) + if IDF_TARGET_ARCH_RISCV: + save (noflash) + restore (noflash) + [mapping:gcov] archive: libgcov.a entries: diff --git a/tools/ci/check_ldgen_mapping_exceptions.txt b/tools/ci/check_ldgen_mapping_exceptions.txt index eebfb1cd7c..950ce1c87e 100644 --- a/tools/ci/check_ldgen_mapping_exceptions.txt +++ b/tools/ci/check_ldgen_mapping_exceptions.txt @@ -1,3 +1,4 @@ libc sha256_coredump gcc +clang_rt_builtins diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index 13bbff0726..58b9d2fa1a 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -468,6 +468,8 @@ macro(idf_build_process target) idf_build_set_property(BOOTLOADER_BUILD "${BOOTLOADER_BUILD}") + idf_build_set_property(IDF_TOOLCHAIN "${IDF_TOOLCHAIN}") + # Check build target is specified. Since this target corresponds to a component # name, the target component is automatically added to the list of common component # requirements. diff --git a/tools/cmake/kconfig.cmake b/tools/cmake/kconfig.cmake index f10ea80fae..aa8c4dcfac 100644 --- a/tools/cmake/kconfig.cmake +++ b/tools/cmake/kconfig.cmake @@ -94,6 +94,7 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults) idf_build_set_property(KCONFIG_PROJBUILDS "${kconfig_projbuilds}") idf_build_get_property(idf_target IDF_TARGET) + idf_build_get_property(idf_toolchain IDF_TOOLCHAIN) idf_build_get_property(idf_path IDF_PATH) idf_build_get_property(idf_env_fpga __IDF_ENV_FPGA) @@ -209,6 +210,7 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults) COMMAND ${prepare_kconfig_files_command} COMMAND ${kconfgen_basecommand} --env "IDF_TARGET=${idf_target}" + --env "IDF_TOOLCHAIN=${idf_toolchain}" --env "IDF_ENV_FPGA=${idf_env_fpga}" --dont-write-deprecated --output config ${sdkconfig} @@ -218,6 +220,7 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults) "COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE=${kconfigs_projbuild_path}" "KCONFIG_CONFIG=${sdkconfig}" "IDF_TARGET=${idf_target}" + "IDF_TOOLCHAIN=${idf_toolchain}" "IDF_ENV_FPGA=${idf_env_fpga}" ${MENUCONFIG_CMD} ${root_kconfig} USES_TERMINAL @@ -225,6 +228,7 @@ function(__kconfig_generate_config sdkconfig sdkconfig_defaults) # compatibility) COMMAND ${kconfgen_basecommand} --env "IDF_TARGET=${idf_target}" + --env "IDF_TOOLCHAIN=${idf_toolchain}" --env "IDF_ENV_FPGA=${idf_env_fpga}" --output config ${sdkconfig} ) diff --git a/tools/kconfig_new/config.env.in b/tools/kconfig_new/config.env.in index 169caaf60a..a79768f3a2 100644 --- a/tools/kconfig_new/config.env.in +++ b/tools/kconfig_new/config.env.in @@ -3,6 +3,7 @@ "COMPONENT_KCONFIGS_PROJBUILD": "${kconfig_projbuilds}", "COMPONENT_SDKCONFIG_RENAMES": "${sdkconfig_renames}", "IDF_TARGET": "${idf_target}", + "IDF_TOOLCHAIN": "${idf_toolchain}", "IDF_ENV_FPGA": "${idf_env_fpga}", "IDF_PATH": "${idf_path}", "COMPONENT_KCONFIGS_SOURCE_FILE": "${kconfigs_path}", diff --git a/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libclang_rt b/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libclang_rt new file mode 100644 index 0000000000..625233c75d --- /dev/null +++ b/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libclang_rt @@ -0,0 +1 @@ +CONFIG_COMPILER_RT_LIB_CLANGRT=y diff --git a/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libgcc b/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libgcc new file mode 100644 index 0000000000..09f10716f8 --- /dev/null +++ b/tools/test_apps/system/cxx_pthread_bluetooth/sdkconfig.ci.clang_libgcc @@ -0,0 +1 @@ +CONFIG_COMPILER_RT_LIB_GCCLIB=y From 82c1d6e3711e96a8ff1ae002d588f623528fccf0 Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Wed, 22 Feb 2023 23:19:55 +0300 Subject: [PATCH 3/6] gcov: Do not link with libgcov when Clang is used --- components/app_trace/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/app_trace/CMakeLists.txt b/components/app_trace/CMakeLists.txt index 0968a31a82..2757ca224e 100644 --- a/components/app_trace/CMakeLists.txt +++ b/components/app_trace/CMakeLists.txt @@ -66,6 +66,12 @@ idf_component_register(SRCS "${srcs}" idf_component_get_property(app_trace app_trace COMPONENT_LIB) if(CONFIG_APPTRACE_GCOV_ENABLE) + if(CMAKE_C_COMPILER_ID MATCHES "Clang") + # Coverage info is not supported when clang is used + # TODO: LLVM-214 + message(FATAL_ERROR "Coverage info is not supported when building with Clang!") + endif() + # The original Gcov library from toolchain will be objcopy with symbols redefinitions (see file gcov/io_sym.map). # This needs because ESP has no file-system onboard, and redefined functions solves this problem and transmits # output file to host PC. From dd5880cca61a8ad4ee3d9850ef9a8880a3028c5f Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Wed, 22 Feb 2023 23:30:09 +0300 Subject: [PATCH 4/6] build: Add Clang toolchain file for ESP32-H4 --- tools/cmake/toolchain-clang-esp32h4.cmake | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tools/cmake/toolchain-clang-esp32h4.cmake diff --git a/tools/cmake/toolchain-clang-esp32h4.cmake b/tools/cmake/toolchain-clang-esp32h4.cmake new file mode 100644 index 0000000000..420c99a3a3 --- /dev/null +++ b/tools/cmake/toolchain-clang-esp32h4.cmake @@ -0,0 +1,32 @@ +include($ENV{IDF_PATH}/tools/cmake/utilities.cmake) + +set(CMAKE_SYSTEM_NAME Generic) + +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_ASM_COMPILER clang) + +set(CMAKE_AR llvm-ar) +set(CMAKE_RANLIB llvm-ranlib) +set(CMAKE_OBJDUMP riscv32-esp-elf-objdump) + +remove_duplicated_flags("--target=riscv32-esp-elf -march=rv32imc -mabi=ilp32 \ + ${CMAKE_C_FLAGS}" + UNIQ_CMAKE_C_FLAGS) +set(CMAKE_C_FLAGS "${UNIQ_CMAKE_C_FLAGS}" + CACHE STRING "C Compiler Base Flags" + FORCE) + +remove_duplicated_flags("--target=riscv32-esp-elf -march=rv32imc -mabi=ilp32 \ + ${CMAKE_CXX_FLAGS}" + UNIQ_CMAKE_CXX_FLAGS) +set(CMAKE_CXX_FLAGS "${UNIQ_CMAKE_CXX_FLAGS}" + CACHE STRING "C++ Compiler Base Flags" + FORCE) + +remove_duplicated_flags("--target=riscv32-esp-elf -march=rv32imc -mabi=ilp32 \ + ${CMAKE_ASM_FLAGS}" + UNIQ_CMAKE_ASM_FLAGS) +set(CMAKE_ASM_FLAGS "${UNIQ_CMAKE_ASM_FLAGS}" + CACHE STRING "Assembler Base Flags" + FORCE) From 532182a5579bc19bdfa123207062d82d8d6ca899 Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Tue, 28 Feb 2023 17:15:24 +0300 Subject: [PATCH 5/6] ci: Allows to use custom clang distro specified by 'CI_CLANG_DISTRO_URL' var --- .gitlab-ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d44f2fee4b..8d9542888e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -176,6 +176,15 @@ cache: source ./export.sh + # Custom clang + if [[ ! -z "$CI_CLANG_DISTRO_URL" ]]; then + echo "Using custom clang from ${CI_CLANG_DISTRO_URL}" + wget $CI_CLANG_DISTRO_URL + ARCH_NAME=$(basename $CI_CLANG_DISTRO_URL) + tar -x -f $ARCH_NAME + export PATH=$PWD/esp-clang/bin:$PATH + fi + # Custom OpenOCD if [[ ! -z "$OOCD_DISTRO_URL" && "$CI_JOB_STAGE" == "target_test" ]]; then echo "Using custom OpenOCD from ${OOCD_DISTRO_URL}" From c9b7748789c0896c2cdc4471282a0b176be210cf Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Wed, 31 May 2023 22:12:50 +0300 Subject: [PATCH 6/6] efuse: Use 'hal_memcpy' instead of 'memcpy' in ESP32-H2 driver --- components/efuse/esp32h2/esp_efuse_utility.c | 24 +++----------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/components/efuse/esp32h2/esp_efuse_utility.c b/components/efuse/esp32h2/esp_efuse_utility.c index 124e623390..b0f9783f68 100644 --- a/components/efuse/esp32h2/esp_efuse_utility.c +++ b/components/efuse/esp32h2/esp_efuse_utility.c @@ -115,26 +115,14 @@ esp_err_t esp_efuse_utility_burn_chip(void) if (esp_efuse_get_coding_scheme(num_block) == EFUSE_CODING_SCHEME_RS) { uint8_t block_rs[12]; efuse_hal_rs_calculate((void *)range_write_addr_blocks[num_block].start, block_rs); -#pragma GCC diagnostic push -#if !__clang__ -#pragma GCC diagnostic ignored "-Wstringop-overflow" -#endif -#pragma GCC diagnostic ignored "-Warray-bounds" - memcpy((void *)EFUSE_PGM_CHECK_VALUE0_REG, block_rs, sizeof(block_rs)); -#pragma GCC diagnostic pop + hal_memcpy((void *)EFUSE_PGM_CHECK_VALUE0_REG, block_rs, sizeof(block_rs)); } unsigned r_data_len = (range_read_addr_blocks[num_block].end - range_read_addr_blocks[num_block].start) + sizeof(uint32_t); unsigned data_len = (range_write_addr_blocks[num_block].end - range_write_addr_blocks[num_block].start) + sizeof(uint32_t); memcpy((void *)EFUSE_PGM_DATA0_REG, (void *)range_write_addr_blocks[num_block].start, data_len); uint32_t backup_write_data[8 + 3]; // 8 words are data and 3 words are RS coding data -#pragma GCC diagnostic push -#if __GNUC__ >= 11 -#pragma GCC diagnostic ignored "-Wstringop-overread" -#endif -#pragma GCC diagnostic ignored "-Warray-bounds" - memcpy(backup_write_data, (void *)EFUSE_PGM_DATA0_REG, sizeof(backup_write_data)); -#pragma GCC diagnostic pop + hal_memcpy(backup_write_data, (void *)EFUSE_PGM_DATA0_REG, sizeof(backup_write_data)); int repeat_burn_op = 1; bool correct_written_data; bool coding_error_before = efuse_hal_is_coding_error_in_block(num_block); @@ -163,13 +151,7 @@ esp_err_t esp_efuse_utility_burn_chip(void) correct_written_data = esp_efuse_utility_is_correct_written_data(num_block, r_data_len); if (!correct_written_data || coding_error_occurred) { ESP_LOGW(TAG, "BLOCK%d: next retry to fix an error [%d/3]...", num_block, repeat_burn_op); -#pragma GCC diagnostic push -#if !__clang__ -#pragma GCC diagnostic ignored "-Wstringop-overflow" -#endif -#pragma GCC diagnostic ignored "-Warray-bounds" - memcpy((void *)EFUSE_PGM_DATA0_REG, (void *)backup_write_data, sizeof(backup_write_data)); -#pragma GCC diagnostic pop + hal_memcpy((void *)EFUSE_PGM_DATA0_REG, (void *)backup_write_data, sizeof(backup_write_data)); } } while ((!correct_written_data || coding_error_occurred) && repeat_burn_op++ < 3);