diff --git a/config/comp_libs/picolibc.in b/config/comp_libs/picolibc.in index 99f0e45203..a4729ce949 100644 --- a/config/comp_libs/picolibc.in +++ b/config/comp_libs/picolibc.in @@ -20,6 +20,16 @@ config LIBC_PICOLIBC_GCC_LIBSTDCXX picolibc. This version is linked when "--specs=picolibcpp.specs" is specified. +config LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT + bool + prompt "Compile libstdc++ picolibc variant with exceptions disabled" + default y + depends on CC_LANG_CXX + help + This option compiles an additional target libstdc++ for use with + picolibc. This version is linked when "--specs=picolibcpp_noexcept.specs" + is specified. + config LIBC_PICOLIBC_CXA_ATEXIT def_bool y select LIBC_PROVIDES_CXA_ATEXIT diff --git a/samples/arm-picolibc-eabi/crosstool.config b/samples/arm-picolibc-eabi/crosstool.config index 640f3071d1..7f30343cbe 100644 --- a/samples/arm-picolibc-eabi/crosstool.config +++ b/samples/arm-picolibc-eabi/crosstool.config @@ -9,3 +9,4 @@ CT_CC_GCC_MULTILIB_LIST="rmprofile" CT_CC_GCC_CONFIG_TLS=y CT_CC_LANG_CXX=y CT_COMP_LIBS_PICOLIBC=y +CT_LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT=y diff --git a/scripts/build/companion_libs/340-picolibc.sh b/scripts/build/companion_libs/340-picolibc.sh index af8db00042..168245786c 100644 --- a/scripts/build/companion_libs/340-picolibc.sh +++ b/scripts/build/companion_libs/340-picolibc.sh @@ -27,8 +27,10 @@ do_picolibc_extract() { # flag for libstdc++ "picolibc" variant. do_cc_libstdcxx_picolibc() { + local variant="$1" local -a final_opts local final_backend + local suffix= if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX}" = "y" ]; then final_opts+=( "host=${CT_HOST}" ) @@ -46,6 +48,10 @@ do_cc_libstdcxx_picolibc() if [ "${CT_LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then final_opts+=( "enable_optspace=yes" ) fi + if [ "${variant}" = "noexcept" ]; then + final_opts+=( "extra_cxxflags_for_target=-fno-exceptions" ) + suffix="-noexcept" + fi if [ "${CT_BARE_METAL}" = "y" ]; then final_opts+=( "mode=baremetal" ) @@ -61,7 +67,7 @@ do_cc_libstdcxx_picolibc() fi CT_DoStep INFO "Installing libstdc++ picolibc" - CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc${suffix}" "${final_backend}" "${final_opts[@]}" CT_Popd @@ -168,6 +174,12 @@ EOF CT_Popd CT_EndStep + if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT}" = "y" ]; then + do_cc_libstdcxx_picolibc noexcept + picolibc_add_suffix_to_lib "${CT_PREFIX_DIR}/picolibc/${CT_TARGET}/lib" "libstdc++.a" "noexcept" + picolibc_add_suffix_to_lib "${CT_PREFIX_DIR}/picolibc/${CT_TARGET}/lib" "libsupc++.a" "noexcept" + fi + do_cc_libstdcxx_picolibc if [ "${CT_STRIP_TARGET_TOOLCHAIN_LIBRARIES}" = "y" ]; then @@ -185,4 +197,17 @@ EOF fi } +picolibc_add_suffix_to_lib() { + local lib_dir="${1}" + local lib_name="${2}" + local suffix="${3}" + local filename extension + + find "${lib_dir}" -name "${lib_name}" | while read target_lib; do + filename=${target_lib%.*} + extension=${target_lib##*.} + CT_DoExecLog ALL mv "${target_lib}" "${filename}_${suffix}.${extension}" + done +} + fi