mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
feat(compiler): add ESP-IDF LLVM optimization enablement framework
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
committed by
Chen Qian
co-authored by
Cursor
parent
a3a7642b6a
commit
25046e7959
@@ -0,0 +1,93 @@
|
||||
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
# Never compiles: only inspects COMPILE_OPTIONS. Host CI (Windows minimal
|
||||
# cmake jobs) has no C compiler on PATH, so skip compiler detection.
|
||||
set(CMAKE_C_COMPILER "${CMAKE_COMMAND}" CACHE FILEPATH "" FORCE)
|
||||
set(CMAKE_C_COMPILER_WORKS TRUE CACHE BOOL "" FORCE)
|
||||
set(CMAKE_C_COMPILER_FORCED TRUE)
|
||||
project(llvm_optimizations_test C)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../../llvm_optimizations.cmake)
|
||||
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/component.c "void component(void) {}\n")
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/selected.c "void selected(void) {}\n")
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/plain.c "void plain(void) {}\n")
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gcc.c "void gcc_source(void) {}\n")
|
||||
|
||||
set(CMAKE_C_COMPILER_ID Clang)
|
||||
set(CONFIG_IDF_TOOLCHAIN_CLANG ON)
|
||||
set(CONFIG_COMPILER_LLVM_MEMCPY_OPTIMIZATION ON)
|
||||
|
||||
add_library(component STATIC ${CMAKE_CURRENT_BINARY_DIR}/component.c)
|
||||
set(COMPONENT_LIB component)
|
||||
idf_component_enable_llvm_opt()
|
||||
get_target_property(component_options component COMPILE_OPTIONS)
|
||||
list(JOIN component_options " " component_options)
|
||||
if(NOT component_options MATCHES "riscv-esp32-p4-mem-intrin")
|
||||
message(FATAL_ERROR "Component scope is missing the selected LLVM optimization")
|
||||
endif()
|
||||
if(NOT component_options MATCHES "SHELL:")
|
||||
message(FATAL_ERROR "Component scope must SHELL-wrap -Xclang pairs")
|
||||
endif()
|
||||
if(component_options MATCHES "xespv2p1")
|
||||
message(FATAL_ERROR "PIE revision must come from -mcpu, not +xespv2p1")
|
||||
endif()
|
||||
if(NOT component_options MATCHES "espv-lowering")
|
||||
message(FATAL_ERROR "Component scope is missing +espv-lowering for .m intrinsic isel")
|
||||
endif()
|
||||
|
||||
if(NOT IDF_LLVM_OPT_ALL OR NOT IDF_LLVM_OPT_MEMCPY)
|
||||
message(FATAL_ERROR "Exported IDF_LLVM_OPT_ALL / IDF_LLVM_OPT_MEMCPY must be set when memcpy is enabled")
|
||||
endif()
|
||||
if(NOT "${IDF_LLVM_OPT_ALL}" STREQUAL "${IDF_LLVM_OPT_MEMCPY}")
|
||||
message(FATAL_ERROR "With only the memcpy optimization enabled, IDF_LLVM_OPT_ALL must equal IDF_LLVM_OPT_MEMCPY")
|
||||
endif()
|
||||
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/third_party.c "void third_party(void) {}\n")
|
||||
add_library(fake_lvgl STATIC ${CMAKE_CURRENT_BINARY_DIR}/third_party.c)
|
||||
target_compile_options(fake_lvgl PRIVATE ${IDF_LLVM_OPT_ALL})
|
||||
get_target_property(third_party_options fake_lvgl COMPILE_OPTIONS)
|
||||
list(JOIN third_party_options " " third_party_options)
|
||||
if(NOT third_party_options MATCHES "riscv-esp32-p4-mem-intrin")
|
||||
message(FATAL_ERROR "Standard CMake apply of IDF_LLVM_OPT_ALL missed the memcpy flags")
|
||||
endif()
|
||||
if(NOT third_party_options MATCHES "SHELL:")
|
||||
message(FATAL_ERROR "IDF_LLVM_OPT_ALL must be SHELL-wrapped for target_compile_options")
|
||||
endif()
|
||||
|
||||
add_library(selected STATIC
|
||||
${CMAKE_CURRENT_BINARY_DIR}/selected.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/plain.c)
|
||||
set(COMPONENT_LIB selected)
|
||||
idf_component_enable_llvm_opt(
|
||||
SRCS ${CMAKE_CURRENT_BINARY_DIR}/selected.c
|
||||
OPTIONS "-custom-llvm-option")
|
||||
get_source_file_property(selected_options ${CMAKE_CURRENT_BINARY_DIR}/selected.c COMPILE_OPTIONS)
|
||||
get_source_file_property(plain_options ${CMAKE_CURRENT_BINARY_DIR}/plain.c COMPILE_OPTIONS)
|
||||
list(JOIN selected_options " " selected_options)
|
||||
if(NOT selected_options MATCHES "riscv-esp32-p4-mem-intrin"
|
||||
OR NOT selected_options MATCHES "custom-llvm-option")
|
||||
message(FATAL_ERROR "Source scope is missing selected or custom options")
|
||||
endif()
|
||||
if(selected_options MATCHES "SHELL:")
|
||||
message(FATAL_ERROR "Source COMPILE_OPTIONS must not use SHELL:")
|
||||
endif()
|
||||
if(plain_options)
|
||||
message(FATAL_ERROR "LLVM optimization leaked to an unselected source")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_COMPILER_ID GNU)
|
||||
unset(CONFIG_IDF_TOOLCHAIN_CLANG)
|
||||
add_library(gcc_component STATIC ${CMAKE_CURRENT_BINARY_DIR}/gcc.c)
|
||||
set(COMPONENT_LIB gcc_component)
|
||||
idf_component_enable_llvm_opt(OPTIONS "-custom-llvm-option")
|
||||
get_target_property(gcc_options gcc_component COMPILE_OPTIONS)
|
||||
if(gcc_options)
|
||||
message(FATAL_ERROR "LLVM optimization options must be ignored for non-Clang compilers")
|
||||
endif()
|
||||
if(IDF_LLVM_OPT_ALL OR IDF_LLVM_OPT_MEMCPY)
|
||||
message(FATAL_ERROR "Exported LLVM opt flags must be empty for non-Clang compilers")
|
||||
endif()
|
||||
Reference in New Issue
Block a user