diff --git a/CMakeLists.txt b/CMakeLists.txt index 4dae14c8cd..55c9109f90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,12 @@ else() list(APPEND cxx_compile_options "-fno-exceptions") endif() +if(CONFIG_COMPILER_CXX_RTTI) + list(APPEND cxx_compile_options "-frtti") +else() + list(APPEND cxx_compile_options "-fno-rtti") +endif() + if(CONFIG_COMPILER_DISABLE_GCC8_WARNINGS) list(APPEND compile_options "-Wno-parentheses" "-Wno-sizeof-pointer-memaccess" diff --git a/Kconfig b/Kconfig index c0856669f9..c93e3eb63d 100644 --- a/Kconfig +++ b/Kconfig @@ -244,6 +244,15 @@ mainmenu "Espressif IoT Development Framework Configuration" Size (in bytes) of the emergency memory pool for C++ exceptions. This pool will be used to allocate memory for thrown exceptions when there is not enough memory on the heap. + config COMPILER_CXX_RTTI + # Invisible option, until the toolchain with RTTI support is released. + # Use prompt "Enable C++ run-time type info (RTTI)" when updating. + bool + help + Enabling this option compiles all C++ files with RTTI support enabled. + This increases binary size (typically by tens of kB) but allows using + dynamic_cast conversion and typeid operator. + choice COMPILER_STACK_CHECK_MODE prompt "Stack smashing protection mode" default COMPILER_STACK_CHECK_MODE_NONE diff --git a/components/cxx/CMakeLists.txt b/components/cxx/CMakeLists.txt index ff2d0e4389..852c4c884d 100644 --- a/components/cxx/CMakeLists.txt +++ b/components/cxx/CMakeLists.txt @@ -15,3 +15,7 @@ target_link_libraries(${COMPONENT_LIB} PUBLIC stdcpp_pthread) if(NOT CONFIG_COMPILER_CXX_EXCEPTIONS) target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxx_fatal_exception") endif() + +if(NOT CONFIG_COMPILER_CXX_RTTI) + target_link_libraries(${COMPONENT_LIB} PUBLIC -fno-rtti) +endif() diff --git a/make/project.mk b/make/project.mk index a8ec59f405..93ed7a38fd 100644 --- a/make/project.mk +++ b/make/project.mk @@ -468,7 +468,6 @@ CXXFLAGS ?= EXTRA_CXXFLAGS ?= CXXFLAGS := $(strip \ -std=gnu++11 \ - -fno-rtti \ $(OPTIMIZATION_FLAGS) $(DEBUG_FLAGS) \ $(COMMON_FLAGS) \ $(COMMON_WARNING_FLAGS) \ @@ -481,6 +480,13 @@ else CXXFLAGS += -fno-exceptions endif +ifdef CONFIG_COMPILER_CXX_RTTI +CXXFLAGS += -frtti +else +CXXFLAGS += -fno-rtti +LDFLAGS += -fno-rtti +endif + ARFLAGS := cru export CFLAGS CPPFLAGS CXXFLAGS ARFLAGS diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index f495ed8fa9..c3bbdeafff 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -114,8 +114,7 @@ function(__build_set_default_build_specifications) list(APPEND c_compile_options "-std=gnu99" "-Wno-old-style-declaration") - list(APPEND cxx_compile_options "-std=gnu++11" - "-fno-rtti") + list(APPEND cxx_compile_options "-std=gnu++11") idf_build_set_property(COMPILE_DEFINITIONS "${compile_definitions}" APPEND) idf_build_set_property(COMPILE_OPTIONS "${compile_options}" APPEND)