Merge branch 'fix/newlib_kconfig_variables' into 'master'

change(newlib): change CONFIG_NEWLIB* prefix to CONFIG_LIBC_NEWLIB*

See merge request espressif/esp-idf!41153
This commit is contained in:
Alexey Lapshin
2025-08-12 09:54:45 +04:00
11 changed files with 162 additions and 13 deletions

View File

@@ -230,7 +230,7 @@ mainmenu "Espressif IoT Development Framework Configuration"
CONFIG_APP_BUILD_TYPE_RAM=y CONFIG_APP_BUILD_TYPE_RAM=y
CONFIG_VFS_SUPPORT_TERMIOS= CONFIG_VFS_SUPPORT_TERMIOS=
CONFIG_NEWLIB_NANO_FORMAT=y CONFIG_LIBC_NEWLIB_NANO_FORMAT=y
CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y
CONFIG_ESP_DEBUG_STUBS_ENABLE= CONFIG_ESP_DEBUG_STUBS_ENABLE=
CONFIG_ESP_ERR_TO_NAME_LOOKUP= CONFIG_ESP_ERR_TO_NAME_LOOKUP=

View File

@@ -344,7 +344,7 @@ else() # Regular app build
endif() endif()
endif() endif()
if(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT AND CONFIG_LIBC_NEWLIB AND CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT AND CONFIG_LIBC_NEWLIB AND CONFIG_LIBC_NEWLIB_NANO_FORMAT)
if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME AND NOT CONFIG_ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG) if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME AND NOT CONFIG_ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG)
# Newlib-nano functions contains time_t related functions # Newlib-nano functions contains time_t related functions
# and cannot be used if they were compiled with 32 bit time_t # and cannot be used if they were compiled with 32 bit time_t
@@ -352,7 +352,7 @@ else() # Regular app build
endif() endif()
endif() endif()
if(CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT AND CONFIG_LIBC_NEWLIB AND NOT CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT AND CONFIG_LIBC_NEWLIB AND NOT CONFIG_LIBC_NEWLIB_NANO_FORMAT)
rom_linker_script("newlib-normal") rom_linker_script("newlib-normal")
endif() endif()
endif() endif()

View File

@@ -33,10 +33,13 @@
/* void longjmp (jmp_buf env, int val) */ /* void longjmp (jmp_buf env, int val) */
.align 4
.literal_position .literal_position
#if CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM
.section .iram1,"ax"
#endif
.global __wrap_longjmp .global __wrap_longjmp
.type __wrap_longjmp, @function .type __wrap_longjmp, @function
.align 4
__wrap_longjmp: __wrap_longjmp:
entry sp, 16 entry sp, 16
@@ -63,7 +66,7 @@ __wrap_longjmp:
/* /*
If not on S3, replacement of only the first instructions, If not on S3, replacement of only the first instructions,
then jump back to original longjmp implementation. then jump back to original longjmp implementation.
The jump target is the instrucion The jump target is the instruction
l32i a0, a2, 64 l32i a0, a2, 64
of the original code. Hence, the original code's entry instruction and windowstart modification are left of the original code. Hence, the original code's entry instruction and windowstart modification are left
out. out.

View File

@@ -74,6 +74,7 @@ list(APPEND ldfragments "src/newlib.lf" "src/system_libs.lf")
if(CONFIG_LIBC_NEWLIB) if(CONFIG_LIBC_NEWLIB)
list(APPEND ldfragments src/libc.lf) list(APPEND ldfragments src/libc.lf)
list(APPEND ldfragments src/libm.lf)
else() else()
list(APPEND ldfragments src/picolibc/libc.lf) list(APPEND ldfragments src/picolibc/libc.lf)
endif() endif()
@@ -107,7 +108,7 @@ list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_init_funcs")
list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_init_funcs") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_init_funcs")
target_link_libraries(${COMPONENT_LIB} INTERFACE "${EXTRA_LINK_FLAGS}") target_link_libraries(${COMPONENT_LIB} INTERFACE "${EXTRA_LINK_FLAGS}")
if(CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_LIBC_NEWLIB_NANO_FORMAT)
if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(libc_dir_cmd ${CMAKE_C_COMPILER}) set(libc_dir_cmd ${CMAKE_C_COMPILER})
string(REPLACE " " ";" cflags_list ${CMAKE_C_FLAGS}) string(REPLACE " " ";" cflags_list ${CMAKE_C_FLAGS})

View File

@@ -6,7 +6,7 @@
[mapping:libc] [mapping:libc]
archive: archive:
if NEWLIB_NANO_FORMAT = y: if LIBC_NEWLIB_NANO_FORMAT = y:
libc_nano.a libc_nano.a
else: else:
libc.a libc.a
@@ -35,8 +35,8 @@ entries:
libc_a-labs (noflash) libc_a-labs (noflash)
libc_a-ldiv (noflash) libc_a-ldiv (noflash)
libc_a-quorem (noflash) libc_a-quorem (noflash)
libc_a-s_fpclassify (noflash) libm_a-s_fpclassify (noflash)
libc_a-sf_nan (noflash) libm_a-sf_nan (noflash)
if SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM = y: if SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM = y:
libc_a-utoa (noflash) libc_a-utoa (noflash)
@@ -47,6 +47,7 @@ entries:
if SPIRAM_CACHE_LIBIO_IN_IRAM = y: if SPIRAM_CACHE_LIBIO_IN_IRAM = y:
libc_a-wcrtomb (noflash) libc_a-wcrtomb (noflash)
libc_a-fwrite (noflash)
libc_a-fvwrite (noflash) libc_a-fvwrite (noflash)
libc_a-wbuf (noflash) libc_a-wbuf (noflash)
libc_a-wsetup (noflash) libc_a-wsetup (noflash)
@@ -144,9 +145,9 @@ entries:
libc_a-getenv_r (noflash) libc_a-getenv_r (noflash)
if SPIRAM_CACHE_LIBFILE_IN_IRAM = y: if SPIRAM_CACHE_LIBFILE_IN_IRAM = y:
lock (noflash) libc_a-lock (noflash)
isatty (noflash) libc_a-isatty (noflash)
creat (noflash) libc_a-creat (noflash)
libc_a-fclose (noflash) libc_a-fclose (noflash)
libc_a-open (noflash) libc_a-open (noflash)
libc_a-close (noflash) libc_a-close (noflash)

View File

@@ -0,0 +1,10 @@
[mapping:libm]
archive:
if LIBC_NEWLIB_NANO_FORMAT = y:
libm_nano.a
else:
libm.a
entries:
if SPIRAM_CACHE_LIBMATH_IN_IRAM = y:
libm_a-s_fpclassify (noflash)
libm_a-sf_nan (noflash)

View File

@@ -11,6 +11,7 @@
#include <errno.h> #include <errno.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "esp_attr.h"
#if CONFIG_IDF_TOOLCHAIN_GCC #if CONFIG_IDF_TOOLCHAIN_GCC
#include <sys/statvfs.h> #include <sys/statvfs.h>
@@ -121,11 +122,17 @@ int fstat(int fd, struct stat *st)
return _fstat_r(__getreent(), fd, st); return _fstat_r(__getreent(), fd, st);
} }
#if CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM
IRAM_ATTR
#endif
int raise(int sig) int raise(int sig)
{ {
return _raise_r(__getreent(), sig); return _raise_r(__getreent(), sig);
} }
#if CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM
IRAM_ATTR
#endif
int system(const char* str) int system(const char* str)
{ {
return _system_r(__getreent(), str); return _system_r(__getreent(), str);

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Unlicense OR CC0-1.0 * SPDX-License-Identifier: Unlicense OR CC0-1.0
*/ */
@@ -12,6 +12,9 @@
#include <time.h> #include <time.h>
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
#include <wchar.h>
#include <unistd.h>
#include <fcntl.h>
#include "unity.h" #include "unity.h"
#include "sdkconfig.h" #include "sdkconfig.h"
#include "soc/soc.h" #include "soc/soc.h"
@@ -194,6 +197,112 @@ TEST_CASE("test 64bit int formats", "[newlib]")
TEST_ASSERT_EQUAL(val, sval); TEST_ASSERT_EQUAL(val, sval);
} }
#else // CONFIG_NEWLIB_NANO_FORMAT #else // CONFIG_NEWLIB_NANO_FORMAT
#if CONFIG_SPIRAM_CACHE_WORKAROUND
static bool fn_in_iram(void *fn)
{
const uintptr_t fnaddr = (int)fn;
return (fnaddr >= SOC_IRAM_LOW && fnaddr < SOC_IRAM_HIGH);
}
TEST_CASE("Libc_nano in IRAM", "[newlib_nano]")
{
TEST_ASSERT_TRUE(fn_in_iram(itoa));
TEST_ASSERT_TRUE(fn_in_iram(memcmp));
TEST_ASSERT_TRUE(fn_in_iram(memcpy));
TEST_ASSERT_TRUE(fn_in_iram(memset));
TEST_ASSERT_TRUE(fn_in_iram(strcat));
TEST_ASSERT_TRUE(fn_in_iram(strcmp));
TEST_ASSERT_TRUE(fn_in_iram(strlen));
TEST_ASSERT_TRUE(fn_in_iram(longjmp));
TEST_ASSERT_TRUE(fn_in_iram(abs));
TEST_ASSERT_TRUE(fn_in_iram(div));
TEST_ASSERT_TRUE(fn_in_iram(labs));
TEST_ASSERT_TRUE(fn_in_iram(ldiv));
TEST_ASSERT_TRUE(fn_in_iram(__fpclassifyd));
TEST_ASSERT_TRUE(fn_in_iram(nanf));
TEST_ASSERT_TRUE(fn_in_iram(utoa));
TEST_ASSERT_TRUE(fn_in_iram(atoi));
TEST_ASSERT_TRUE(fn_in_iram(atol));
TEST_ASSERT_TRUE(fn_in_iram(strtol));
TEST_ASSERT_TRUE(fn_in_iram(strtoul));
TEST_ASSERT_TRUE(fn_in_iram(wcrtomb));
TEST_ASSERT_TRUE(fn_in_iram(_fwrite_r));
TEST_ASSERT_TRUE(fn_in_iram(__swbuf_r));
TEST_ASSERT_TRUE(fn_in_iram(fputwc));
TEST_ASSERT_TRUE(fn_in_iram(_wctomb_r));
TEST_ASSERT_TRUE(fn_in_iram(ungetc));
TEST_ASSERT_TRUE(fn_in_iram(fflush));
TEST_ASSERT_TRUE(fn_in_iram(asctime));
TEST_ASSERT_TRUE(fn_in_iram(asctime_r));
TEST_ASSERT_TRUE(fn_in_iram(ctime));
TEST_ASSERT_TRUE(fn_in_iram(ctime_r));
TEST_ASSERT_TRUE(fn_in_iram(localtime));
TEST_ASSERT_TRUE(fn_in_iram(gmtime));
TEST_ASSERT_TRUE(fn_in_iram(gmtime_r));
TEST_ASSERT_TRUE(fn_in_iram(strftime));
TEST_ASSERT_TRUE(fn_in_iram(mktime));
TEST_ASSERT_TRUE(fn_in_iram(_tzset_r));
TEST_ASSERT_TRUE(fn_in_iram(time));
TEST_ASSERT_TRUE(fn_in_iram(strptime));
TEST_ASSERT_TRUE(fn_in_iram(toupper));
TEST_ASSERT_TRUE(fn_in_iram(tolower));
TEST_ASSERT_TRUE(fn_in_iram(toascii));
TEST_ASSERT_TRUE(fn_in_iram(strupr));
TEST_ASSERT_TRUE(fn_in_iram(bzero));
TEST_ASSERT_TRUE(fn_in_iram(isalnum));
TEST_ASSERT_TRUE(fn_in_iram(isalpha));
TEST_ASSERT_TRUE(fn_in_iram(isascii));
TEST_ASSERT_TRUE(fn_in_iram(isblank));
TEST_ASSERT_TRUE(fn_in_iram(iscntrl));
TEST_ASSERT_TRUE(fn_in_iram(isdigit));
TEST_ASSERT_TRUE(fn_in_iram(isgraph));
TEST_ASSERT_TRUE(fn_in_iram(islower));
TEST_ASSERT_TRUE(fn_in_iram(isprint));
TEST_ASSERT_TRUE(fn_in_iram(ispunct));
TEST_ASSERT_TRUE(fn_in_iram(isspace));
TEST_ASSERT_TRUE(fn_in_iram(isupper));
TEST_ASSERT_TRUE(fn_in_iram(memccpy));
TEST_ASSERT_TRUE(fn_in_iram(memchr));
TEST_ASSERT_TRUE(fn_in_iram(memmove));
TEST_ASSERT_TRUE(fn_in_iram(memrchr));
TEST_ASSERT_TRUE(fn_in_iram(strcasecmp));
TEST_ASSERT_TRUE(fn_in_iram(strcasestr));
TEST_ASSERT_TRUE(fn_in_iram(strchr));
TEST_ASSERT_TRUE(fn_in_iram(strcoll));
TEST_ASSERT_TRUE(fn_in_iram(strcpy));
TEST_ASSERT_TRUE(fn_in_iram(strcspn));
TEST_ASSERT_TRUE(fn_in_iram(strdup));
TEST_ASSERT_TRUE(fn_in_iram(_strdup_r));
TEST_ASSERT_TRUE(fn_in_iram(strlcat));
TEST_ASSERT_TRUE(fn_in_iram(strlcpy));
TEST_ASSERT_TRUE(fn_in_iram(strlwr));
TEST_ASSERT_TRUE(fn_in_iram(strncasecmp));
TEST_ASSERT_TRUE(fn_in_iram(strncat));
TEST_ASSERT_TRUE(fn_in_iram(strncmp));
TEST_ASSERT_TRUE(fn_in_iram(strncpy));
TEST_ASSERT_TRUE(fn_in_iram(strndup));
TEST_ASSERT_TRUE(fn_in_iram(_strndup_r));
TEST_ASSERT_TRUE(fn_in_iram(strnlen));
TEST_ASSERT_TRUE(fn_in_iram(strrchr));
TEST_ASSERT_TRUE(fn_in_iram(strsep));
TEST_ASSERT_TRUE(fn_in_iram(strspn));
TEST_ASSERT_TRUE(fn_in_iram(strstr));
TEST_ASSERT_TRUE(fn_in_iram(strtok_r));
TEST_ASSERT_TRUE(fn_in_iram(strupr));
TEST_ASSERT_TRUE(fn_in_iram(srand));
TEST_ASSERT_TRUE(fn_in_iram(rand));
TEST_ASSERT_TRUE(fn_in_iram(rand_r));
TEST_ASSERT_TRUE(fn_in_iram(_getenv_r));
TEST_ASSERT_TRUE(fn_in_iram(isatty));
TEST_ASSERT_TRUE(fn_in_iram(fclose));
TEST_ASSERT_TRUE(fn_in_iram(creat));
TEST_ASSERT_TRUE(fn_in_iram(_fwalk_sglue));
TEST_ASSERT_TRUE(fn_in_iram(__sinit));
TEST_ASSERT_TRUE(fn_in_iram(raise));
TEST_ASSERT_TRUE(fn_in_iram(system));
}
#endif // SPIRAM_CACHE_WORKAROUND
TEST_CASE("test 64bit int formats", "[newlib]") TEST_CASE("test 64bit int formats", "[newlib]")
{ {
char* res = NULL; char* res = NULL;

View File

@@ -0,0 +1,16 @@
CONFIG_IDF_TARGET="esp32"
CONFIG_LIBC_NEWLIB_NANO_FORMAT=y
CONFIG_SPIRAM=y
CONFIG_SPIRAM_CACHE_WORKAROUND=y
CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMATH_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBIO_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBTIME_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBCHAR_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMEM_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBSTR_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBRAND_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBENV_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBFILE_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM=y

View File

@@ -445,6 +445,7 @@ components/esp_rom/include/esp_rom_crc.h
components/esp_rom/linux/esp_rom_crc.c components/esp_rom/linux/esp_rom_crc.c
components/esp_rom/linux/esp_rom_md5.c components/esp_rom/linux/esp_rom_md5.c
components/esp_rom/patches/esp_rom_crc.c components/esp_rom/patches/esp_rom_crc.c
components/esp_rom/patches/esp_rom_longjmp.S
components/esp_system/ubsan.c components/esp_system/ubsan.c
components/esp_wifi/src/mesh_event.c components/esp_wifi/src/mesh_event.c
components/fatfs/diskio/diskio.c components/fatfs/diskio/diskio.c

View File

@@ -1,4 +1,5 @@
libc libc
libm
sha256_coredump sha256_coredump
gcc gcc
clang_rt_builtins clang_rt_builtins