# The following lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

set(COMPONENTS main espcoredump esp_gdbstub)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)

project(test_panic)

if(CONFIG_TEST_MEMPROT)
    # TODO: IDF-6821 - Refactor this to make it easy to add any new targets
    if(CONFIG_SOC_MEMPROT_SUPPORTED)
        target_link_libraries(${project_elf} PRIVATE "-Wl,--wrap=esp_panic_handler")
        if(CONFIG_IDF_TARGET_ESP32C3)
            target_link_libraries(${project_elf} PRIVATE "-Wl,--wrap=panic_arch_fill_info")
        endif()
    endif()
endif()

if(NOT CONFIG_TEST_MEMPROT AND NOT CONFIG_ESP_COREDUMP_CAPTURE_DRAM)
    # Enable UBSAN checks
    #
    # shift-base sanitizer is disabled due to the following pattern found in register header files:
    #   #define SOME_FIELD  0xFFFF
    #   #define SOME_FIELD_M  ((SOME_FIELD_V)<<(SOME_FIELD_S))
    #   #define SOME_FIELD_V  0xFFFF
    #   #define SOME_FIELD_S  16
    # here SOME_FIELD_V doesn't have an unsigned (U) prefix, so the compiler flags
    # SOME_FIELD_M expansion (0xFFFF << 16) as generating integer overflow.
    #
    set(ubsan_options "-fsanitize=undefined" "-fno-sanitize=shift-base")

    # Only enable UBSAN for a few components related to the panic test,
    # due to RAM size limitations.
    set(ubsan_components main espcoredump esp_system spi_flash
        esp_common esp_hw_support soc hal freertos)
    if(CONFIG_ESP_COREDUMP_CHECKSUM_SHA256)
        if(CONFIG_IDF_TARGET_ESP32S2)
            # due to the ram limitation, coredump and freertos are removed from esp32s2 built
            list(REMOVE_ITEM ubsan_components espcoredump freertos)
        endif()
    endif()
    foreach(component  IN LISTS ubsan_components)
        idf_component_get_property(lib ${component} COMPONENT_LIB)
        target_compile_options(${lib} PRIVATE ${ubsan_options})
    endforeach()

    target_link_libraries(${project_elf} PRIVATE "-Wl,--wrap=esp_panic_handler")
endif()
