Просмотр исходного кода

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.
Anton Maklakov 6 лет назад
Родитель
Сommit
fae64f79bb
5 измененных файлов с 27 добавлено и 3 удалено
  1. 6 0
      CMakeLists.txt
  2. 9 0
      Kconfig
  3. 4 0
      components/cxx/CMakeLists.txt
  4. 7 1
      make/project.mk
  5. 1 2
      tools/cmake/build.cmake

+ 6 - 0
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"

+ 9 - 0
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

+ 4 - 0
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()

+ 7 - 1
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

+ 1 - 2
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)