Skip to content
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,14 @@ add_definitions(-D__NuttX__)

add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-D__ASSEMBLY__>)

if(CONFIG_LIBCXX)
if(CONFIG_ARCH_ARM)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-mlong-calls>)
elseif(CONFIG_ARCH_RISCV)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-mcmodel=medany>)
endif()
endif()

# Setup main nuttx target ####################################################

add_executable(nuttx)
Expand Down
5 changes: 5 additions & 0 deletions arch/arm/src/cmake/gcc.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,11 @@ if(NOT CONFIG_CXX_RTTI)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
endif()

# Add -mlong-calls for C++ when using libcxx to fix relocation issues
if(CONFIG_LIBCXX)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-mlong-calls>)
Comment thread
Barto22 marked this conversation as resolved.
Outdated
endif()

set(CMAKE_EXE_LINKER_FLAGS_INIT "--specs=nosys.specs")

set(PREPROCESS ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} -E -P -x c)
6 changes: 6 additions & 0 deletions arch/arm/src/common/Toolchain.defs
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,12 @@ endif
ifneq ($(CONFIG_CXX_RTTI),y)
ARCHCXXFLAGS += -fno-rtti
endif

Comment thread
Barto22 marked this conversation as resolved.
Outdated
# Add -mlong-calls for C++ when using libcxx to fix relocation issues
ifeq ($(CONFIG_LIBCXX),y)
ARCHCXXFLAGS += -mlong-calls
endif

ifeq ($(CONFIG_ARM_TOOLCHAIN_GHS),y)
ARCHOPTIMIZATION += --no_commons
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ CONFIG_HAVE_CXX=y
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBCXX=y
CONFIG_LIBCXXABI=y
CONFIG_LIBC_FLOATINGPOINT=y
CONFIG_LIBC_LOCALE=y
CONFIG_LIBC_LOCALTIME=y
Expand All @@ -49,3 +50,6 @@ CONFIG_TLS_TASK_NELEM=8
CONFIG_USART2_RXBUFSIZE=128
CONFIG_USART2_SERIAL_CONSOLE=y
CONFIG_USART2_TXBUFSIZE=128
CONFIG_CXX_EXCEPTION=y
CONFIG_CXX_RTTI=y
CONFIG_TESTING_CXXTEST=y
2 changes: 1 addition & 1 deletion boards/risc-v/esp32c3/common/scripts/esp32c3_sections.ld
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ SECTIONS
*(.fini)
*(.gnu.version)

. += 16;
. = ALIGN(4);

_text_end = ABSOLUTE(.);
_instruction_reserved_end = ABSOLUTE(.); /* This is a symbol marking the flash.text end, this can be used for mmu driver to maintain virtual address */
Expand Down
59 changes: 59 additions & 0 deletions boards/risc-v/esp32c3/esp32c3-devkit/configs/testlibcxx/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="esp32c3-devkit"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32C3_DEVKIT=y
CONFIG_ARCH_CHIP="esp32c3"
CONFIG_ARCH_CHIP_ESP32C3=y
CONFIG_ARCH_INTERRUPTSTACK=1536
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARDCTL_RESET=y
CONFIG_BOARD_LOOPSPERMSEC=15000
CONFIG_BUILTIN=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_NSH_STRERROR=y
CONFIG_PREALLOC_TIMERS=0
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_BACKTRACE=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=29
CONFIG_START_MONTH=11
CONFIG_START_YEAR=2019
CONFIG_SYSTEM_DUMPSTACK=y
CONFIG_SYSTEM_NSH=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_UART0_SERIAL_CONSOLE=y
CONFIG_BUILTIN=y
CONFIG_CXX_LOCALIZATION=y
CONFIG_CXX_WCHAR=y
CONFIG_EXAMPLES_HELLOXX=y
CONFIG_HAVE_CXX=y
CONFIG_LIBCXX=y
CONFIG_LIBCXXABI=y
CONFIG_CXX_EXCEPTION=y
CONFIG_CXX_RTTI=y
CONFIG_TESTING_CXXTEST=y
CONFIG_LIBC_LOCALE=y
CONFIG_TLS_NELEM=16
CONFIG_TLS_TASK_NELEM=8
CONFIG_DEFAULT_THREAD_STACKSIZE=4096
3 changes: 2 additions & 1 deletion boards/xtensa/esp32/common/scripts/esp32_sections.ld
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,6 @@ SECTIONS
__init_array_start = ABSOLUTE(.);
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors SORT(.ctors.*)))
__init_array_end = ABSOLUTE(.);
_einit = ABSOLUTE(.);

/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */

Expand All @@ -635,6 +634,8 @@ SECTIONS
KEEP (*(SORT_BY_INIT_PRIORITY(.esp_system_init_fn.*)))
_esp_system_init_fn_array_end = ABSOLUTE(.);

_einit = ABSOLUTE(.);

/* TLS data. */

. = ALIGN(4);
Expand Down
3 changes: 2 additions & 1 deletion boards/xtensa/esp32s2/common/scripts/esp32s2_sections.ld
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,6 @@ SECTIONS
__init_array_start = ABSOLUTE(.);
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors SORT(.ctors.*)))
__init_array_end = ABSOLUTE(.);
_einit = ABSOLUTE(.);

/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */

Expand All @@ -545,6 +544,8 @@ SECTIONS
KEEP (*(SORT_BY_INIT_PRIORITY(.esp_system_init_fn.*)))
_esp_system_init_fn_array_end = ABSOLUTE(.);

_einit = ABSOLUTE(.);

/* TLS data. */

. = ALIGN(4);
Expand Down
3 changes: 2 additions & 1 deletion boards/xtensa/esp32s3/common/scripts/esp32s3_sections.ld
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,6 @@ SECTIONS
__init_array_start = ABSOLUTE(.);
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors SORT(.ctors.*)))
__init_array_end = ABSOLUTE(.);
_einit = ABSOLUTE(.);

/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */

Expand All @@ -709,6 +708,8 @@ SECTIONS
KEEP (*(SORT_BY_INIT_PRIORITY(.esp_system_init_fn.*)))
_esp_system_init_fn_array_end = ABSOLUTE(.);

_einit = ABSOLUTE(.);

/* TLS data. */

. = ALIGN(4);
Expand Down
94 changes: 91 additions & 3 deletions libs/libc/misc/lib_cxx_initialize.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
* Included Files
****************************************************************************/

#include <nuttx/config.h>
#include <nuttx/arch.h>
#include <nuttx/config.h>

#include <assert.h>
#include <debug.h>
Expand All @@ -42,6 +42,35 @@
extern void macho_call_saved_init_funcs(void);
#endif

/* ESP32 platforms have linker scripts that place non-constructor data
* (soc_reserved_memory_region, esp_system_init_fn_array) between _sinit
* and _einit. This requires explicit handling to avoid calling invalid
* function pointers.
*
* ESP32 RISC-V chips: Have __init_priority_array and __init_array
* ESP32 Xtensa chips: Have only __init_array (using .ctors)
*/

#if defined(CONFIG_ARCH_CHIP_ESP32) || defined(CONFIG_ARCH_CHIP_ESP32S2) || \
defined(CONFIG_ARCH_CHIP_ESP32S3)

/* Xtensa ESP32 chips: Only __init_array exists */

extern initializer_t __init_array_start[];
extern initializer_t __init_array_end[];
#define USE_ESP32_XTENSA_INIT_ARRAYS 1
#elif defined(CONFIG_ARCH_CHIP_ESP32C3) || \
defined(CONFIG_ARCH_CHIP_ESP32C6) || defined(CONFIG_ARCH_CHIP_ESP32H2)

/* RISC-V ESP32 chips: Both __init_priority_array and __init_array exist */

extern initializer_t __init_priority_array_start[];
extern initializer_t __init_priority_array_end[];
extern initializer_t __init_array_start[];
extern initializer_t __init_array_end[];
#define USE_ESP32_RISCV_INIT_ARRAYS 1
#endif

/****************************************************************************
* Public Functions
****************************************************************************/
Expand Down Expand Up @@ -71,6 +100,65 @@ void lib_cxx_initialize(void)
{
#if defined(CONFIG_ARCH_SIM) && defined(CONFIG_HOST_MACOS)
macho_call_saved_init_funcs();
#elif defined(USE_ESP32_XTENSA_INIT_ARRAYS)
Comment thread
xiaoxiang781216 marked this conversation as resolved.
Outdated
initializer_t *initp;

/* ESP32 Xtensa platforms: Only iterate __init_array, skipping
* non-constructor data after it.
*/

sinfo("__init_array: %p to %p\n", __init_array_start,
__init_array_end);

for (initp = __init_array_start; initp < __init_array_end; initp++)
{
initializer_t initializer = *initp;
sinfo("initp: %p initializer: %p\n", initp, initializer);

if (initializer)
{
sinfo("Calling %p\n", initializer);
initializer();
}
}
#elif defined(USE_ESP32_RISCV_INIT_ARRAYS)
initializer_t *initp;

/* ESP32 RISC-V platforms: Iterate through priority array first,
* then regular array, skipping the non-constructor data sections
* in between.
*/

sinfo("__init_priority_array: %p to %p\n",
__init_priority_array_start, __init_priority_array_end);

for (initp = __init_priority_array_start;
initp < __init_priority_array_end; initp++)
{
initializer_t initializer = *initp;
sinfo("priority initp: %p initializer: %p\n", initp, initializer);

if (initializer)
{
sinfo("Calling %p\n", initializer);
initializer();
}
}

sinfo("__init_array: %p to %p\n", __init_array_start,
__init_array_end);

for (initp = __init_array_start; initp < __init_array_end; initp++)
{
initializer_t initializer = *initp;
sinfo("initp: %p initializer: %p\n", initp, initializer);

if (initializer)
{
sinfo("Calling %p\n", initializer);
initializer();
}
}
#else
initializer_t *initp;

Expand All @@ -83,8 +171,8 @@ void lib_cxx_initialize(void)
initializer_t initializer = *initp;
sinfo("initp: %p initializer: %p\n", initp, initializer);

/* Make sure that the address is non-NULL. Some toolchains may put
* NULL values or counts in the initialization table.
/* Make sure that the address is non-NULL. Some toolchains
* may put NULL values or counts in the initialization table.
*/

if (initializer)
Expand Down
8 changes: 4 additions & 4 deletions libs/libxx/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -100,15 +100,15 @@ config LIBCXXABI_VERSION
string "Select libcxxabi version"
depends on LIBCXXABI
default LIBCXX_VERSION if LIBCXX
default "17.0.6" if !LIBCXX
default "21.1.8" if !LIBCXX

config CXX_STANDARD
string "Language standard"
default "gnu++20" if LIBCXX
default "gnu++23" if LIBCXX
default "gnu++17" if !LIBCXX
---help---
Possible values:
gnu++98/c++98, gnu++11/c++11, gnu++14/c++14, gnu++17/c++17 and gnu++20/c++20
gnu++98/c++98, gnu++11/c++11, gnu++14/c++14, gnu++17/c++17, gnu++20/c++20 and gnu++23/c++23

config CXX_EXCEPTION
bool "Enable Exception Support"
Expand All @@ -134,6 +134,6 @@ endif
config LIBCXX_VERSION
string "Select libcxx version"
depends on LIBCXX
default "17.0.6"
default "21.1.8"

endif
Loading
Loading