From fae64f79bb077fdff59c2e23d66ab2d73de87928 Mon Sep 17 00:00:00 2001 From: Anton Maklakov Date: Thu, 31 Oct 2019 10:15:54 +0700 Subject: [PATCH] C++: prepare RTTI support Ref. https://github.com/espressif/esp-idf/issues/1684 Also, for full RTTI support, libstdc++.a in the toolchain should be built in both with RTTI and w/o RTTI options. Multilib with -fno-rtti flag is used for that. Note that this commit does not actually enable RTTI support. The respective Kconfig option is hidden, and will be made visible when the toolchain is updated. --- CMakeLists.txt | 6 ++++++ Kconfig | 9 +++++++++ components/cxx/CMakeLists.txt | 4 ++++ make/project.mk | 8 +++++++- tools/cmake/build.cmake | 3 +-- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a0ef70d15f..2b7022c176 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,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 b6351a86c8..92b9dd72c0 100644 --- a/Kconfig +++ b/Kconfig @@ -149,6 +149,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 4e81992ad0..57e0aec7c0 100644 --- a/components/cxx/CMakeLists.txt +++ b/components/cxx/CMakeLists.txt @@ -7,3 +7,7 @@ target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxa_guard_dummy") 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 e146acc42f..b2e29ecc30 100644 --- a/make/project.mk +++ b/make/project.mk @@ -452,7 +452,6 @@ CXXFLAGS ?= EXTRA_CXXFLAGS ?= CXXFLAGS := $(strip \ -std=gnu++11 \ - -fno-rtti \ $(OPTIMIZATION_FLAGS) $(DEBUG_FLAGS) \ $(COMMON_FLAGS) \ $(COMMON_WARNING_FLAGS) \ @@ -465,6 +464,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 9285a53e1c..73533980bc 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)